View Javadoc

1   package org.lcsim.geometry.compact.converter.lcdd;
2   
3   import java.io.BufferedInputStream;
4   import java.io.BufferedOutputStream;
5   import java.io.ByteArrayInputStream;
6   import java.io.ByteArrayOutputStream;
7   import java.io.FileInputStream;
8   import java.io.FileOutputStream;
9   import java.io.InputStream;
10  import java.io.OutputStream;
11  import java.util.logging.Logger;
12  
13  import javax.swing.filechooser.FileFilter;
14  
15  import org.jdom.Document;
16  import org.jdom.input.SAXBuilder;
17  import org.jdom.output.Format;
18  import org.jdom.output.XMLOutputter;
19  import org.lcsim.geometry.compact.CompactReader;
20  import org.lcsim.geometry.compact.Detector;
21  import org.lcsim.geometry.compact.converter.Converter;
22  import org.lcsim.util.xml.ClasspathEntityResolver;
23  import org.lcsim.util.xml.ElementFactory;
24  
25  /**
26   * This class is the front end for generating LCDD output from the compact
27   * description.
28   * 
29   * @author tonyj
30   * @author jeremym
31   */
32  public class Main implements Converter {
33  
34      private boolean validate = true;
35      
36      /**
37       * @param args the command line arguments
38       */
39      public static void main(String[] args) throws Exception {
40          if (args.length < 1 || args.length > 2)
41              usage();
42          InputStream in = new BufferedInputStream(new FileInputStream(args[0]));
43          OutputStream out = args.length == 1 ? System.out : new BufferedOutputStream(new FileOutputStream(args[1]));
44          new Main().convert(args[0], in, out);
45      }
46  
47      public Main() throws Exception {
48          setValidationFromSystemProperty();
49      }
50  
51      private void setValidationFromSystemProperty() {
52          boolean validateProp = Boolean.parseBoolean(System.getProperty("org.lcsim.geometry.compact.converter.lcdd.validate", "true"));
53          this.validate = validateProp;
54          if (validateProp == false) {
55              Logger.getLogger(Main.class.getName()).warning("XML output validation is turned OFF.");
56          }
57      }
58  
59      public void convert(String inputFileName, InputStream in, OutputStream out) throws Exception {
60          ElementFactory factory = new LCDDElementFactory();
61          CompactReader reader = new CompactReader(factory);
62          Detector det = reader.read(in);
63          Document doc = ((LCDDDetector) det).writeLCDD(inputFileName);
64  
65          XMLOutputter outputter = new XMLOutputter();
66                  
67          if (validate) {
68              ByteArrayOutputStream stream = new ByteArrayOutputStream();
69              outputter.output(doc, stream);
70              stream.close();
71  
72              SAXBuilder builder = new SAXBuilder();
73              builder.setEntityResolver(new ClasspathEntityResolver());
74              builder.setValidation(true);
75              builder.setFeature("http://apache.org/xml/features/validation/schema", true);
76  
77              builder.build(new ByteArrayInputStream(stream.toByteArray()));
78          }
79  
80          if (out != null) {
81              outputter.setFormat(Format.getPrettyFormat());
82              outputter.output(doc, out);            
83              out.close();
84          }
85      }
86  
87      private static void usage() {
88          System.out.println("java " + Main.class.getName() + " <compact> [<lcdd>]");
89          System.exit(0);
90      }
91  
92      public String getOutputFormat() {
93          return "lcdd";
94      }
95  
96      public FileFilter getFileFilter() {
97          return new LCDDFileFilter();
98      }
99  
100     private static class LCDDFileFilter extends FileFilter {
101 
102         public boolean accept(java.io.File file) {
103             return file.isDirectory() || file.getName().endsWith(".lcdd");
104         }
105 
106         public String getDescription() {
107             return "LCDD file (*.lcdd)";
108         }
109     }
110 }