src/demo/share/jpackager/JNLPConverter/src/jnlp/converter/HTTPHelper.java
branchJDK-8200758-branch
changeset 56963 eaca4369b068
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/src/demo/share/jpackager/JNLPConverter/src/jnlp/converter/HTTPHelper.java	Fri Oct 12 19:00:51 2018 -0400
@@ -0,0 +1,193 @@
+/*
+ * Copyright (c) 2018, Oracle and/or its affiliates. All rights reserved.
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
+ *
+ * This code is free software; you can redistribute it and/or modify it
+ * under the terms of the GNU General Public License version 2 only, as
+ * published by the Free Software Foundation.
+ *
+ * This code is distributed in the hope that it will be useful, but WITHOUT
+ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+ * FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
+ * version 2 for more details (a copy is included in the LICENSE file that
+ * accompanied this code).
+ *
+ * You should have received a copy of the GNU General Public License version
+ * 2 along with this work; if not, write to the Free Software Foundation,
+ * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
+ *
+ * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
+ * or visit www.oracle.com if you need additional information or have any
+ * questions.
+ */
+
+package jnlp.converter;
+
+import java.io.File;
+import java.io.FileInputStream;
+import java.io.FileNotFoundException;
+import java.io.FileOutputStream;
+import java.io.IOException;
+import java.io.InputStream;
+import java.io.OutputStream;
+import java.net.HttpURLConnection;
+import java.net.MalformedURLException;
+import java.net.URI;
+import java.net.URL;
+import java.nio.file.Files;
+import java.nio.file.Path;
+import java.nio.file.Paths;
+import jnlp.converter.parser.GeneralUtil;
+
+public class HTTPHelper {
+
+    public static final int BUFFER_SIZE = 4096;
+
+    public static String downloadFile(String url, String destFolder, String destFileName) throws MalformedURLException, IOException {
+        HttpURLConnection connection = null;
+        String destFile = null;
+
+        try {
+            if (url.contains(" ")) {
+                url = url.replace(" ", "%20");
+            }
+            if (url.contains("\\")) {
+                url = url.replace("\\", "/");
+            }
+
+            URL resource = new URL(url);
+            connection = (HttpURLConnection) resource.openConnection();
+
+            int responseCode = connection.getResponseCode();
+            if (responseCode == HttpURLConnection.HTTP_OK) {
+                destFile = destFolder + File.separator + destFileName;
+                Log.verbose("Downloading " + url + " to " + destFile);
+
+                try (InputStream inputStream = connection.getInputStream();
+                     OutputStream outputStream = new FileOutputStream(destFile)) {
+                    byte[] buffer = new byte[BUFFER_SIZE];
+
+                    int length;
+                    do {
+                        length = inputStream.read(buffer);
+                        if (length > 0) {
+                            outputStream.write(buffer, 0, length);
+                        }
+                    } while (length > 0);
+                }
+            } else {
+                HTTPHelperException e = new HTTPHelperException("Error: Cannot download " + url + ". Server response code: " + responseCode);
+                e.setResponseCode(responseCode);
+                throw e;
+            }
+        } catch (IOException e) {
+            if (e instanceof HTTPHelperException) {
+                throw e;
+            } else {
+                throw new HTTPHelperException("Error: Cannot download " + url + ". " + e.getClass().getSimpleName() + ": " + e.getMessage());
+            }
+        } finally {
+            if (connection != null) {
+                connection.disconnect();
+            }
+        }
+
+        return destFile;
+    }
+
+    public static String copyFile(String url, String destFolder, String destFileName) throws Exception {
+        if (url.contains(" ")) {
+            url = url.replace(" ", "%20");
+        }
+
+        URI sourceURI = new URI(url);
+
+        String sourceFile = sourceURI.getPath();
+        File file = new File(sourceFile);
+        if (!file.exists()) {
+            throw new FileNotFoundException("Error: " + sourceFile + " does not exist.");
+        }
+
+        String destFile = destFolder + File.separator + destFileName;
+        file = new File(destFile);
+        if (file.exists()) {
+            file.delete();
+        }
+
+        Path sourcePath = Paths.get(sourceURI);
+        Path destPath = Paths.get(destFile);
+        Log.verbose("Copying " + url + " to " + destFile);
+        Files.copy(sourcePath, destPath);
+
+        return destFile;
+    }
+
+    public static boolean isHTTPUrl(String url) {
+        return (url.startsWith("http://") || url.startsWith("https://"));
+    }
+
+    public static byte[] getJNLPBits(String versionedJNLP, String jnlp) throws Exception {
+        String jnlpFilePath = null;
+        byte[] bits = null;
+
+        if (isHTTPUrl(jnlp)) {
+            try {
+                jnlpFilePath = downloadFile(versionedJNLP, JNLPConverter.getJnlpDownloadFolderStatic(), getFileNameFromURL(jnlp));
+            } catch (HTTPHelperException ex) {
+                if (ex.getResponseCode() == HttpURLConnection.HTTP_NOT_FOUND &&
+                       !versionedJNLP.equals(jnlp)) {
+                    Log.warning("Downloading versioned JNLP from " + versionedJNLP + " failed.");
+                    Log.warning(ex.getMessage());
+                    Log.warning("Downloading " + jnlp + " instead.");
+                    jnlpFilePath = downloadFile(jnlp, JNLPConverter.getJnlpDownloadFolderStatic(), getFileNameFromURL(jnlp));
+                } else {
+                    throw ex;
+                }
+            }
+            JNLPConverter.markFileToDelete(jnlpFilePath);
+        } else {
+            try {
+                jnlpFilePath = copyFile(versionedJNLP, JNLPConverter.getJnlpDownloadFolderStatic(), getFileNameFromURL(jnlp));
+            } catch (FileNotFoundException ex) {
+                System.out.println("Error copying versioned JNLP from " + versionedJNLP);
+                System.out.println(ex.getMessage());
+                System.out.println("Copying " + jnlp + " instead.");
+                jnlpFilePath = HTTPHelper.copyFile(jnlp, JNLPConverter.getJnlpDownloadFolderStatic(), getFileNameFromURL(jnlp));
+            }
+            JNLPConverter.markFileToDelete(jnlpFilePath);
+        }
+
+        File jnlpFile = new File(jnlpFilePath);
+        if (jnlpFile.exists()) {
+            bits = GeneralUtil.readBytes(new FileInputStream(jnlpFile), jnlpFile.length());
+        }
+
+        return bits;
+    }
+
+    public static String getFileNameFromURL(String url) throws IOException {
+        int index;
+        int index1 = url.lastIndexOf('/');
+        int index2 = url.lastIndexOf('\\');
+
+        if (index1 >= index2) {
+            index = index1;
+        } else {
+            index = index2;
+        }
+
+        if (index != -1) {
+            String name = url.substring(index + 1, url.length());
+            name = name.replace("%20", " ");
+            if (name.endsWith(".jnlp") || name.endsWith(".jar")) { // JNLP or JAR
+                return name;
+            } else if (name.endsWith(".ico")) { // Icons
+                return name;
+            } else {
+                throw new IOException("Error: Unsupported file extension for " + url);
+            }
+        } else {
+            throw new IOException("Error: URL (" + url + ") should end with file name.");
+        }
+    }
+}