Print

Print


Author: [log in to unmask]
Date: Mon Apr 27 15:58:36 2015
New Revision: 2831

Log:
Add run-summary command to conditions command line tool for printing collection info for a run.

Added:
    java/branches/HPSJAVA-488/conditions/src/main/java/org/hps/conditions/cli/RunSummaryCommand.java
Modified:
    java/branches/HPSJAVA-488/conditions/src/main/java/org/hps/conditions/cli/CommandLineTool.java

Modified: java/branches/HPSJAVA-488/conditions/src/main/java/org/hps/conditions/cli/CommandLineTool.java
 =============================================================================
--- java/branches/HPSJAVA-488/conditions/src/main/java/org/hps/conditions/cli/CommandLineTool.java	(original)
+++ java/branches/HPSJAVA-488/conditions/src/main/java/org/hps/conditions/cli/CommandLineTool.java	Mon Apr 27 15:58:36 2015
@@ -25,12 +25,24 @@
  *
  * @author <a href="mailto:[log in to unmask]">Jeremy McCormick</a>
  */
-public class CommandLineTool {
+public final class CommandLineTool {
 
     /**
      * Setup logging.
      */
     private static final Logger LOGGER = LogUtil.create(CommandLineTool.class);
+    
+    private static Options OPTIONS = new Options();
+    
+    static {
+    	OPTIONS.addOption(new Option("h", false, "print help"));
+    	OPTIONS.addOption(new Option("d", true, "detector name"));
+    	OPTIONS.addOption(new Option("r", true, "run number"));
+    	OPTIONS.addOption(new Option("p", true, "database connection properties file"));
+    	OPTIONS.addOption(new Option("x", true, "conditions XML configuration file"));
+    	OPTIONS.addOption(new Option("t", true, "conditions tag to use for filtering records"));
+    	OPTIONS.addOption(new Option("l", true, "log level of the conditions manager (INFO, FINE, etc.)"));
+    }
 
     /**
      * Create a basic instance of this class.
@@ -39,16 +51,11 @@
      */
     private static CommandLineTool create() {
         final CommandLineTool cli = new CommandLineTool();
-        cli.options.addOption(new Option("h", false, "Print help and exit"));
-        cli.options.addOption(new Option("d", true, "Set the detector name"));
-        cli.options.addOption(new Option("r", true, "Set the run number"));
-        cli.options.addOption(new Option("v", false, "Enable verbose print output"));
-        cli.options.addOption(new Option("p", true, "Set the database connection properties file"));
-        cli.options.addOption(new Option("x", true, "Set the conditions XML configuration file"));
         cli.registerCommand(new LoadCommand());
         cli.registerCommand(new PrintCommand());
         cli.registerCommand(new AddCommand());
         cli.registerCommand(new TagCommand());
+        cli.registerCommand(new RunSummaryCommand());
         return cli;
     }
 
@@ -72,19 +79,9 @@
     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.
@@ -104,7 +101,7 @@
         for (final String command : this.commands.keySet()) {
             s.append(command + '\n');
         }
-        help.printHelp("CommandLineTool", "Commands:\n" + s.toString(), this.options, "");
+        help.printHelp("CommandLineTool", "Commands:\n" + s.toString(), OPTIONS, "");
     }
 
     /**
@@ -133,9 +130,9 @@
 
             CommandLine commandLine = null;
             try {
-                commandLine = this.parser.parse(this.options, arguments, true);
+                commandLine = this.parser.parse(OPTIONS, arguments, true);
             } catch (final ParseException e) {
-                LOGGER.log(Level.SEVERE, "error parsing the options", e);
+                LOGGER.log(Level.SEVERE, "Error parsing the options.", e);
                 printUsage();
                 exit(1);
             }
@@ -144,15 +141,7 @@
                 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);
 
@@ -167,8 +156,7 @@
             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);
+            // Execute the sub-command.
             command.execute(commandArguments);
         } catch (final Exception e) {
             e.printStackTrace();
@@ -185,62 +173,80 @@
      */
     private void setupConditionsManager(final CommandLine commandLine) {
 
-        LOGGER.info("setting up conditions manager");
+        LOGGER.info("Setting up the conditions manager ...");
 
         // Create new manager.
         this.conditionsManager = DatabaseConditionsManager.getInstance();
-
-        // Set log level.
-        this.conditionsManager.setLogLevel(LOGGER.getLevel());
-
+        
+        // Set the conditions manager log level (does not affect logger of this class or sub-commands).
+        if (commandLine.hasOption("l")) {
+        	Level level = Level.parse(commandLine.getOptionValue("l"));
+        	conditionsManager.setLogLevel(level);
+        	LOGGER.config("conditions manager log level will be set to " + level.toString());
+        }
+       
         // 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.
+            LOGGER.config("using connection properties " + connectionPropertiesFile.getPath());
+        }
+
+        // Conditions system XML configuration file.
         if (commandLine.hasOption("x")) {
             final File xmlConfigFile = new File(commandLine.getOptionValue("x"));
             this.conditionsManager.setXmlConfig(xmlConfigFile);
-            LOGGER.config("XML config -x " + xmlConfigFile);
+            LOGGER.config("using XML config " + xmlConfigFile.getPath());
+        }
+        
+        // User specified tag of conditions records.
+        if (commandLine.hasOption("t")) {
+        	String tag = commandLine.getOptionValue("t");
+            conditionsManager.setTag(tag);
+            LOGGER.config("using tag " + tag);
         }
 
         // 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");
+        	
+        	if (!commandLine.hasOption("r")) {
+            	// Missing run number.
+        		throw new RuntimeException("Missing -r option with run number which must be given when detector name is used.");
+        	}
+        	
+        	if (!commandLine.hasOption("d")) {
+            	// Missing detector name.
+        		throw new RuntimeException("Missing -d option with detector name which must be given when run number is used.");
+        	}
 
             // Set detector name.
             String detectorName = null;
             if (commandLine.hasOption("d")) {
                 detectorName = commandLine.getOptionValue("d");
-                LOGGER.config("detector -d " + detectorName);
+                LOGGER.config("using detector " + 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);
+                LOGGER.config("using run " + 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);
+                LOGGER.config("Initializing conditions manager with detector " + detectorName + " and run " + run + " ...");
                 DatabaseConditionsManager.getInstance().setDetector(detectorName, run);
-                LOGGER.config("conditions manager initialized successfully");
+                LOGGER.config("Conditions manager was initialized successfully!");
                 LOGGER.getHandlers()[0].flush();
             } catch (final ConditionsNotFoundException e) {
-                throw new RuntimeException(e);
-            }
-        }
+                throw new RuntimeException("Error setting up the conditions manager.", e);
+            }
+        }         
+        LOGGER.info("Done setting up the conditions manager!");
     }
 }

Added: java/branches/HPSJAVA-488/conditions/src/main/java/org/hps/conditions/cli/RunSummaryCommand.java
 =============================================================================
--- java/branches/HPSJAVA-488/conditions/src/main/java/org/hps/conditions/cli/RunSummaryCommand.java	(added)
+++ java/branches/HPSJAVA-488/conditions/src/main/java/org/hps/conditions/cli/RunSummaryCommand.java	Mon Apr 27 15:58:36 2015
@@ -0,0 +1,115 @@
+package org.hps.conditions.cli;
+
+import java.util.ArrayList;
+import java.util.Collections;
+import java.util.List;
+import java.util.logging.Level;
+import java.util.logging.Logger;
+
+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.ConditionsRecord;
+import org.hps.conditions.api.ConditionsRecord.ConditionsRecordCollection;
+import org.hps.conditions.api.TableMetaData;
+import org.hps.conditions.database.DatabaseConditionsManager;
+import org.lcsim.util.log.LogUtil;
+import org.lcsim.util.log.MessageOnlyLogFormatter;
+
+/**
+ * This is a sub-command to print out collection meta data for the current conditions configuration
+ * of tag, detector model and run number, which are given as arguments to the conditions command line
+ * front-end.  It does not print out any conditions objects, only the collection information.
+ * By default it will print information about the single collection found for a given type, which is
+ * by convention the last one updated.  The <code>-a</code> option can be used to print out all collection information.
+ *  
+ * @author @author <a href="mailto:[log in to unmask]">Jeremy McCormick</a>
+ *
+ */
+final class RunSummaryCommand extends AbstractCommand {
+	
+	/**
+     * Setup logger.
+     */
+    private static final Logger LOGGER = LogUtil.create(RunSummaryCommand.class, new MessageOnlyLogFormatter(), Level.INFO);
+
+    /**
+     * Define command options.
+     */
+    static Options options = new Options();
+    static {
+        options.addOption(new Option("h", false, "Show help for run-summary command"));
+        options.addOption(new Option("a", false, "Print all collections found for the run"));
+    }
+    
+    /**
+     * Class constructor.
+     */
+    RunSummaryCommand() {
+        super("run-summary", "Print the run summary", options);
+    }
+	
+    /**
+     * Print out the run summary information.
+     *
+     * @param arguments the command line arguments
+     */
+    @Override
+    final void execute(final String[] arguments) {
+
+        final CommandLine commandLine = parse(arguments);
+
+        final DatabaseConditionsManager conditionsManager = DatabaseConditionsManager.getInstance();
+
+        if (!conditionsManager.isInitialized()) {
+            throw new RuntimeException("The conditions system is not initialized.");
+        }
+        
+        final int run = conditionsManager.getRun();
+        
+        boolean printAll = commandLine.hasOption("a");
+        if (printAll) {
+        	LOGGER.info("All collections will be printed.");
+        }
+        
+        // Get all the conditions records from the manager including those that overlap in time validity.
+        ConditionsRecordCollection conditionsRecords = conditionsManager.getConditionsRecords();        
+        LOGGER.info('\n' + "Run " + run + " has " + conditionsRecords.size() + " conditions records.");
+        
+        // Get the list of unique conditions keys and sort them.
+        List<String> conditionsKeys = new ArrayList<String>(conditionsRecords.getConditionsKeys());
+        Collections.sort(conditionsKeys);
+        LOGGER.info('\n' + "Found these unique conditions keys for the run ...");
+        for (String key : conditionsKeys) {
+        	LOGGER.info(key);
+        }
+        LOGGER.info("");
+        
+        // Loop over all the conditions keys that apply to this run.
+        for (String key : conditionsKeys) {
+        	
+        	// Get the table meta data for the key.
+        	TableMetaData tableMetaData = conditionsManager.findTableMetaData(key);
+        	
+        	// Get all the conditions records that match this key.
+        	ConditionsRecordCollection collectionRecords = conditionsRecords.findByKey(key);
+        	
+        	// Get the table name.
+        	final String tableName = tableMetaData.getTableName();
+        	
+        	if (!printAll) {
+        		// Print out the single collection that will be used if retrieved through the converter.
+        		ConditionsObjectCollection<?> collection = conditionsManager.getCachedConditions(tableMetaData.getCollectionClass(), key).getCachedData();
+        		LOGGER.info(tableMetaData.getObjectClass().getSimpleName() + " collection " + collection.getCollectionId() + " in " + tableName + " with " + collection.size() + " rows.");
+        	} else {                	                	
+        		// Print out information about all applicable collections for this key, without figuring out which would be used.
+        		LOGGER.info(tableMetaData.getObjectClass().getSimpleName() + " has " + collectionRecords.size() + " collection(s) in " + tableName + " for run.");
+        		for (ConditionsRecord record : collectionRecords) {
+        			LOGGER.info("  collection " + record.getCollectionId().toString() + " created on " + record.getCreated().toString());
+        		}
+        	}
+        }
+        LOGGER.info('\n' + "Done printing run summary!");
+    }
+}