Mercurial > hg > release > icedtea-web-1.4
changeset 747:be23db7861a6
JNLP file is now re-downloading only if is local and have href. Real couse of PR1473
author | Jiri Vanek <jvanek@redhat.com> |
---|---|
date | Fri, 28 Jun 2013 14:02:37 +0200 |
parents | b1b17bb14ab0 |
children | 6cd78e135d41 |
files | ChangeLog NEWS netx/net/sourceforge/jnlp/Launcher.java netx/net/sourceforge/jnlp/runtime/Boot.java tests/reproducers/simple/GeneratedId/resources/GeneratedId.jnlp tests/reproducers/simple/GeneratedId/srcs/GeneratedId.java tests/reproducers/simple/GeneratedId/testcases/GeneratedIdTest.java tests/test-extensions/net/sourceforge/jnlp/TinyHttpdImpl.java |
diffstat | 8 files changed, 328 insertions(+), 106 deletions(-) [+] |
line wrap: on
line diff
--- a/ChangeLog Thu Jun 20 15:26:14 2013 +0200 +++ b/ChangeLog Fri Jun 28 14:02:37 2013 +0200 @@ -1,3 +1,21 @@ +2013-06-24 Jiri Vanek <jvanek@redhat.com> + + JNLP file is now re-downloading only if is local and have href + * /netx/net/sourceforge/jnlp/Launcher.java: (launch) api cleared + from (fromSource). (fromUrl) removed always re-downloading code and + replaced by conditional. (launchBackground), (toFile), (BgRunner) + removed. + * netx/net/sourceforge/jnlp/runtime/Boot.java: following new (launch) + * tests/reproducers/simple/GeneratedId/srcs/GeneratedId.java: just + arguments reprinting application + * tests/reproducers/simple/GeneratedId/testcases/GeneratedIdTest.java + various tests based on href/no href x local/remote jnlp files + * tests/reproducers/simple/GeneratedId/resources/GeneratedId.jnlp: base + simple jnlp with someId argument + * tests/test-extensions/net/sourceforge/jnlp/TinyHttpdImpl.java: reprinting + the get/head correctly and with echo + * NEWS: mentioned PR1473 + 2013-06-20 Jiri Vanek <jvanek@redhat.com> Made it work with OpenJDK build 25
--- a/NEWS Thu Jun 20 15:26:14 2013 +0200 +++ b/NEWS Fri Jun 28 14:02:37 2013 +0200 @@ -11,6 +11,7 @@ New in release 1.4.1 (2013-XX-YY): * NetX - PR1465 - java.io.FileNotFoundException while trying to download a JAR file + - PR1473 - javaws should not depend on name of local file * Plugin - PR854: Resizing an applet several times causes 100% CPU load
--- a/netx/net/sourceforge/jnlp/Launcher.java Thu Jun 20 15:26:14 2013 +0200 +++ b/netx/net/sourceforge/jnlp/Launcher.java Fri Jun 28 14:02:37 2013 +0200 @@ -264,30 +264,18 @@ return tg.getApplication(); } - /** - * Launches a JNLP file by calling the launch method for the - * appropriate file type. - * - * @param location the URL of the JNLP file to launch - * @throws LaunchException if there was an exception - * @return the application instance - */ - public ApplicationInstance launch(URL location) throws LaunchException { - return launch(toFile(location)); - } /** * Launches a JNLP file by calling the launch method for the * appropriate file type. * * @param location the URL of the JNLP file to launch - * @param fromSource if true, the JNLP file will be re-read from the source * location to get the pristine version * @throws LaunchException if there was an exception * @return the application instance */ - public ApplicationInstance launch(URL location, boolean fromSource) throws LaunchException { - return launch(fromUrl(location, fromSource)); + public ApplicationInstance launch(URL location) throws LaunchException { + return launch(fromUrl(location)); } /** @@ -376,28 +364,7 @@ } } - /** - * Launches a JNLP file by calling the launch method for the - * appropriate file type in a different thread. - * - * @param file the JNLP file to launch - */ - public void launchBackground(JNLPFile file) { - BgRunner runner = new BgRunner(file, null); - new Thread(runner).start(); - } - - /** - * Launches the JNLP file at the specified location in the - * background by calling the launch method for its file type. - * - * @param location the location of the JNLP file - */ - public void launchBackground(URL location) { - BgRunner runner = new BgRunner(null, location); - new Thread(runner).start(); - } - + /** * Launches the JNLP file in a new JVM instance. The launched * application's output is sent to the system out and it's @@ -477,60 +444,38 @@ /** * Returns the JNLPFile for the URL, with error handling. */ - private JNLPFile fromUrl(URL location, boolean fromSource) throws LaunchException { + + private JNLPFile fromUrl(URL location) throws LaunchException { try { JNLPFile file = null; file = new JNLPFile(location, parserSettings.isStrict()); + + boolean isLocal = false; + boolean haveHref = false; + if ("file".equalsIgnoreCase(location.getProtocol()) && new File(location.getFile()).exists()) { + isLocal = true; + } + if (file.getSourceLocation() != null) { + haveHref = true; + } - if (fromSource) { - // Launches the jnlp file where this file originated. - if (file.getSourceLocation() != null) { - file = new JNLPFile(file.getSourceLocation(), parserSettings.isStrict()); - } + if (isLocal && haveHref) { + file = new JNLPFile(file.getSourceLocation(), parserSettings.isStrict()); } return file; } catch (Exception ex) { - if (ex instanceof LaunchException) + if (ex instanceof LaunchException) { throw (LaunchException) ex; // already sent to handler when first thrown - else + } else { // IO and Parse throw launchError(new LaunchException(null, ex, R("LSFatal"), R("LCReadError"), R("LCantRead"), R("LCantReadInfo"))); + } } } - - /** - * Returns the JNLPFile for the URL, with error handling. - */ - @Deprecated - private JNLPFile toFile(URL location) throws LaunchException { - try { - JNLPFile file = null; - - try { - file = new JNLPFile(location, (Version) null, true, updatePolicy); // strict - } catch (ParseException ex) { - file = new JNLPFile(location, (Version) null, false, updatePolicy); + - // only here if strict failed but lax did not fail - LaunchException lex = - launchWarning(new LaunchException(file, ex, R("LSMinor"), R("LCFileFormat"), R("LNotToSpec"), R("LNotToSpecInfo"))); - - if (lex != null) - throw lex; - } - - return file; - } catch (Exception ex) { - if (ex instanceof LaunchException) - throw (LaunchException) ex; // already sent to handler when first thrown - else - // IO and Parse - throw launchError(new LaunchException(null, ex, R("LSFatal"), R("LCReadError"), R("LCantRead"), R("LCantReadInfo"))); - } - } - - /** + /** * Launches a JNLP application. This method should be called * from a thread in the application's thread group. */ @@ -998,31 +943,6 @@ }; - /** - * This runnable is used by the <code>launchBackground</code> - * methods to launch a JNLP file from a separate thread. - */ - private class BgRunner implements Runnable { - private JNLPFile file; - private URL location; - - BgRunner(JNLPFile file, URL location) { - this.file = file; - this.location = location; - } - - public void run() { - try { - if (file != null) - launch(file); - if (location != null) - launch(location); - } catch (LaunchException ex) { - // launch method communicates error conditions to the - // handler if it exists, otherwise we don't care because - // there's nothing that can be done about the exception. - } - } - }; + }
--- a/netx/net/sourceforge/jnlp/runtime/Boot.java Thu Jun 20 15:26:14 2013 +0200 +++ b/netx/net/sourceforge/jnlp/runtime/Boot.java Fri Jun 28 14:02:37 2013 +0200 @@ -208,7 +208,7 @@ Launcher launcher = new Launcher(false); launcher.setParserSettings(settings); launcher.setInformationToMerge(extra); - launcher.launch(getFileLocation(), true); + launcher.launch(getFileLocation()); } catch (LaunchException ex) { // default handler prints this } catch (Exception ex) {
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/tests/reproducers/simple/GeneratedId/resources/GeneratedId.jnlp Fri Jun 28 14:02:37 2013 +0200 @@ -0,0 +1,51 @@ +<?xml version="1.0" encoding="utf-8"?> + +<!-- + +This file is part of IcedTea. + +IcedTea is free software; you can redistribute it and/or modify +it under the terms of the GNU General Public License as published by +the Free Software Foundation; either version 2, or (at your option) +any later version. + +IcedTea 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 for more details. + +You should have received a copy of the GNU General Public License +along with IcedTea; see the file COPYING. If not, write to the +Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA +02110-1301 USA. + +Linking this library statically or dynamically with other modules is +making a combined work based on this library. Thus, the terms and +conditions of the GNU General Public License cover the whole +combination. + +As a special exception, the copyright holders of this library give you +permission to link this library with independent modules to produce an +executable, regardless of the license terms of these independent +modules, and to copy and distribute the resulting executable under +terms of your choice, provided that you also meet, for each linked +independent module, the terms and conditions of the license of that +module. An independent module is a module which is not derived from +or based on this library. If you modify this library, you may extend +this exception to your version of the library, but you are not +obligated to do so. If you do not wish to do so, delete this +exception statement from your version. + --> + +<jnlp spec="1.0" codebase="." href="GeneratedId.jnlp"> + <information> + <title>Test Generated Id</title> + <vendor>IcedTea</vendor> + </information> + <resources> + <jar href="GeneratedId.jar" main="true"/> + </resources> + <application-desc main-class="GeneratedId"> + <argument>SomeId</argument> + </application-desc> +</jnlp>
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/tests/reproducers/simple/GeneratedId/srcs/GeneratedId.java Fri Jun 28 14:02:37 2013 +0200 @@ -0,0 +1,44 @@ +/* Copyright (C) 2012 Red Hat, Inc. + +This file is part of IcedTea. + +IcedTea is free software; you can redistribute it and/or +modify it under the terms of the GNU General Public License as published by +the Free Software Foundation, version 2. + +IcedTea 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 for more details. + +You should have received a copy of the GNU General Public License +along with IcedTea; see the file COPYING. If not, write to +the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA +02110-1301 USA. + +Linking this library statically or dynamically with other modules is +making a combined work based on this library. Thus, the terms and +conditions of the GNU General Public License cover the whole +combination. + +As a special exception, the copyright holders of this library give you +permission to link this library with independent modules to produce an +executable, regardless of the license terms of these independent +modules, and to copy and distribute the resulting executable under +terms of your choice, provided that you also meet, for each linked +independent module, the terms and conditions of the license of that +module. An independent module is a module which is not derived from +or based on this library. If you modify this library, you may extend +this exception to your version of the library, but you are not +obligated to do so. If you do not wish to do so, delete this +exception statement from your version. + */ + + +public class GeneratedId { + static public void main(String[] args) { + for(int x = 0; x<args.length; x++){ + System.out.println(x+" - id: "+args[x]); + } + } +}
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/tests/reproducers/simple/GeneratedId/testcases/GeneratedIdTest.java Fri Jun 28 14:02:37 2013 +0200 @@ -0,0 +1,181 @@ +/* Copyright (C) 2012 Red Hat, Inc. + + This file is part of IcedTea. + + IcedTea is free software; you can redistribute it and/or + modify it under the terms of the GNU General Public License as published by + the Free Software Foundation, version 2. + + IcedTea 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 for more details. + + You should have received a copy of the GNU General Public License + along with IcedTea; see the file COPYING. If not, write to + the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA + 02110-1301 USA. + + Linking this library statically or dynamically with other modules is + making a combined work based on this library. Thus, the terms and + conditions of the GNU General Public License cover the whole + combination. + + As a special exception, the copyright holders of this library give you + permission to link this library with independent modules to produce an + executable, regardless of the license terms of these independent + modules, and to copy and distribute the resulting executable under + terms of your choice, provided that you also meet, for each linked + independent module, the terms and conditions of the license of that + module. An independent module is a module which is not derived from + or based on this library. If you modify this library, you may extend + this exception to your version of the library, but you are not + obligated to do so. If you do not wish to do so, delete this + exception statement from your version. + */ + +import java.io.File; +import java.io.FileInputStream; +import java.io.IOException; +import java.util.ArrayList; +import java.util.List; +import junit.framework.Assert; +import net.sourceforge.jnlp.ProcessResult; +import net.sourceforge.jnlp.ServerAccess; +import org.junit.Test; + +public class GeneratedIdTest { + + private static final ServerAccess server = new ServerAccess(); + private static final String okBase = "0 - id: "; + private static final String someId1 = "SomeId"; + private static final String someId2 = "AnotherId"; + private static final String okBase1 = okBase + someId1; + private static final String okBase2 = okBase + someId2; + private static final String baseName1 = "GeneratedId.jnlp"; + private static final String baseName1_noHref = "GeneratedIdNoHref.jnlp"; + private static final String baseName2 = "GeneratedId_1_tmp.jnlp"; + private static final String baseName2_noHref = "GeneratedIdNoHref_1_tmp.jnlp"; + + public static File prepareChangedFileWithHref() throws IOException { + File src = new File(server.getDir(), baseName1); + File dest = new File(server.getDir(), baseName2); + String srcJnlp = ServerAccess.getContentOfStream(new FileInputStream(src)); + ServerAccess.saveFile(srcJnlp.replace(someId1, someId2), dest); + return dest; + } + + public static File prepareChangedFileNoHref() throws IOException { + File src = new File(server.getDir(), baseName1); + File dest = new File(server.getDir(), baseName2_noHref); + String srcJnlp = ServerAccess.getContentOfStream(new FileInputStream(src)); + ServerAccess.saveFile(srcJnlp.replace(someId1, someId2).replace("href=\"GeneratedId.jnlp\"", ""), dest); + return dest; + } + + public static File prepareCopiedFileNoHref() throws IOException { + File src = new File(server.getDir(), baseName1); + File dest = new File(server.getDir(), baseName1_noHref); + String srcJnlp = ServerAccess.getContentOfStream(new FileInputStream(src)); + ServerAccess.saveFile(srcJnlp.replace("href=\"GeneratedId.jnlp\"", ""), dest); + return dest; + } + + @Test + //have href + //is local + //should be redownloaded + //href points to different file + public void launchLocalChangedFileWithHref() throws Exception { + File dest = prepareChangedFileWithHref(); + List<String> l = new ArrayList<String>(3); + l.add(server.getJavawsLocation()); + l.add(ServerAccess.HEADLES_OPTION); + l.add(dest.getAbsolutePath()); + ProcessResult pr = ServerAccess.executeProcess(l); + Assert.assertTrue("Stdout should contain '" + okBase1 + "', but did not.", pr.stdout.contains(okBase1)); + } + + @Test + //do not have href + //is local + //should NOT be redownloaded + public void launchLocalChangedFileWithNoHref() throws Exception { + File dest = prepareChangedFileNoHref(); + List<String> l = new ArrayList<String>(3); + l.add(server.getJavawsLocation()); + l.add(ServerAccess.HEADLES_OPTION); + l.add(dest.getAbsolutePath()); + ProcessResult pr = ServerAccess.executeProcess(l); + Assert.assertTrue("Stdout should contain '" + okBase2 + "', but did not.", pr.stdout.contains(okBase2)); + } + + @Test + //do have href + //is local + //should be redownloaded (how to verify!?!) + public void launchLocalFileWithHref() throws Exception { + File dest = new File(server.getDir(), baseName1); + List<String> l = new ArrayList<String>(3); + l.add(server.getJavawsLocation()); + l.add(ServerAccess.HEADLES_OPTION); + l.add(dest.getAbsolutePath()); + ProcessResult pr = ServerAccess.executeProcess(l); + Assert.assertTrue("Stdout should contain '" + okBase1 + "', but did not.", pr.stdout.contains(okBase1)); + } + + @Test + //do not have href + //is local + //should NOT be redownloaded (how to verify!?!) + public void launchLocalFileNoHref() throws Exception { + File dest = prepareCopiedFileNoHref(); + List<String> l = new ArrayList<String>(3); + l.add(server.getJavawsLocation()); + l.add(ServerAccess.HEADLES_OPTION); + l.add(dest.getAbsolutePath()); + ProcessResult pr = ServerAccess.executeProcess(l); + Assert.assertTrue("Stdout should contain '" + okBase1 + "', but did not.", pr.stdout.contains(okBase1)); + } + + @Test + //remote + //have href + //should not be redownloaded (how to verify!?!) + //href is same file + public void launchRemoteFileWithHref() throws Exception { + ProcessResult pr = server.executeJavawsHeadless("/" + baseName1); + Assert.assertTrue("Stdout should contain '" + okBase1 + "', but did not.", pr.stdout.contains(okBase1)); + } + + //remote + //have href + //should NOT be redownloaded + //href is different file + @Test + public void launchRemoteChangedFileWithHref() throws Exception { + File f = prepareChangedFileWithHref(); + ProcessResult pr = server.executeJavawsHeadless("/" + f.getName()); + Assert.assertTrue("Stdout should contain '" + okBase2 + "', but did not.", pr.stdout.contains(okBase2)); + } + + @Test + //remote + //have not href + //should not be redownloaded (how to verify!?!) + public void launchRemoteFileWithNoHref() throws Exception { + File f = prepareCopiedFileNoHref(); + ProcessResult pr = server.executeJavawsHeadless("/" + f.getName()); + Assert.assertTrue("Stdout should contain '" + okBase1 + "', but did not.", pr.stdout.contains(okBase1)); + } + + //remote + //have not href + //should NOT be redownloaded + @Test + public void launchRemoteChangedFileWithNoHref() throws Exception { + File f = prepareChangedFileNoHref(); + ProcessResult pr = server.executeJavawsHeadless("/" + f.getName()); + Assert.assertTrue("Stdout should contain '" + okBase2 + "', but did not.", pr.stdout.contains(okBase2)); + } +}
--- a/tests/test-extensions/net/sourceforge/jnlp/TinyHttpdImpl.java Thu Jun 20 15:26:14 2013 +0200 +++ b/tests/test-extensions/net/sourceforge/jnlp/TinyHttpdImpl.java Fri Jun 28 14:02:37 2013 +0200 @@ -114,8 +114,15 @@ o.writeBytes("HTTP/1.0 "+HttpURLConnection.HTTP_NOT_IMPLEMENTED+" Not Implemented\n"); continue; } - + + String request = "unknown"; if (isGetRequest || isHeadRequest ) { + if (isGetRequest){ + request = "GET"; + } + if (isHeadRequest){ + request = "HEAD"; + } StringTokenizer t = new StringTokenizer(s, " "); t.nextToken(); String op = t.nextToken(); @@ -123,11 +130,11 @@ if (p.startsWith(XSX)) { p = p.replace(XSX, "/"); } - ServerAccess.logNoReprint("Getting: " + p); + ServerAccess.logOutputReprint("Getting- " + request + ": " + p); p = URLDecoder.decode(p, "UTF-8"); p = p.replaceAll("\\?.*", ""); p = (".".concat((p.endsWith("/")) ? p.concat("index.html") : p)).replace('/', File.separatorChar); - ServerAccess.logNoReprint("Serving: " + p); + ServerAccess.logOutputReprint("Serving- " + request + ": " + p); File pp = new File(dir, p); int l = (int) pp.length(); byte[] b = new byte[l];