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!");
+ }
+}
|