From 4be222e6015f0bf36aa05f934cebafa5b48d5eb8 Mon Sep 17 00:00:00 2001 From: Geoff Johnstone Date: Fri, 31 Dec 2010 14:31:31 +0000 Subject: [PATCH] Add XML output; add command line parser. --- lib/jopt-simple-3.2.jar | Bin 0 -> 53244 bytes src/net/ametros/dive/ComputedDive.java | 8 ++ src/net/ametros/dive/Main.java | 218 +++++++++++++++++++---------- src/net/ametros/dive/writer/XMLWriter.java | 94 +++++++++++++ 4 files changed, 248 insertions(+), 72 deletions(-) create mode 100644 lib/jopt-simple-3.2.jar rewrite src/net/ametros/dive/Main.java (60%) create mode 100644 src/net/ametros/dive/writer/XMLWriter.java diff --git a/lib/jopt-simple-3.2.jar b/lib/jopt-simple-3.2.jar new file mode 100644 index 0000000000000000000000000000000000000000..5637362167851ef71bba46a073abbc403898602c GIT binary patch literal 53244 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 literal 0 HcwPel00001 diff --git a/src/net/ametros/dive/ComputedDive.java b/src/net/ametros/dive/ComputedDive.java index fd2141c..1e05726 100644 --- a/src/net/ametros/dive/ComputedDive.java +++ b/src/net/ametros/dive/ComputedDive.java @@ -15,6 +15,7 @@ import java.util.Set; public final class ComputedDive { + private final Dive dive; private final int depth; private final int duration; private final Gas bottomGas; @@ -25,6 +26,7 @@ public final class ComputedDive public ComputedDive (Dive dive, double V_a, DiveComputer dc) { + this.dive = dive; this.depth = dive.getDepth(); this.duration = dive.getDuration(); this.bottomGas = dive.getGas(); @@ -46,6 +48,12 @@ public final class ComputedDive } + public Dive getDive() + { + return dive; + } + + public int getDepth() { return depth; diff --git a/src/net/ametros/dive/Main.java b/src/net/ametros/dive/Main.java dissimilarity index 60% index 7cced77..5c6870b 100644 --- a/src/net/ametros/dive/Main.java +++ b/src/net/ametros/dive/Main.java @@ -1,72 +1,146 @@ -package net.ametros.dive; - -import net.ametros.dive.data.Dive; -import net.ametros.dive.data.Dives; -import net.ametros.dive.parser.DDPlanParser; -import net.ametros.dive.parser.Parser; -import net.ametros.dive.parser.XLSParser; -import net.ametros.dive.parser.XMLParser; -import net.ametros.dive.writer.Writer; -import net.ametros.dive.writer.VelocityWriter; -import net.ametros.dive.writer.XLSWriter; - -import java.io.File; - - -public class Main -{ - private static final double V_a = 8; - - - public static void main (String[] args) throws Exception - { - if (1 != args.length) - { - System.err.println ("Usage: java -jar dive.jar plans.(html|xls|xml)"); - System.exit (1); - } - - final File file = new File (args[0]); - final Parser parser; - - if (file.getName().endsWith (".html")) - parser = new DDPlanParser(); - else if (file.getName().endsWith (".xls")) - parser = new XLSParser(); - else if (file.getName().endsWith (".xml")) - parser = new XMLParser(); - else - throw new IllegalArgumentException ("No known parser for " + file); - - System.err.println ("Parsing dive plan(s) from " + file + "..."); - final Dives dives = parser.parse (file); - System.err.println ("Parsed " + dives.getDives().size() + " dive plan(s)."); - - final DiveComputer dc = new DiveComputer(); - //final Writer writer = new XLSWriter(); - final Writer writer = new VelocityWriter ("xhtml", "/xhtml.vm"); - - for (Dive dive: dives.getDives()) - writer.add (dc.compute (dive, V_a)); - - final File out = new File ("/tmp/output." + writer.getExtension()); - writer.write (out); - System.err.println ("Written plan(s) to " + out.getAbsolutePath() + "."); - - System.err.println ("\n*** You use these plans at your own risk. ***\n"); -/* - final SchemaFactory sf = - SchemaFactory.newInstance (XMLConstants.W3C_XML_SCHEMA_NS_URI); - final Schema schema = sf.newSchema (Dives.class.getResource ("/dives.xsd")); - final JAXBContext jc = JAXBContext.newInstance ("net.ametros.dive.data"); - - final Marshaller m = jc.createMarshaller(); - m.setSchema (schema); - m.setProperty (Marshaller.JAXB_FORMATTED_OUTPUT, Boolean.TRUE); - m.marshal (dives, System.out); -*/ - - System.exit (0); - } -} - +package net.ametros.dive; + +import net.ametros.dive.data.Dive; +import net.ametros.dive.data.Dives; +import net.ametros.dive.parser.DDPlanParser; +import net.ametros.dive.parser.Parser; +import net.ametros.dive.parser.XLSParser; +import net.ametros.dive.parser.XMLParser; +import net.ametros.dive.writer.Writer; +import net.ametros.dive.writer.VelocityWriter; +import net.ametros.dive.writer.XLSWriter; +import net.ametros.dive.writer.XMLWriter; + +import joptsimple.OptionParser; +import joptsimple.OptionSet; + +import java.io.File; +import java.util.List; +import java.util.ArrayList; + + +public class Main +{ + private static final double V_a = 8; + + + private static Parser getParser (File file) throws Exception + { + if (file.getName().endsWith (".html")) + return new DDPlanParser(); + + if (file.getName().endsWith (".xls")) + return new XLSParser(); + + if (file.getName().endsWith (".xml")) + return new XMLParser(); + + throw new IllegalArgumentException ("No known parser for " + file); + } + + + private static Writer getWriter (String format) throws Exception + { + if ("xhtml".equals (format)) + return new VelocityWriter ("xhtml", "/xhtml.vm"); + + if ("xls".equals (format)) + return new XLSWriter(); + + if ("xml".equals (format)) + return new XMLWriter(); + + throw new IllegalArgumentException ("No known writer for " + format); + } + + + private static List L (String... strs) + { + final List l = new ArrayList (strs.length); + for (String str: strs) + l.add (str); + + return l; + } + + + private static void usage (String err, OptionParser op) + { + try + { + if (null != err) + { + System.err.println (err); + System.err.println(); + } + + if (null != op) + { + System.err.println ("Usage: java -jar dive.jar [options] files..."); + System.err.println ("Options:"); + op.printHelpOn (System.err); + } + } + catch (Exception e) + { + e.printStackTrace(); + } + } + + + public static void main (String[] args) throws Exception + { + final OptionParser op = new OptionParser(); + op.acceptsAll (L("f", "format"), "Output format: xhtml, xls or xml"). + withRequiredArg().defaultsTo ("xls"); + + op.acceptsAll (L("o", "output"), "Output filename"). + withRequiredArg().ofType (File.class); + + OptionSet options = null; + Writer writer = null; + + try + { + options = op.parse (args); + writer = getWriter ((String)options.valueOf ("format")); + } + catch (Exception e) + { + usage (e.toString(), op); + System.exit (1); + } + + final List inputs = options.nonOptionArguments(); + if (0 == inputs.size()) + { + usage ("No input files.", op); + System.exit (2); + } + + final DiveComputer dc = new DiveComputer(); + + for (String str: inputs) + { + final File file = new File (str); + final Parser parser = getParser (file); + + System.err.println ("Parsing dive plan(s) from " + file + "..."); + final Dives dives = parser.parse (file); + System.err.println ("Parsed " + dives.getDives().size() + + " dive plan(s)."); + + for (Dive dive: dives.getDives()) + writer.add (dc.compute (dive, V_a)); + } + + final File out = options.has ("output") ? (File)options.valueOf ("output") : + new File ("output." + writer.getExtension()); + writer.write (out); + System.err.println ("Written plan(s) to " + out.getAbsolutePath() + "."); + + System.err.println ("\n*** You use these plans at your own risk. ***\n"); + System.exit (0); + } +} + diff --git a/src/net/ametros/dive/writer/XMLWriter.java b/src/net/ametros/dive/writer/XMLWriter.java new file mode 100644 index 0000000..1904672 --- /dev/null +++ b/src/net/ametros/dive/writer/XMLWriter.java @@ -0,0 +1,94 @@ +package net.ametros.dive.writer; + +import net.ametros.dive.ComputedDive; +import net.ametros.dive.data.Dives; +import net.ametros.dive.data.ObjectFactory; + +import java.io.File; +import java.io.FileOutputStream; +import java.io.OutputStream; +import javax.xml.XMLConstants; +import javax.xml.bind.JAXBContext; +import javax.xml.bind.Marshaller; +import javax.xml.validation.Schema; +import javax.xml.validation.SchemaFactory; + + +/** Writes XML dive tables. */ +public class XMLWriter implements Writer +{ + private static final SchemaFactory sf = + SchemaFactory.newInstance (XMLConstants.W3C_XML_SCHEMA_NS_URI); + + private final Schema schema; + private final JAXBContext jc; + private final Dives dives; + + + public XMLWriter() throws Exception + { + schema = sf.newSchema (Dives.class.getResource ("/dives.xsd")); + jc = JAXBContext.newInstance ("net.ametros.dive.data"); + dives = new ObjectFactory().createDives(); + } + + + @Override + public String getExtension() + { + return "xml"; + } + + + @Override + public void clear() + { + dives.getDives().clear(); + } + + + @Override + public void add (Iterable dives) + { + for (ComputedDive d: dives) + add (d); + } + + + @Override + public void add (ComputedDive[] dives) + { + for (ComputedDive d: dives) + add (d); + } + + + @Override + public void add (ComputedDive dive) + { + dives.getDives().add (dive.getDive()); + } + + + @Override + public void write (File file) throws Exception + { + final Marshaller m = jc.createMarshaller(); + m.setSchema (schema); + m.setProperty (Marshaller.JAXB_FORMATTED_OUTPUT, Boolean.TRUE); + + OutputStream os = null; + + try + { + os = new FileOutputStream (file); + m.marshal (dives, os); + } + finally + { + if (null != os) + os.close(); + } + } +} + -- 2.11.4.GIT