Print

Print


Author: [log in to unmask]
Date: Tue Apr 14 19:10:34 2015
New Revision: 2705

Log:
Add preliminary version of utility for tagging conditions records (needs more testing).

Added:
    java/trunk/conditions/src/main/java/org/hps/conditions/cli/TagCommand.java
Modified:
    java/trunk/conditions/src/main/java/org/hps/conditions/cli/CommandLineTool.java

Modified: java/trunk/conditions/src/main/java/org/hps/conditions/cli/CommandLineTool.java
 =============================================================================
--- java/trunk/conditions/src/main/java/org/hps/conditions/cli/CommandLineTool.java	(original)
+++ java/trunk/conditions/src/main/java/org/hps/conditions/cli/CommandLineTool.java	Tue Apr 14 19:10:34 2015
@@ -32,202 +32,12 @@
     /**
      * Setup logging.
      */
-    private static final Logger LOGGER =
-            LogUtil.create(CommandLineTool.class.getSimpleName(), new DefaultLogFormatter(), Level.WARNING);
-
-    /**
-     * The top level options (does not include sub-command options).
-     */
-    private Options options = new Options();
-
-    /**
-     * The map of named command handlers.
-     */
-    private Map<String, AbstractCommand> commands = new HashMap<String, AbstractCommand>();
-
-    /**
-     * The options parser.
-     */
-    private PosixParser parser = new PosixParser();
-
-    /**
-     * The database conditions system manager.
-     */
-    private DatabaseConditionsManager conditionsManager;
-
-    /**
-     * The verbose setting.
-     */
-    private boolean verbose = false;
-
-    /**
-     * The main method for the class.
-     *
-     * @param arguments The command line arguments.
-     */
-    public static void main(final String[] arguments) {
-        CommandLineTool.create().run(arguments);
-    }
-
-    /**
-     * Run the command line tool, parsing the command line and sending arguments to sub-command handlers.
-     *
-     * @param arguments the command line arguments passed directly from {@link #main(String[])}
-     */
-    private void run(final String[] arguments) {
-        try {
-            if (arguments.length == 0) {
-                printUsage();
-                exit(0);
-            }
-
-            CommandLine commandLine = null;
-            try {
-                commandLine = parser.parse(options, arguments, true);
-            } catch (ParseException e) {
-                LOGGER.log(Level.SEVERE, "error parsing the options", e);
-                printUsage();
-                exit(1);
-            }
-
-            if (commandLine.hasOption("h") || commandLine.getArgs().length == 0) {
-                printUsage();
-                exit(0);
-            }
-
-            // Set verbosity.
-            if (commandLine.hasOption("v")) {
-                LOGGER.setLevel(Level.ALL);
-                LOGGER.getHandlers()[0].setLevel(Level.ALL);
-                verbose = true;
-                LOGGER.config("verbose mode enabled");
-            }
-
-            // Setup conditions manager from command line options.
-            setupConditionsManager(commandLine);
-
-            // Get the sub-command to use.
-            final String commandName = commandLine.getArgs()[0];
-            final AbstractCommand command = commands.get(commandName);
-            if (command == null) {
-                throw new IllegalArgumentException("Unknown command " + commandName);
-            }
-
-            // Copy remaining arguments for sub-command.
-            final String[] commandArguments = new String[commandLine.getArgs().length - 1];
-            System.arraycopy(commandLine.getArgs(), 1, commandArguments, 0, commandArguments.length);
-
-            // Excecute the sub-command.
-            command.setVerbose(verbose);
-            command.execute(commandArguments);
-        } catch (Exception e) {
-            e.printStackTrace();
-            System.exit(1);
-        } finally {
-            conditionsManager.closeConnection();
-        }
-    }
-
-    /**
-     * Setup the conditions system based on command line arguments.
-     *
-     * @param commandLine the parsed command line arguments
-     */
-    private void setupConditionsManager(final CommandLine commandLine) {
-
-        LOGGER.info("setting up conditions manager");
-
-        // Create new manager.
-        conditionsManager = DatabaseConditionsManager.getInstance();
-
-        // Set log level.
-        conditionsManager.setLogLevel(LOGGER.getLevel());
-
-        // Connection properties.
-        if (commandLine.hasOption("p")) {
-            final File connectionPropertiesFile = new File(commandLine.getOptionValue("p"));
-            conditionsManager.setConnectionProperties(connectionPropertiesFile);
-            LOGGER.config("connection properties -p " + connectionPropertiesFile);
-        }
-
-        // XML config.
-        if (commandLine.hasOption("x")) {
-            final File xmlConfigFile = new File(commandLine.getOptionValue("x"));
-            conditionsManager.setXmlConfig(xmlConfigFile);
-            LOGGER.config("XML config -x " + xmlConfigFile);
-        }
-
-        // If there is a run number or detector number then attempt to initialize the conditions system.
-        if (commandLine.hasOption("r") || commandLine.hasOption("d")) {
-
-            LOGGER.config("detector name or run number supplied so manager will be initialized");
-
-            // Set detector name.
-            String detectorName = null;
-            if (commandLine.hasOption("d")) {
-                detectorName = commandLine.getOptionValue("d");
-                LOGGER.config("detector -d " + detectorName);
-            } else {
-                detectorName = "HPS-ECalCommissioning-v2";
-                LOGGER.config("default detector " + detectorName + " is being used");
-            }
-
-            // Get run number.
-            Integer run = null;
-            if (commandLine.hasOption("r")) {
-                run = Integer.parseInt(commandLine.getOptionValue("r"));
-                LOGGER.config("run -r " + run);
-            } else {
-                run = 0;
-                LOGGER.config("default run number " + run + " is being used");
-            }
-
-            // Setup the conditions manager with user detector name and run number.
-            try {
-                LOGGER.config("initializing conditions manager with detector " + detectorName + " and run " + run);
-                DatabaseConditionsManager.getInstance().setDetector(detectorName, run);
-                LOGGER.config("conditions manager initialized successfully");
-                LOGGER.getHandlers()[0].flush();
-            } catch (ConditionsNotFoundException e) {
-                throw new RuntimeException(e);
-            }
-        }
-    }
-
-    /**
-     * Print the usage statement for this tool to the console.
-     */
-    final void printUsage() {
-        final HelpFormatter help = new HelpFormatter();
-        final StringBuffer s = new StringBuffer();
-        for (String command : commands.keySet()) {
-            s.append(command + '\n');
-        }
-        help.printHelp("CommandLineTool", "Commands:\n" + s.toString(), options, "");
-    }
-
-    /**
-     * Exit with the given status.
-     *
-     * @param status the exit status
-     */
-    private void exit(final int status) {
-        System.exit(status);
-    }
-
-    /**
-     * Register a sub-command handler.
-     * @param command the sub-command handler
-     */
-    private void registerCommand(final AbstractCommand command) {
-        if (commands.containsKey(command.getName())) {
-            throw new IllegalArgumentException("There is already a command called " + command.getName());
-        }
-        commands.put(command.getName(), command);
-    }
+    private static final Logger LOGGER = LogUtil.create(CommandLineTool.class.getSimpleName(),
+            new DefaultLogFormatter(), Level.WARNING);
 
     /**
      * Create a basic instance of this class.
+     * 
      * @return the instance of this class
      */
     private static CommandLineTool create() {
@@ -241,6 +51,199 @@
         cli.registerCommand(new LoadCommand());
         cli.registerCommand(new PrintCommand());
         cli.registerCommand(new AddCommand());
+        cli.registerCommand(new TagCommand());
         return cli;
     }
+
+    /**
+     * The main method for the class.
+     *
+     * @param arguments The command line arguments.
+     */
+    public static void main(final String[] arguments) {
+        CommandLineTool.create().run(arguments);
+    }
+
+    /**
+     * The map of named command handlers.
+     */
+    private final Map<String, AbstractCommand> commands = new HashMap<String, AbstractCommand>();
+
+    /**
+     * The database conditions system manager.
+     */
+    private DatabaseConditionsManager conditionsManager;
+
+    /**
+     * The top level options (does not include sub-command options).
+     */
+    private final Options options = new Options();
+
+    /**
+     * The options parser.
+     */
+    private final PosixParser parser = new PosixParser();
+
+    /**
+     * The verbose setting.
+     */
+    private boolean verbose = false;
+
+    /**
+     * Exit with the given status.
+     *
+     * @param status the exit status
+     */
+    private void exit(final int status) {
+        System.exit(status);
+    }
+
+    /**
+     * Print the usage statement for this tool to the console.
+     */
+    final void printUsage() {
+        final HelpFormatter help = new HelpFormatter();
+        final StringBuffer s = new StringBuffer();
+        for (final String command : this.commands.keySet()) {
+            s.append(command + '\n');
+        }
+        help.printHelp("CommandLineTool", "Commands:\n" + s.toString(), this.options, "");
+    }
+
+    /**
+     * Register a sub-command handler.
+     * 
+     * @param command the sub-command handler
+     */
+    private void registerCommand(final AbstractCommand command) {
+        if (this.commands.containsKey(command.getName())) {
+            throw new IllegalArgumentException("There is already a command called " + command.getName());
+        }
+        this.commands.put(command.getName(), command);
+    }
+
+    /**
+     * Run the command line tool, parsing the command line and sending arguments to sub-command handlers.
+     *
+     * @param arguments the command line arguments passed directly from {@link #main(String[])}
+     */
+    private void run(final String[] arguments) {
+        try {
+            if (arguments.length == 0) {
+                printUsage();
+                exit(0);
+            }
+
+            CommandLine commandLine = null;
+            try {
+                commandLine = this.parser.parse(this.options, arguments, true);
+            } catch (final ParseException e) {
+                LOGGER.log(Level.SEVERE, "error parsing the options", e);
+                printUsage();
+                exit(1);
+            }
+
+            if (commandLine.hasOption("h") || commandLine.getArgs().length == 0) {
+                printUsage();
+                exit(0);
+            }
+
+            // Set verbosity.
+            if (commandLine.hasOption("v")) {
+                LOGGER.setLevel(Level.ALL);
+                LOGGER.getHandlers()[0].setLevel(Level.ALL);
+                this.verbose = true;
+                LOGGER.config("verbose mode enabled");
+            }
+
+            // Setup conditions manager from command line options.
+            setupConditionsManager(commandLine);
+
+            // Get the sub-command to use.
+            final String commandName = commandLine.getArgs()[0];
+            final AbstractCommand command = this.commands.get(commandName);
+            if (command == null) {
+                throw new IllegalArgumentException("Unknown command " + commandName);
+            }
+
+            // Copy remaining arguments for sub-command.
+            final String[] commandArguments = new String[commandLine.getArgs().length - 1];
+            System.arraycopy(commandLine.getArgs(), 1, commandArguments, 0, commandArguments.length);
+
+            // Excecute the sub-command.
+            command.setVerbose(this.verbose);
+            command.execute(commandArguments);
+        } catch (final Exception e) {
+            e.printStackTrace();
+            System.exit(1);
+        } finally {
+            this.conditionsManager.closeConnection();
+        }
+    }
+
+    /**
+     * Setup the conditions system based on command line arguments.
+     *
+     * @param commandLine the parsed command line arguments
+     */
+    private void setupConditionsManager(final CommandLine commandLine) {
+
+        LOGGER.info("setting up conditions manager");
+
+        // Create new manager.
+        this.conditionsManager = DatabaseConditionsManager.getInstance();
+
+        // Set log level.
+        this.conditionsManager.setLogLevel(LOGGER.getLevel());
+
+        // Connection properties.
+        if (commandLine.hasOption("p")) {
+            final File connectionPropertiesFile = new File(commandLine.getOptionValue("p"));
+            this.conditionsManager.setConnectionProperties(connectionPropertiesFile);
+            LOGGER.config("connection properties -p " + connectionPropertiesFile);
+        }
+
+        // XML config.
+        if (commandLine.hasOption("x")) {
+            final File xmlConfigFile = new File(commandLine.getOptionValue("x"));
+            this.conditionsManager.setXmlConfig(xmlConfigFile);
+            LOGGER.config("XML config -x " + xmlConfigFile);
+        }
+
+        // If there is a run number or detector number then attempt to initialize the conditions system.
+        if (commandLine.hasOption("r") || commandLine.hasOption("d")) {
+
+            LOGGER.config("detector name or run number supplied so manager will be initialized");
+
+            // Set detector name.
+            String detectorName = null;
+            if (commandLine.hasOption("d")) {
+                detectorName = commandLine.getOptionValue("d");
+                LOGGER.config("detector -d " + detectorName);
+            } else {
+                detectorName = "HPS-ECalCommissioning-v2";
+                LOGGER.config("default detector " + detectorName + " is being used");
+            }
+
+            // Get run number.
+            Integer run = null;
+            if (commandLine.hasOption("r")) {
+                run = Integer.parseInt(commandLine.getOptionValue("r"));
+                LOGGER.config("run -r " + run);
+            } else {
+                run = 0;
+                LOGGER.config("default run number " + run + " is being used");
+            }
+
+            // Setup the conditions manager with user detector name and run number.
+            try {
+                LOGGER.config("initializing conditions manager with detector " + detectorName + " and run " + run);
+                DatabaseConditionsManager.getInstance().setDetector(detectorName, run);
+                LOGGER.config("conditions manager initialized successfully");
+                LOGGER.getHandlers()[0].flush();
+            } catch (final ConditionsNotFoundException e) {
+                throw new RuntimeException(e);
+            }
+        }
+    }
 }

Added: java/trunk/conditions/src/main/java/org/hps/conditions/cli/TagCommand.java
 =============================================================================
--- java/trunk/conditions/src/main/java/org/hps/conditions/cli/TagCommand.java	(added)
+++ java/trunk/conditions/src/main/java/org/hps/conditions/cli/TagCommand.java	Tue Apr 14 19:10:34 2015
@@ -0,0 +1,161 @@
+package org.hps.conditions.cli;
+
+import java.sql.SQLException;
+import java.util.HashSet;
+import java.util.LinkedHashSet;
+import java.util.Set;
+import java.util.logging.Level;
+
+import org.apache.commons.cli.CommandLine;
+import org.apache.commons.cli.Option;
+import org.apache.commons.cli.Options;
+import org.hps.conditions.api.ConditionsObjectCollection;
+import org.hps.conditions.api.ConditionsObjectException;
+import org.hps.conditions.api.ConditionsRecord;
+import org.hps.conditions.api.ConditionsRecord.ConditionsRecordCollection;
+import org.hps.conditions.database.DatabaseConditionsManager;
+import org.hps.conditions.database.TableMetaData;
+import org.lcsim.conditions.ConditionsManager.ConditionsNotFoundException;
+
+/**
+ * Create a conditions system tag.
+ *
+ * @author <a href="mailto:[log in to unmask]">Jeremy McCormick</a>
+ */
+public class TagCommand extends AbstractCommand {
+
+    /**
+     * The default detector name (dummy detector).
+     */
+    private static final String DETECTOR_NAME = "HPS-dummy-detector";
+
+    /**
+     * Defines command options.
+     */
+    private static Options OPTIONS = new Options();
+
+    /**
+     * Define command options.
+     */
+    static {
+        OPTIONS.addOption(new Option("h", false, "Show help for tag command"));
+        OPTIONS.addOption(new Option("r", true, "List of run numbers to scan (at least one must be provided)"));
+        OPTIONS.getOption("r").setArgs(Option.UNLIMITED_VALUES);
+        OPTIONS.getOption("r").setRequired(true);
+        OPTIONS.addOption(new Option("t", true, "The new conditions tag"));
+        OPTIONS.getOption("t").setRequired(true);
+        OPTIONS.addOption(new Option("X", true, "Actually make the new tag in the database (dry run is default)"));
+    }
+
+    /**
+     * Class constructor.
+     */
+    TagCommand() {
+        super("tag", "Tag a set of collections by copying their conditions records", OPTIONS);
+    }
+
+    /**
+     * Execute the tag command.
+     */
+    @Override
+    void execute(final String[] arguments) {
+
+        final CommandLine commandLine = parse(arguments);
+
+        final Set<Integer> runNumbers = new LinkedHashSet<Integer>();
+        for (final String value : commandLine.getOptionValues("r")) {
+            runNumbers.add(Integer.parseInt(value));
+        }
+        if (runNumbers.size() == 0) {
+            throw new RuntimeException("At least one run number must be provided with the -r switch.");
+        }
+
+        final String newTag;
+        if (commandLine.hasOption("t")) {
+            newTag = commandLine.getOptionValue("t");
+        } else {
+            throw new RuntimeException("Missing required -t argument with the tag name.");
+        }
+
+        boolean makeTag = false;
+        if (commandLine.hasOption("X")) {
+            makeTag = true;
+        }
+
+        final ConditionsRecordCollection tagRecords = new ConditionsRecordCollection();
+        final Set<Integer> addedIds = new HashSet<Integer>();
+
+        final DatabaseConditionsManager manager = DatabaseConditionsManager.getInstance();
+        manager.setXmlConfig("/org/hps/conditions/config/conditions_database_no_svt.xml");
+        manager.setLogLevel(Level.ALL);
+
+        // DEBUG: Hard-coded to development connection for now.
+        manager.setConnectionResource("/org/hps/conditions/config/jlab_dev_connection.prop");
+
+        // Scan through all the runs between the start and end run, inclusive.
+        for (final Integer run : runNumbers) {
+            try {
+                // Setup the conditions manager with the run number.
+                manager.setDetector(TagCommand.DETECTOR_NAME, run);
+            } catch (final ConditionsNotFoundException e) {
+                throw new RuntimeException(e);
+            }
+
+            // The records from this run.
+            final ConditionsRecordCollection records = manager.getConditionsRecords();
+
+            // The unique conditions keys from this run.
+            final Set<String> keys = records.getConditionsKeys();
+
+            // Scan through all the unique keys.
+            for (final String key : keys) {
+
+                // Get the table meta data for the key.
+                final TableMetaData tableMetaData = manager.findTableMetaData(key);
+
+                // Get the default collection for this key in the run.
+                final ConditionsObjectCollection<?> collection = manager.getCachedConditions(
+                        tableMetaData.getCollectionClass(), tableMetaData.getTableName()).getCachedData();
+
+                // Get the ConditionsRecord from the collection.
+                final ConditionsRecord record = collection.getConditionsRecord();
+
+                // Is this record already part of the new tag?
+                if (!addedIds.contains(record.getRowId())) {
+                    // Create a new record copied from the old one.
+                    final ConditionsRecord newRecord = new ConditionsRecord(record);
+
+                    // Set the tag value.
+                    newRecord.setFieldValue("tag", newTag);
+
+                    // Add the record to the tag.
+                    tagRecords.add(newRecord);
+
+                    // Flag the record's ID as used so it is only added once.
+                    addedIds.add(record.getRowId());
+                }
+            }
+        }
+
+        // Print out all the records that were found.
+        System.out.println("found ConditionsRecords for tag " + newTag + " ...");
+        for (final ConditionsRecord record : tagRecords) {
+            System.out.println(record.toString());
+        }
+
+        // TODO: Could have command line "Y/N" confirmation here to apply the tag.
+
+        // A tag will only be made if the -X was present in the command line arguments.
+        if (makeTag) {
+            try {
+                tagRecords.insert();
+            } catch (ConditionsObjectException | SQLException e) {
+                throw new RuntimeException(e);
+            }
+        } else {
+            System.out.println("tag was NOT applied (use -X to do this)");
+        }
+
+        System.out.println("DONE!");
+    }
+}