[vassalengine-svn-trunk] [vassalengine-svn] SF.net SVN: vassalengine: [1704] VASSAL-src/trunk/VASSA
Brought to you by:
rodneykinney,
uckelman
From: <rod...@us...> - 2007-02-07 06:00:09
|
Revision: 1704 http://svn.sourceforge.net/vassalengine/?rev=1704&view=rev Author: rodneykinney Date: 2007-02-06 21:59:39 -0800 (Tue, 06 Feb 2007) Log Message: ----------- Install wizard continued Modified Paths: -------------- VASSAL-src/trunk/VASSAL/launch/InstallWizard.java Modified: VASSAL-src/trunk/VASSAL/launch/InstallWizard.java =================================================================== --- VASSAL-src/trunk/VASSAL/launch/InstallWizard.java 2007-02-07 04:02:51 UTC (rev 1703) +++ VASSAL-src/trunk/VASSAL/launch/InstallWizard.java 2007-02-07 05:59:39 UTC (rev 1704) @@ -21,10 +21,15 @@ import java.awt.event.ActionEvent; import java.awt.event.ActionListener; import java.io.File; +import java.io.FileOutputStream; import java.io.FileWriter; import java.io.IOException; +import java.io.InputStream; import java.io.Writer; import java.net.URL; +import java.util.ArrayList; +import java.util.Iterator; +import java.util.List; import javax.swing.Box; import javax.swing.JButton; import javax.swing.JDialog; @@ -50,13 +55,17 @@ import org.xml.sax.SAXException; /** + * Walks the user through a wizard interface. The user may choose between an auto-updating (networked jnlp) or purely + * local installation (jnlp on local filesystem) installations, and can also select the particular version of VASSAL to install + * * @author rkinney */ public class InstallWizard { private File installDir; + private String installFileName; private String jnlpURL; private String maxHeap; - private File launchFile; + private Installer installer; public void startWizard() { chooseVersion(); @@ -64,6 +73,8 @@ public void chooseVersion() { jnlpURL = "http://www.vassalengine.org/ws/vassal.jnlp"; + installFileName = "vassal.jnlp"; + installer = new LocalInstaller(); chooseHeapSize(); } @@ -74,74 +85,22 @@ public void tryInstall() { try { - doInstall(); - JOptionPane.showMessageDialog(null, "Installation successful.\nTo get started, double-click on " + launchFile); + installer.doInstall(); + JOptionPane.showMessageDialog(null, "Installation successful.\nTo get started, double-click on " + new File(installDir, installFileName)); + System.exit(0); } catch (IOException e) { + e.printStackTrace(); JOptionPane.showMessageDialog(null, "Installation failed: " + e.getMessage()); System.exit(1); } catch (RuntimeException e) { + e.printStackTrace(); JOptionPane.showMessageDialog(null, "Installation failed: " + e.getMessage()); System.exit(1); } } - public void doInstall() throws IOException { - if (installDir == null) { - throw new IOException("Installation directory not specified"); - } - if (installDir.exists() && !installDir.isDirectory()) { - throw new IOException(installDir + " is not a directory"); - } - if (!installDir.exists() && !installDir.mkdir()) { - throw new IOException("Unable to create " + installDir); - } - Document doc = getJNLPDoc(); - NodeList l = doc.getElementsByTagName("j2se"); - if (l.getLength() != 1) { - throw new IOException("Badly formed jnlp file at " + jnlpURL); - } - Element el = (Element) l.item(0); - el.setAttribute("max-heap-size", maxHeap); - launchFile = new File(installDir, "vassal.jnlp"); - Writer writer = new FileWriter(launchFile); - try { - Source source = new DOMSource(doc); - // Prepare the output file - Result result = new StreamResult(writer); - // Write the DOM document to the file - Transformer xformer = TransformerFactory.newInstance().newTransformer(); - xformer.setOutputProperty(OutputKeys.INDENT, "yes"); - xformer.setOutputProperty("{http://xml.apache.org/xslt}indent-amount", "4"); - xformer.transform(source, result); - } - catch (TransformerException e) { - throw new IOException(e.getMessage()); - } - catch (TransformerFactoryConfigurationError e) { - throw new IOException(e.getMessage()); - } - writer.close(); - } - - public Document getJNLPDoc() throws IOException { - Document d; - try { - d = javax.xml.parsers.DocumentBuilderFactory.newInstance().newDocumentBuilder().parse(new URL(jnlpURL).openStream()); - } - catch (SAXException e) { - throw new IOException("SAXException: " + e.getMessage()); - } - catch (ParserConfigurationException e) { - throw new IOException("ParserConfigurationException: " + e.getMessage()); - } - catch (FactoryConfigurationError e) { - throw new IOException("FactoryConfigurationError: " + e.getMessage()); - } - return d; - } - public static void main(String[] args) { InstallWizard wiz = new InstallWizard(); wiz.startWizard(); @@ -172,6 +131,11 @@ super(); Box hBox = Box.createHorizontalBox(); hBox.add(tf); + tf.addActionListener(new ActionListener() { + public void actionPerformed(ActionEvent e) { + next(); + } + }); hBox.add(select); select.addActionListener(new ActionListener() { public void actionPerformed(ActionEvent e) { @@ -206,4 +170,140 @@ tryInstall(); } } + private static interface Installer { + public void doInstall() throws IOException; + } + private class JnlpInstaller implements Installer { + public void doInstall() throws IOException { + checkParameters(); + Document doc = getJNLPDoc(new URL(jnlpURL)); + modifyDocument(doc); + writeDocument(doc, new File(installDir, installFileName)); + } + + protected void writeDocument(Document doc, File file) throws IOException { + Writer writer = new FileWriter(file); + try { + Source source = new DOMSource(doc); + // Prepare the output file + Result result = new StreamResult(writer); + // Write the DOM document to the file + Transformer xformer = TransformerFactory.newInstance().newTransformer(); + xformer.setOutputProperty(OutputKeys.INDENT, "yes"); + xformer.setOutputProperty("{http://xml.apache.org/xslt}indent-amount", "4"); + xformer.transform(source, result); + } + catch (TransformerException e) { + throw new IOException(e.getMessage()); + } + catch (TransformerFactoryConfigurationError e) { + throw new IOException(e.getMessage()); + } + writer.close(); + } + + protected void modifyDocument(Document doc) throws IOException { + NodeList l = doc.getElementsByTagName("j2se"); + if (l.getLength() == 1) { + Element el = (Element) l.item(0); + el.setAttribute("max-heap-size", maxHeap); + } + } + + protected void checkParameters() throws IOException { + if (installDir == null) { + throw new IOException("Installation directory not specified"); + } + if (installDir.exists() && !installDir.isDirectory()) { + throw new IOException(installDir + " is not a directory"); + } + if (!installDir.exists() && !installDir.mkdir()) { + throw new IOException("Unable to create " + installDir); + } + if (installFileName == null) { + throw new IOException("No installation file specified"); + } + } + + public Document getJNLPDoc(URL url) throws IOException { + Document d; + try { + d = javax.xml.parsers.DocumentBuilderFactory.newInstance().newDocumentBuilder().parse(url.openStream()); + } + catch (SAXException e) { + throw new IOException("SAXException: " + e.getMessage()); + } + catch (ParserConfigurationException e) { + throw new IOException("ParserConfigurationException: " + e.getMessage()); + } + catch (FactoryConfigurationError e) { + throw new IOException("FactoryConfigurationError: " + e.getMessage()); + } + return d; + } + } + private class LocalInstaller extends JnlpInstaller { + private List resources = new ArrayList(); + + protected void modifyDocument(Document doc) throws IOException { + extractResources(doc); + super.modifyDocument(doc); + doc.getDocumentElement().setAttribute("codebase", installDir.toURL().toString()); + } + + private void extractResources(Document doc) throws IOException { + String codebase = doc.getDocumentElement().getAttribute("codebase"); + URL base = null; + if (codebase != null) { + if (!codebase.endsWith("/")) { + codebase += "/"; + } + base = new URL(codebase); + } + NodeList jars = doc.getElementsByTagName("jar"); + for (int i = 0, n = jars.getLength(); i < n; ++i) { + Element el = (Element) jars.item(i); + String version = el.getAttribute("version"); + String url = version == null || version.length() == 0 ? el.getAttribute("href") : el.getAttribute("href") + "?version-id=" + version; + URL resource = base == null ? new URL(url) : new URL(base, url); + el.setAttribute("version", ""); + resources.add(resource); + } + NodeList l = doc.getElementsByTagName("extension"); + for (int i = 0, n = l.getLength(); i < n; ++i) { + Element el = (Element) l.item(i); + String url = el.getAttribute("href"); + URL extURL = base == null ? new URL(url) : new URL(base, url); + Document extensionDoc = getJNLPDoc(extURL); + modifyDocument(extensionDoc); + String path = extURL.getPath(); + path = path.substring(path.lastIndexOf('/') + 1); + writeDocument(extensionDoc, new File(installDir, path)); + } + } + + protected void writeDocument(Document doc, File file) throws IOException { + super.writeDocument(doc, file); + for (Iterator it = resources.iterator(); it.hasNext();) { + URL resource = (URL) it.next(); + downloadResource(resource); + } + } + + private void downloadResource(URL resource) throws IOException { + byte[] buffer = new byte[100000]; + int readCount = 0; + String path = resource.getPath(); + path = path.substring(path.lastIndexOf('/') + 1); + File local = new File(installDir, path); + FileOutputStream out = new FileOutputStream(local); + InputStream in = resource.openStream(); + while ((readCount = in.read(buffer)) > 0) { + out.write(buffer, 0, readCount); + } + out.close(); + } + } + private class AutoUpdateInstaller extends JnlpInstaller { + } } This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. ------------------------------------------------------------------------- Using Tomcat but need to do more? Need to support web services, security? Get stuff done quickly with pre-integrated technology to make your job easier. Download IBM WebSphere Application Server v.1.0.1 based on Apache Geronimo http://sel.as-us.falkag.net/sel?cmd=lnk&kid=120709&bid=263057&dat=121642 _______________________________________________ vassalengine-svn mailing list vas...@li... https://lists.sourceforge.net/lists/listinfo/vassalengine-svn |