From 44db86771576efddbb6d2cda26637a9221a5b9d7 Mon Sep 17 00:00:00 2001 From: Kris De Volder Date: Thu, 17 Oct 2019 14:45:44 -0700 Subject: [PATCH] Some polish for self extracting jar - show progress bar while unpacking. - show error popup on any problem. --- .../common/self-extracting-jar-creator.jar | Bin 5325 -> 9007 bytes self-extracting-jar-creator/.classpath | 6 -- .../src/main/java/SelfExtractor.java | 68 ++++++++++++---- .../src/main/java/ui/ProgressApi.java | 8 ++ .../src/main/java/ui/ProgressBar.java | 74 ++++++++++++++++++ 5 files changed, 134 insertions(+), 22 deletions(-) create mode 100644 self-extracting-jar-creator/src/main/java/ui/ProgressApi.java create mode 100644 self-extracting-jar-creator/src/main/java/ui/ProgressBar.java diff --git a/eclipse-distribution/common/self-extracting-jar-creator.jar b/eclipse-distribution/common/self-extracting-jar-creator.jar index bc177598ea1e54307451e1218e81674759da994c..92cc82dc03988966f60c8af5b37dbb04233d9b9e 100644 GIT binary patch literal 9007 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 L7KtV4k8l420$%aN delta 4329 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 - - - - - - diff --git a/self-extracting-jar-creator/src/main/java/SelfExtractor.java b/self-extracting-jar-creator/src/main/java/SelfExtractor.java index c99c57ad3..4ce31baa5 100644 --- a/self-extracting-jar-creator/src/main/java/SelfExtractor.java +++ b/self-extracting-jar-creator/src/main/java/SelfExtractor.java @@ -9,6 +9,12 @@ import java.util.zip.ZipEntry; import java.util.zip.ZipInputStream; import java.util.zip.ZipOutputStream; +import javax.swing.JFrame; +import javax.swing.JOptionPane; + +import ui.ProgressApi; +import ui.ProgressBar; + /** * SelfExtractor @@ -21,7 +27,19 @@ public class SelfExtractor { byte[] buffer = new byte[BUF_SIZE]; public static void main(String[] args) throws Exception { - new SelfExtractor().run(args); + try { + new SelfExtractor().run(args); + System.exit(0); + } catch (Throwable e) { + e.printStackTrace(); + String message = e.getMessage(); + if (message==null) { + message = e.getClass().getName(); + } + JOptionPane.showMessageDialog(new JFrame(), message, "Error", + JOptionPane.ERROR_MESSAGE); + System.exit(-1); + } } private void run(String[] args) throws Exception { @@ -46,7 +64,7 @@ public class SelfExtractor { } repackagedPath = repackagedPath + ".self-extracting.jar"; System.out.println(" as "+repackagedPath); - + File wrapperJar = getMyJar(); System.out.println("wrapperJar = "+wrapperJar); try (ZipInputStream zipIn = new ZipInputStream(new FileInputStream(wrapperJar))) { @@ -85,20 +103,20 @@ public class SelfExtractor { private File getMyJar() { Class myklass = this.getClass(); String resourceName = this.getClass().getName() + ".class"; - URL resource = myklass.getResource(resourceName); - String myResourceUrl = resource.toString(); - //Example: jar:file:/home/.../self-extracing-jar-creator-0.0.1-SNAPSHOT.jar!/SelfExtractor.class - if (!myResourceUrl.startsWith("jar:file:")) { - //For convenience in 'development mode' look for a local jar built by maven. - File devJar = new File("target/self-extracting-jar-creator-0.0.1-SNAPSHOT.jar"); - if (devJar.isFile()) { - return devJar; - } - throw new IllegalStateException("To create self extracting jar, you must run this code from a jar"); - } - return new File(myResourceUrl.substring("jar:file:".length(), myResourceUrl.indexOf('!'))); - } - + URL resource = myklass.getResource(resourceName); + String myResourceUrl = resource.toString(); + //Example: jar:file:/home/.../self-extracing-jar-creator-0.0.1-SNAPSHOT.jar!/SelfExtractor.class + if (!myResourceUrl.startsWith("jar:file:")) { + //For convenience in 'development mode' look for a local jar built by maven. + File devJar = new File("target/self-extracting-jar-creator-0.0.1-SNAPSHOT.jar"); + if (devJar.isFile()) { + return devJar; + } + throw new IllegalStateException("To create self extracting jar, you must run this code from a jar"); + } + return new File(myResourceUrl.substring("jar:file:".length(), myResourceUrl.indexOf('!'))); + } + private ZipInputStream openContentsZip() { InputStream zip = this.getClass().getResourceAsStream(CONTENTS_ZIP_RSRC); if (zip==null) { @@ -109,6 +127,9 @@ public class SelfExtractor { public void unpack() throws Exception { File destDir = new File(System.getProperty("user.dir")); + int numEntries = getNumEntries(); + int processed = 0; + ProgressApi progress = ProgressBar.create(numEntries); try (ZipInputStream zip = openContentsZip()) { ZipEntry entry; while ((entry = zip.getNextEntry())!=null) { @@ -127,7 +148,22 @@ public class SelfExtractor { copy(zip, out); } } + processed++; + System.out.println("Progress = "+processed +"/"+numEntries); + progress.worked(1); } + } finally { + progress.done(); } } + + private int getNumEntries() throws IOException { + int count = 0; + try (ZipInputStream zip = openContentsZip()) { + while (zip.getNextEntry()!=null) { + count++; + } + } + return count; + } } \ No newline at end of file diff --git a/self-extracting-jar-creator/src/main/java/ui/ProgressApi.java b/self-extracting-jar-creator/src/main/java/ui/ProgressApi.java new file mode 100644 index 000000000..c87a333e6 --- /dev/null +++ b/self-extracting-jar-creator/src/main/java/ui/ProgressApi.java @@ -0,0 +1,8 @@ +package ui; + +public interface ProgressApi { + + void worked(int amount); + void done(); + +} diff --git a/self-extracting-jar-creator/src/main/java/ui/ProgressBar.java b/self-extracting-jar-creator/src/main/java/ui/ProgressBar.java new file mode 100644 index 000000000..4c614c648 --- /dev/null +++ b/self-extracting-jar-creator/src/main/java/ui/ProgressBar.java @@ -0,0 +1,74 @@ +package ui; + +import java.awt.BorderLayout; +import java.util.concurrent.CompletableFuture; + +import javax.swing.BorderFactory; +import javax.swing.BoundedRangeModel; +import javax.swing.DefaultBoundedRangeModel; +import javax.swing.JComponent; +import javax.swing.JFrame; +import javax.swing.JPanel; +import javax.swing.JProgressBar; +import javax.swing.SwingUtilities; + +public class ProgressBar extends JPanel { + + private JProgressBar progressBar; + + public ProgressBar(BoundedRangeModel model) { + super(new BorderLayout()); + + progressBar = new JProgressBar(model); + progressBar.setValue(0); + progressBar.setStringPainted(true); + + JPanel panel = new JPanel(); + panel.add(progressBar); + + add(panel, BorderLayout.CENTER); + setBorder(BorderFactory.createEmptyBorder(20, 20, 20, 20)); + } + + public static ProgressApi create(int totalWork) { + BoundedRangeModel model = new DefaultBoundedRangeModel(0, 0, 0, totalWork); + CompletableFuture window = new CompletableFuture<>(); + final ProgressApi api = new ProgressApi() { + + @Override + public void worked(int amount) { + model.setValue(model.getValue()+amount); + } + + @Override + public void done() { + window.thenAccept(w -> SwingUtilities.invokeLater(() -> { + w.setVisible(false); + w.dispose(); + })); + } + + }; + + SwingUtilities.invokeLater(() -> { + try { + //Create and set up the window. + JFrame frame = new JFrame("Unpacking..."); + frame.setDefaultCloseOperation(JFrame.DO_NOTHING_ON_CLOSE); + + //Create and set up the content pane. + JComponent newContentPane = new ProgressBar(model); + newContentPane.setOpaque(true); //content panes must be opaque + frame.setContentPane(newContentPane); + + //Display the window. + frame.pack(); + frame.setVisible(true); + window.complete(frame); + } catch (Throwable e) { + window.completeExceptionally(e); + } + }); + return api; + } +} \ No newline at end of file