@edu.umd.cs.findbugs.annotations.SuppressWarnings( value = "REC_CATCH_EXCEPTION") // dead class doesn't need this fixed right now void writeFile() { log.warn( "SymbolicProgFrame writeFile invoked - is this still right, or should the LocoFile method be used?"); log.warn("Note use of VersionID attribute..."); try { // get the file int retVal = fco.showSaveDialog(this); // handle selection or cancel if (retVal != JFileChooser.APPROVE_OPTION) { return; // leave early } File file = fco.getSelectedFile(); // This is taken in large part from "Java and XML" page 368 // create root element Element root = new Element("locomotive-config"); Document doc = jmri.jmrit.XmlFile.newDocument( root, jmri.jmrit.XmlFile.dtdLocation + "locomotive-config.dtd"); // add XSLT processing instruction // <?xml-stylesheet type="text/xsl" href="XSLT/locomotive.xsl"?> java.util.Map<String, String> m = new java.util.HashMap<String, String>(); m.put("type", "text/xsl"); m.put("href", jmri.jmrit.XmlFile.xsltLocation + "locomotive.xsl"); ProcessingInstruction p = new ProcessingInstruction("xml-stylesheet", m); doc.addContent(0, p); // add top-level elements Element values; root.addContent( new Element("locomotive") // locomotive values are first item .setAttribute("roadNumber", locoRoadNumber.getText()) .setAttribute("roadName", locoRoadName.getText()) .setAttribute("mfg", locoMfg.getText()) .setAttribute("model", locoModel.getText()) .addContent( new Element("decoder") .setAttribute("model", decoderModel.getText()) .setAttribute("mfg", decoderMfg.getText()) .setAttribute("versionID", "") .setAttribute("mfgID", "")) .addContent(values = new Element("values"))); // Append a decoderDef element to values Element decoderDef; values.addContent(decoderDef = new Element("decoderDef")); // add the variable values to the decoderDef Element for (int i = 0; i < variableModel.getRowCount(); i++) { decoderDef.addContent( new Element("varValue") .setAttribute("item", variableModel.getLabel(i)) .setAttribute("value", variableModel.getValString(i))); } // add the CV values to the values Element for (int i = 0; i < cvModel.getRowCount(); i++) { values.addContent( new Element("CVvalue") .setAttribute("name", cvModel.getName(i)) .setAttribute("value", cvModel.getValString(i))); } // write the result to selected file java.io.FileOutputStream o = new java.io.FileOutputStream(file); try { XMLOutputter fmt = new XMLOutputter(); fmt.setFormat( Format.getPrettyFormat() .setLineSeparator(System.getProperty("line.separator")) .setTextMode(Format.TextMode.PRESERVE)); fmt.output(doc, o); } finally { o.close(); } // mark file as OK variableModel.setFileDirty(false); } catch (Exception e) { log.error(e.getLocalizedMessage(), e); } }