Commit in lcsim-conditions/src/main/java/org/lcsim/conditions on MAIN
ConditionsManagerImplementation.java+27-61.2 -> 1.3
ConditionsReader.java+65-101.2 -> 1.3
+92-16
2 modified files
Enable custom ConditionsReaders

lcsim-conditions/src/main/java/org/lcsim/conditions
ConditionsManagerImplementation.java 1.2 -> 1.3
diff -u -r1.2 -r1.3
--- ConditionsManagerImplementation.java	29 Feb 2012 00:13:37 -0000	1.2
+++ ConditionsManagerImplementation.java	19 Mar 2012 20:55:58 -0000	1.3
@@ -35,15 +35,35 @@
 //      handler.setLevel(Level.ALL);
 //      logger.addHandler(handler);
    }
-   public void setDetector(String name, int run) throws ConditionsNotFoundException
+   
+   public void setDetector(String detectorName, int run) throws ConditionsNotFoundException
    {
-      this.run = run;
-      if (!name.equals(detectorName))
-      {
-         setConditionsReader(ConditionsReader.create(name,run),name);
-         logger.log(Level.FINE, "Detector changed: {0} {1}", new Object[]{name, run});
+      if (this.run != run || !detectorName.equals(this.detectorName)) {
+        if (reader == null) {
+          setConditionsReader(ConditionsReader.create(this, detectorName, run), detectorName);
+        } else {
+          try {
+            if (reader.update(this, detectorName, run)) {
+              fireConditionsChanged();
+              logger.log(Level.FINE, "Detector changed: {0} {1}", new Object[]{detectorName, run});
+            }
+          } catch (IllegalArgumentException x) {
+            setConditionsReader(ConditionsReader.create(this, detectorName, run), detectorName);
+          } catch (IOException x) {
+            throw new ConditionsSetNotFoundException("Failed to update conditions reader, detector: "+ detectorName +", run: "+ run, x);
+          }
+        }
+        this.run = run;
       }
+
+//     this.run = run;
+//      if (!name.equals(detectorName))
+//      {
+//         setConditionsReader(ConditionsReader.create(name,run),name);
+//         logger.log(Level.FINE, "Detector changed: {0} {1}", new Object[]{name, run});
+//      }
    }
+   
    public void setConditionsReader(ConditionsReader newReader, String name)
    {
       ConditionsReader oldReader = reader;
@@ -59,6 +79,7 @@
          
       }
    }
+   
    public void removeConditionsConverter(ConditionsConverter conv)
    {
       converters.remove(conv.getType());

lcsim-conditions/src/main/java/org/lcsim/conditions
ConditionsReader.java 1.2 -> 1.3
diff -u -r1.2 -r1.3
--- ConditionsReader.java	29 Feb 2012 00:13:37 -0000	1.2
+++ ConditionsReader.java	19 Mar 2012 20:55:58 -0000	1.3
@@ -31,6 +31,29 @@
     private static Properties aliases;
     private static final File home = new File(FileCache.getCacheRoot(), ".lcsim");
     private static FileCache cache;
+        
+    /**
+     * Called by {@link ConditionsManager#setDetector} to tell this reader that it needs to prepare
+     * itself for reading conditions for the specified detector and run.
+     * <p>
+     * The implementation provided by this class returns <tt>false</tt> if the specified detector
+     * name is equal to the name of the current detector known to the specified {@link ConditionsManager},
+     * and throws <tt>IllegalArgumentException</tt> if it is not. Subclasses need to override this method
+     * if conditions might be different for different runs with the same detector.
+     * 
+     * @return <tt>true</tt> if conditions for the specified detector/run may be different
+     *         from conditions for the previous detector/run combination; <tt>false</tt> otherwise.
+     * @throws IllegalArgumentException if this <tt>ConditionsReader</tt> cannot handle the
+     *         specified detector/run.
+     * @throws IOException if the reader fails to update for any other reason.
+     */
+     protected boolean update(ConditionsManager manager, String detectorName, int run) throws IOException {
+       if (detectorName.equals(manager.getDetector())) {
+         return false;
+       } else {
+         throw new IllegalArgumentException();
+       }
+     }
 
     /**
      * Get a list of available detectors
@@ -162,10 +185,42 @@
             throw new ConditionsNotFoundException(name, run, x);
         }
     }
+        
+    /**
+     * Creates <tt>ConditionsReader</tt> to handle the specified detector and run.
+     * @throws ConditionsNotFoundException if creation of the reader fails for any reason.
+     */
+    static ConditionsReader create(ConditionsManager manager, String detectorName, int run) throws ConditionsNotFoundException {
+      ConditionsReader reader = create(detectorName, run);
+      Properties prop = new Properties();
+      try {
+        InputStream in = reader.open("detector", "properties");
+        try {
+          prop.load(in);
+        } finally {
+          in.close();
+        }
+      } catch (IOException x) {
+        // For now: having failed to find or load detector.properties, use unmodified reader
+        // Uncomment the line below if we decide this should be treated as an error
+        //throw new ConditionsNotFoundException(detectorName, run, x);
+      }
+      String readerClassName = prop.getProperty("ConditionsReader");
+      if (readerClassName != null) {
+        try {
+          Class readerClass = Class.forName(readerClassName);
+          reader = (ConditionsReader) readerClass.getDeclaredConstructor(ConditionsReader.class).newInstance(reader);
+          reader.update(manager, detectorName, run);
+        } catch (Exception x) {
+          throw new ConditionsNotFoundException(detectorName, run, x);
+        }
+      }
+      return reader;
+    }
 
-    abstract InputStream open(String name, String type) throws IOException;
+    abstract public InputStream open(String name, String type) throws IOException;
 
-    abstract void close() throws IOException;
+    abstract public void close() throws IOException;
 
     private static Properties loadAliases() {
         Properties result = new Properties();
@@ -238,7 +293,7 @@
             this.zip = new ZipFile(file, ZipFile.OPEN_READ);
         }
 
-        InputStream open(String name, String type) throws IOException {
+        public InputStream open(String name, String type) throws IOException {
             ZipEntry entry = zip.getEntry(name + "." + type);
             if (entry == null) {
                 throw new IOException("Conditions " + name + "." + type + " not found");
@@ -246,7 +301,7 @@
             return zip.getInputStream(entry);
         }
 
-        void close() throws IOException {
+        public void close() throws IOException {
             zip.close();
         }
     }
@@ -259,7 +314,7 @@
             this.dir = file;
         }
 
-        InputStream open(String name, String type) throws IOException {
+        public InputStream open(String name, String type) throws IOException {
             File file = new File(dir, name + "." + type);
             if (!file.exists()) {
                 throw new IOException("Conditions " + name + "." + type + " not found, because directory " + file.getAbsolutePath() + " does not exist.");
@@ -267,7 +322,7 @@
             return new BufferedInputStream(new FileInputStream(file));
         }
 
-        void close() throws IOException {
+        public void close() throws IOException {
         }
     }
 
@@ -286,7 +341,7 @@
             }
         }
 
-        InputStream open(String name, String type) throws IOException {
+        public InputStream open(String name, String type) throws IOException {
             InputStream in = ConditionsReader.class.getResourceAsStream("/" + detectorName + "/" + name + "." + type);
             if (in == null) {
                 throw new IOException("Conditions " + detectorName + "." + name + "." + type + " not found");
@@ -294,17 +349,17 @@
             return in;
         }
 
-        void close() throws IOException {
+        public void close() throws IOException {
         }
     }
 
     private static class DummyConditionsReader extends ConditionsReader {
 
-        InputStream open(String name, String type) throws IOException {
+        public InputStream open(String name, String type) throws IOException {
             throw new IOException("Conditions " + name + "." + type + " not found");
         }
 
-        void close() throws IOException {
+        public void close() throws IOException {
         }
     }
 }
CVSspam 0.2.12


Use REPLY-ALL to reply to list

To unsubscribe from the LCD-CVS list, click the following link:
https://listserv.slac.stanford.edu/cgi-bin/wa?SUBED1=LCD-CVS&A=1