package tools.image; import java.io.BufferedInputStream; import java.io.ByteArrayOutputStream; import java.io.File; import java.io.FileInputStream; import java.io.FileOutputStream; import java.io.InputStream; import java.net.URL; import javax.xml.parsers.DocumentBuilderFactory; import javax.xml.transform.Source; import javax.xml.transform.Transformer; import javax.xml.transform.TransformerFactory; import javax.xml.transform.stream.StreamResult; import javax.xml.transform.stream.StreamSource; public class XmlUpdater { private static File s_mapFolderLocation = null; private static final String TRIPLEA_MAP_FOLDER = "triplea.map.folder"; /** * Utility for updating old game.xml files to the newer format. */ public static void main(final String[] args) throws Exception { handleCommandLineArgs(args); final File gameXmlFile = new FileOpen("Select xml file", s_mapFolderLocation, ".xml").getFile(); if (gameXmlFile == null) { System.out.println("No file selected"); return; } final InputStream source = XmlUpdater.class.getResourceAsStream("gameupdate.xslt"); if (source == null) { throw new IllegalStateException("Could not find xslt file"); } final Transformer trans = TransformerFactory.newInstance().newTransformer(new StreamSource(source)); ByteArrayOutputStream resultBuf; try ( final FileInputStream fileInputStream = new FileInputStream(gameXmlFile); final InputStream gameXmlStream = new BufferedInputStream(fileInputStream)) { final DocumentBuilderFactory factory = DocumentBuilderFactory.newInstance(); factory.setValidating(true); // use a dummy game.dtd, this prevents the xml parser from adding default values final URL url = XmlUpdater.class.getResource(""); final String system = url.toExternalForm(); final Source xmlSource = new StreamSource(gameXmlStream, system); resultBuf = new ByteArrayOutputStream(); trans.transform(xmlSource, new StreamResult(resultBuf)); } gameXmlFile.renameTo(new File(gameXmlFile.getAbsolutePath() + ".backup")); final FileOutputStream outStream = new FileOutputStream(gameXmlFile); outStream.write(resultBuf.toByteArray()); outStream.close(); System.out.println("Successfully updated:" + gameXmlFile); } private static String getValue(final String arg) { final int index = arg.indexOf('='); if (index == -1) { return ""; } return arg.substring(index + 1); } private static void handleCommandLineArgs(final String[] args) { // arg can only be the map folder location. if (args.length == 1) { String value; if (args[0].startsWith(TRIPLEA_MAP_FOLDER)) { value = getValue(args[0]); } else { value = args[0]; } final File mapFolder = new File(value); if (mapFolder.exists()) { s_mapFolderLocation = mapFolder; } else { System.out.println("Could not find directory: " + value); } } else if (args.length > 1) { System.out.println("Only argument allowed is the map directory."); } // might be set by -D if (s_mapFolderLocation == null || s_mapFolderLocation.length() < 1) { final String value = System.getProperty(TRIPLEA_MAP_FOLDER); if (value != null && value.length() > 0) { final File mapFolder = new File(value); if (mapFolder.exists()) { s_mapFolderLocation = mapFolder; } else { System.out.println("Could not find directory: " + value); } } } } }