« Return to Thread: [rfc][icedtea-web] closing listener idea

Re: [rfc][icedtea-web] closing listener idea

by Jiri Vanek :: Rate this Message:

| View in Thread

On 08/14/2012 05:50 PM, Adam Domurad wrote:

> On Tue, 2012-08-14 at 17:06 +0200, Jiri Vanek wrote:
>> This idea should speed up browser tests a lot. When all conditions for pass/failure are done, browser is terminated and is not waiting for time-out any more.
>> It is bringing some more load to tester, but its usage is mandatory.
> Thanks very much for the ideas!
>
> It would have been nice if it were like this from the beginning - but
> nevertheless this would be a great improvement.
>
> I'm 100% for converting all tests to this form, and mandating it for
> future applet tests. I'm sure as the most frequent runner of the test
> suite you can agree, at least for mandating it for future tests :)
Definitely! I will need some helpt to get it to tests in head ;)

>
>>
>> Usage here is demonstrated on simple applet test.
>> Any ideas (especially how to avoid doubled "contains" or "matches") welcomed.
>>
>> J.
>>
>> * tests/reproducers/simple/AppletTest/testcases/AppletTestTests.java: Integrated ClosingListener speed-up.
>> * tests/test-extensions/net/sourceforge/jnlp/ClosingListener.java: New file, interface for all ClosingListeners.
>> * tests/test-extensions/net/sourceforge/jnlp/CountingClosingListener.java: Implementation of ClsoingListeners which is storing copy of complete output of program.
>> * tests/test-extensions/net/sourceforge/jnlp/ProcessAssasin.java: added (setTimeout) method as cleanest possibility to terminate process immediately
>> * tests/test-extensions/net/sourceforge/jnlp/ServerAccess.java: new method (setUpClosingListener) for setting necessary variables in ClosingListener
>
> This method is nice enough, although is it possible to have a
> standardized way to see if an exception has caused the applet to stop ?
>
> I'm very much in favour of adding a clear end marker to the end of tests
> rather than duplicating contains/matches. If you don't like a hardcoded
> ending message, then, what if we had a closing listener implementation
> that takes a single string as an argument, and a string is printed at
> the end of the applet. Custom closing listeners could always also be
> created.
>
I'm little bit against using such a constants (which must be copy pasted into reproducer to complete
the evil ) but I admit it canhel a lot. But I would recommend to be careful with such a simple
"terminator" - as exception can be thrown "later".

Anyway some idea how to integrate this is in this updated patch.

I have posted also one more idea to patch, and although it eliminates duplicity, it have quite a lot
of code :-/.

Both new apporaches shown in AppletTestSigned

thanx for discussion,

J.


Ps - I have not tested this new code due to lack of time today so be patient with it. I will do in
friday. I'm posting it for you to get the feedback for more ideas!

[closingListener2.diff]

diff -r 04eddc48a74f tests/reproducers/signed/AppletTestSigned/resources/AppletTestSigned.html
--- a/tests/reproducers/signed/AppletTestSigned/resources/AppletTestSigned.html Tue Aug 14 16:06:38 2012 -0400
+++ b/tests/reproducers/signed/AppletTestSigned/resources/AppletTestSigned.html Wed Aug 15 18:52:27 2012 +0200
@@ -37,7 +37,7 @@
  -->
 <html><head></head><body bgcolor="red">
 <p>
-  <applet code="AppletTestSigned.class" archive="XslowXAppletTestSigned.jar" codebase="." width="100" height="100">
+  <applet code="AppletTestSigned.class" archive="AppletTestSigned.jar" codebase="." width="100" height="100">
     <param name="key1" value="value1">
     <param name="key2" value="#value2">
   </applet>
diff -r 04eddc48a74f tests/reproducers/signed/AppletTestSigned/resources/AppletTestSigned2.html
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/tests/reproducers/signed/AppletTestSigned/resources/AppletTestSigned2.html Wed Aug 15 18:52:27 2012 +0200
@@ -0,0 +1,46 @@
+<!--
+
+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.
+
+ -->
+<html><head></head><body bgcolor="red">
+<p>
+  <applet code="AppletTestSigned.class" archive="XslowXAppletTestSigned.jar" codebase="." width="100" height="100">
+    <param name="key1" value="value1">
+    <param name="key2" value="#value2">
+  </applet>
+</p>
+</body>
+</html>
diff -r 04eddc48a74f tests/reproducers/signed/AppletTestSigned/srcs/AppletTestSigned.java
--- a/tests/reproducers/signed/AppletTestSigned/srcs/AppletTestSigned.java Tue Aug 14 16:06:38 2012 -0400
+++ b/tests/reproducers/signed/AppletTestSigned/srcs/AppletTestSigned.java Wed Aug 15 18:52:27 2012 +0200
@@ -48,6 +48,7 @@
             try {
                 Thread.sleep(n);
                 System.out.println("AppletTestSigned killing himself after " + n + " ms of life");
+                System.out.println("*** APPLET FINISHED ***");
                 System.exit(0);
             } catch (Exception ex) {
             }
diff -r 04eddc48a74f tests/reproducers/signed/AppletTestSigned/testcases/AppletTestSignedTests.java
--- a/tests/reproducers/signed/AppletTestSigned/testcases/AppletTestSignedTests.java Tue Aug 14 16:06:38 2012 -0400
+++ b/tests/reproducers/signed/AppletTestSigned/testcases/AppletTestSignedTests.java Wed Aug 15 18:52:27 2012 +0200
@@ -43,6 +43,8 @@
 import net.sourceforge.jnlp.browsertesting.BrowserTest;
 import net.sourceforge.jnlp.browsertesting.Browsers;
 import net.sourceforge.jnlp.annotations.TestInBrowsers;
+import net.sourceforge.jnlp.closinglisteners.Rule;
+import net.sourceforge.jnlp.closinglisteners.RulesFolowingClosingListener;
 import org.junit.Assert;
 
 import org.junit.Test;
@@ -50,6 +52,19 @@
 public class AppletTestSignedTests extends BrowserTest {
 
     private final List<String> l = Collections.unmodifiableList(Arrays.asList(new String[]{"-Xtrustall"}));
+    private static final String ss = "xception";
+    private static final String s0 = "AppletTestSigned was started";
+    private static final String s1 = "value1";
+    private static final String s2 = "value2";
+    private static final String s3 = "AppletTestSigned was initialised";
+    private static final String s7 = "AppletTestSigned killing himself after 2000 ms of life";
+    private static final RulesFolowingClosingListener.ContainsRule crss = new RulesFolowingClosingListener.ContainsRule(ss);
+    private static final RulesFolowingClosingListener.ContainsRule s0ss = new RulesFolowingClosingListener.ContainsRule(s0);
+    private static final RulesFolowingClosingListener.ContainsRule s1ss = new RulesFolowingClosingListener.ContainsRule(s1);
+    private static final RulesFolowingClosingListener.ContainsRule s2ss = new RulesFolowingClosingListener.ContainsRule(s2);
+    private static final RulesFolowingClosingListener.ContainsRule s3ss = new RulesFolowingClosingListener.ContainsRule(s3);
+    private static final RulesFolowingClosingListener.ContainsRule s7ss = new RulesFolowingClosingListener.ContainsRule(s7);
+    private static final Rule[] rules = new Rule[]{crss, s0ss, s1ss, s2ss, s3ss, s7ss};
 
     @Test
     public void AppletTestSignedTest() throws Exception {
@@ -60,18 +75,12 @@
     }
 
     private void evaluateSignedApplet(ProcessResult pr, boolean javawsApplet) {
-        String s3 = "AppletTestSigned was initialised";
-        Assert.assertTrue("AppletTestSigned stdout should contain " + s3 + " but didn't", pr.stdout.contains(s3));
-        String s0 = "AppletTestSigned was started";
-        Assert.assertTrue("AppletTestSigned stdout should contain " + s0 + " but didn't", pr.stdout.contains(s0));
-        String s1 = "value1";
-        Assert.assertTrue("AppletTestSigned stdout should contain " + s1 + " but didn't", pr.stdout.contains(s1));
-        String s2 = "value2";
-        Assert.assertTrue("AppletTestSigned stdout should contain " + s2 + " but didn't", pr.stdout.contains(s2));
-        String ss = "xception";
-        Assert.assertFalse("AppletTestSigned stderr should not contain " + ss + " but did", pr.stderr.contains(ss));
-        String s7 = "AppletTestSigned killing himself after 2000 ms of life";
-        Assert.assertTrue("AppletTestSigned stdout should contain " + s7 + " but didn't", pr.stdout.contains(s7));
+        Assert.assertTrue("AppletTestSigned stdout " + s3ss.toString() + " but didn't", s3ss.evaluate(pr.stdout));
+        Assert.assertTrue("AppletTestSigned stdout " + s0ss.toString() + " but didn't", s0ss.evaluate(pr.stdout));
+        Assert.assertTrue("AppletTestSigned stdout " + s1ss.toString() + " but didn't", s1ss.evaluate(pr.stdout));
+        Assert.assertTrue("AppletTestSigned stdout " + s2ss.toString() + " but didn't", s2ss.evaluate(pr.stdout));
+        Assert.assertFalse("AppletTestSigned stderr " + crss.toNotString() + " but did", crss.evaluate(pr.stderr));
+        Assert.assertTrue("AppletTestSigned stdout " + s7ss.toString() + " but didn't", s7ss.evaluate(pr.stdout));
         if (!javawsApplet) {
             /*this is working correctly in most browser, but not in all. temporarily disabling
             String s4 = "AppletTestSigned was stopped";
@@ -84,10 +93,10 @@
 
     @Test
     @TestInBrowsers(testIn = {Browsers.all})
-    public void AppletTestSignedFirefoxTest() throws Exception {
+    public void AppletTestSignedFirefoxTestXslowX() throws Exception {
         ServerAccess.PROCESS_TIMEOUT = 30 * 1000;
         try {
-            ProcessResult pr = server.executeBrowser("/AppletTestSigned.html");
+            ProcessResult pr = server.executeBrowser("/AppletTestSigned.html",new RulesFolowingClosingListener(rules),new RulesFolowingClosingListener(rules));
             evaluateSignedApplet(pr, false);
             Assert.assertTrue(pr.wasTerminated);
             //Assert.assertEquals((Integer) 0, pr.returnValue); due to destroy is null
@@ -95,4 +104,13 @@
             ServerAccess.PROCESS_TIMEOUT = 20 * 1000; //back to normal
         }
     }
+
+    @Test
+    @TestInBrowsers(testIn = {Browsers.all})
+    public void AppletTestSignedFirefoxTest() throws Exception {
+        ProcessResult pr = server.executeBrowser("/AppletTestSigned2.html", ServerAccess.AutoClose.CLOSE_ON_BOTH);
+        evaluateSignedApplet(pr, false);
+        Assert.assertTrue(pr.wasTerminated);
+        //Assert.assertEquals((Integer) 0, pr.returnValue); due to destroy is null
+    }
 }
diff -r 04eddc48a74f tests/reproducers/simple/AppletTest/testcases/AppletTestTests.java
--- a/tests/reproducers/simple/AppletTest/testcases/AppletTestTests.java Tue Aug 14 16:06:38 2012 -0400
+++ b/tests/reproducers/simple/AppletTest/testcases/AppletTestTests.java Wed Aug 15 18:52:27 2012 +0200
@@ -35,6 +35,7 @@
 exception statement from your version.
  */
 
+import net.sourceforge.jnlp.closinglisteners.CountingClosingListener;
 import net.sourceforge.jnlp.ProcessResult;
 import net.sourceforge.jnlp.ServerAccess;
 import net.sourceforge.jnlp.browsertesting.BrowserTest;
@@ -47,6 +48,24 @@
 
 public class AppletTestTests extends BrowserTest {
 
+    private final String s7 = "Aplet killing himself after 2000 ms of life";
+    private final String ss = "xception";
+    private final String s2 = "value2";
+    private final String s1 = "value1";
+    private final String s0 = "applet was started";
+    private final String s3 = "applet was initialised";
+
+    private class CountingClosingListenerImpl extends CountingClosingListener {
+
+        @Override
+        protected boolean isAlowedToFinish(String s) {
+            if (s.contains(ss)) {
+                return true;
+            }
+            return (s.contains(s0) && s.contains(s1) && s.contains(s2) && s.contains(s3) && s.contains(s7));
+        }
+    }
+
     @Test
     @TestInBrowsers(testIn = {Browsers.googleChrome})
     @NeedsDisplay
@@ -55,7 +74,7 @@
         try {
             //System.out.println("connecting AppletInFirefoxTest request in " + getBrowser().toString());
             //just verify loging is recording browser
-            ProcessResult pr1 = server.executeBrowser("/appletAutoTests.html");
+            ProcessResult pr1 = server.executeBrowser("/appletAutoTests2.html", new CountingClosingListenerImpl(), new CountingClosingListenerImpl());
             if (pr1.process == null) {
                 Assert.assertTrue("If proces was null here, then google-chrome had to not exist, and so "
                         + ServerAccess.UNSET_BROWSER
@@ -64,12 +83,12 @@
                         pr1.deadlyException.getMessage().contains(ServerAccess.UNSET_BROWSER));
                 return;
             }
-            evaluateApplet(pr1,false);
+            evaluateApplet(pr1, false);
             Assert.assertTrue(pr1.wasTerminated);
             //System.out.println("connecting AppletInFirefoxTest request in " + getBrowser().toString());
             // just verify loging is recording browser
-            ServerAccess.ProcessResult pr = server.executeBrowser("/appletAutoTests.html");
-            evaluateApplet(pr,false);
+            ServerAccess.ProcessResult pr = server.executeBrowser("/appletAutoTests2.html", new CountingClosingListenerImpl(), new CountingClosingListenerImpl());
+            evaluateApplet(pr, false);
             Assert.assertTrue(pr.wasTerminated);
         } finally {
             ServerAccess.PROCESS_TIMEOUT = 20 * 1000; //back to normal
@@ -80,30 +99,24 @@
     @NeedsDisplay
     public void AppletTest() throws Exception {
         ProcessResult pr = server.executeJavawsHeadless(null, "/AppletTest.jnlp");
-        evaluateApplet(pr,true);
+        evaluateApplet(pr, true);
         Assert.assertFalse(pr.wasTerminated);
         Assert.assertEquals((Integer) 0, pr.returnValue);
     }
 
     private void evaluateApplet(ProcessResult pr, boolean javawsApplet) {
-        String s3 = "applet was initialised";
         Assert.assertTrue("AppletTest stdout should contains " + s3 + " bud didn't", pr.stdout.contains(s3));
-        String s0 = "applet was started";
         Assert.assertTrue("AppletTest stdout should contains " + s0 + " bud didn't", pr.stdout.contains(s0));
-        String s1 = "value1";
         Assert.assertTrue("AppletTest stdout should contains " + s1 + " bud didn't", pr.stdout.contains(s1));
-        String s2 = "value2";
         Assert.assertTrue("AppletTest stdout should contains " + s2 + " bud didn't", pr.stdout.contains(s2));
-        String ss = "xception";
         Assert.assertFalse("AppletTest stderr should not contains " + ss + " but did", pr.stderr.contains(ss));
-        String s7 = "Aplet killing himself after 2000 ms of life";
         Assert.assertTrue("AppletTest stdout should contains " + s7 + " bud didn't", pr.stdout.contains(s7));
         if (!javawsApplet) {
             /*this is working correctly in most browser, but not in all. temporarily disabling
-        String s4 = "applet was stopped";
-        Assert.assertTrue("AppletTest stdout should contains " + s4 + " bud did't", pr.stdout.contains(s4));
-        String s5 = "applet will be destroyed";
-        Assert.assertTrue("AppletTest stdout should contains " + s5 + " bud did't", pr.stdout.contains(s5));
+            String s4 = "applet was stopped";
+            Assert.assertTrue("AppletTest stdout should contains " + s4 + " bud did't", pr.stdout.contains(s4));
+            String s5 = "applet will be destroyed";
+            Assert.assertTrue("AppletTest stdout should contains " + s5 + " bud did't", pr.stdout.contains(s5));
              */
         }
     }
@@ -116,8 +129,8 @@
         //just verify loging is recordingb rowser
         ServerAccess.PROCESS_TIMEOUT = 30 * 1000;
         try {
-            ProcessResult pr = server.executeBrowser("/appletAutoTests2.html");
-            evaluateApplet(pr,false);
+            ProcessResult pr = server.executeBrowser("/appletAutoTests2.html", new CountingClosingListenerImpl(), new CountingClosingListenerImpl());
+            evaluateApplet(pr, false);
             Assert.assertTrue(pr.wasTerminated);
             //Assert.assertEquals((Integer) 0, pr.returnValue); due to destroy is null
         } finally {
@@ -132,9 +145,9 @@
         //just verify loging is recording browser
         ServerAccess.PROCESS_TIMEOUT = 30 * 1000;
         try {
-            ProcessResult pr = server.executeBrowser("/appletAutoTests.html");
+            ProcessResult pr = server.executeBrowser("/appletAutoTests.html", new CountingClosingListenerImpl(), new CountingClosingListenerImpl());
             pr.process.destroy();
-            evaluateApplet(pr,false);
+            evaluateApplet(pr, false);
             Assert.assertTrue(pr.wasTerminated);
             //Assert.assertEquals((Integer) 0, pr.returnValue); due to destroy is null
         } finally {
diff -r 04eddc48a74f tests/test-extensions/net/sourceforge/jnlp/ClosingListener.java
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/tests/test-extensions/net/sourceforge/jnlp/ClosingListener.java Wed Aug 15 18:52:27 2012 +0200
@@ -0,0 +1,55 @@
+/* ClosingListener.java
+Copyright (C) 2011 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.
+ */
+package net.sourceforge.jnlp;
+
+public abstract class ClosingListener implements ContentReaderListener {
+
+    private ThreadedProcess process;
+    private ProcessAssasin assasin;
+
+    void setProcess(ThreadedProcess p) {
+        this.process = p;
+    }
+
+    void setAssasin(ProcessAssasin assasin) {
+        this.assasin = assasin;
+    }
+
+    public void terminate() {
+        assasin.setTimeout(Long.MIN_VALUE);
+    }
+}
diff -r 04eddc48a74f tests/test-extensions/net/sourceforge/jnlp/ProcessAssasin.java
--- a/tests/test-extensions/net/sourceforge/jnlp/ProcessAssasin.java Tue Aug 14 16:06:38 2012 -0400
+++ b/tests/test-extensions/net/sourceforge/jnlp/ProcessAssasin.java Wed Aug 15 18:52:27 2012 +0200
@@ -98,6 +98,11 @@
         return skipInstedOfDesroy;
     }
 
+    void setTimeout(long timeout) {
+        this.timeout = timeout;
+    }
+
+
     @Override
     public void run() {
         long startTime = System.nanoTime() / ServerAccess.NANO_TIME_DELIMITER;
diff -r 04eddc48a74f tests/test-extensions/net/sourceforge/jnlp/ServerAccess.java
--- a/tests/test-extensions/net/sourceforge/jnlp/ServerAccess.java Tue Aug 14 16:06:38 2012 -0400
+++ b/tests/test-extensions/net/sourceforge/jnlp/ServerAccess.java Wed Aug 15 18:52:27 2012 +0200
@@ -1,5 +1,5 @@
 /* ServerAccess.java
-Copyright (C) 2011 Red Hat, Inc.
+Copyright (C) 2011, 2012 Red Hat, Inc.
 
 This file is part of IcedTea.
 
@@ -58,6 +58,7 @@
 import net.sourceforge.jnlp.browsertesting.Browser;
 import net.sourceforge.jnlp.browsertesting.BrowserFactory;
 import net.sourceforge.jnlp.browsertesting.Browsers;
+import net.sourceforge.jnlp.closinglisteners.AutoErrorClosingListener;
 import org.junit.Assert;
 
 /**
@@ -77,6 +78,11 @@
  */
 public class ServerAccess {
 
+    public enum AutoClose {
+
+        CLOSE_ON_EXCEPTION, CLOSE_ON_CORRECT_END, CLOSE_ON_BOTH
+    }
+
     public static final long NANO_TIME_DELIMITER=1000000l;
     /**
      * java property which value containing path to default (makefile by) directory with deployed resources
@@ -544,6 +550,20 @@
     public ProcessResult executeJavaws(String resource,ContentReaderListener stdoutl,ContentReaderListener stderrl) throws Exception {
         return executeJavaws(null, resource,stdoutl,stderrl);
     }
+
+    public net.sourceforge.jnlp.ProcessResult executeBrowser(String string, AutoClose autoClose) throws Exception {
+        ClosingListener errClosing = null;
+        ClosingListener outClosing = null;
+        if (autoClose == AutoClose.CLOSE_ON_BOTH || autoClose == AutoClose.CLOSE_ON_EXCEPTION){
+            errClosing=new AutoErrorClosingListener();
+        }
+        if (autoClose == AutoClose.CLOSE_ON_BOTH || autoClose == AutoClose.CLOSE_ON_CORRECT_END){
+            errClosing=new AutoErrorClosingListener();
+        }
+        return executeBrowser(string, outClosing, errClosing);
+    }
+    
+
     public ProcessResult executeBrowser(String resource) throws Exception {
         return executeBrowser(getBrowserParams(), resource);
     }
@@ -788,6 +808,8 @@
             log(connectionMesaage, true, true);
         }
         ProcessAssasin pa = new ProcessAssasin(t, PROCESS_TIMEOUT);
+        setUpClosingListener(stdoutl, pa, t);
+        setUpClosingListener(stderrl, pa, t);
         pa.start();
         t.start();
         while (t.getP() == null && t.deadlyException == null) {
@@ -825,6 +847,13 @@
         return pr;
     }
 
+     private static void setUpClosingListener(ContentReaderListener listener, ProcessAssasin pa, ThreadedProcess t) {
+        if (listener != null && (listener instanceof ClosingListener)) {
+            ((ClosingListener) listener).setAssasin(pa);
+            ((ClosingListener) listener).setProcess(t);
+        }
+    }
+
     /**
      * this is temprary solution until refactoring is fully done
      * Use  net.sourceforge.jnlp.ProcessResult instead
diff -r 04eddc48a74f tests/test-extensions/net/sourceforge/jnlp/closinglisteners/AutoAllClosingListener.java
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/tests/test-extensions/net/sourceforge/jnlp/closinglisteners/AutoAllClosingListener.java Wed Aug 15 18:52:27 2012 +0200
@@ -0,0 +1,57 @@
+/* CountingClosingListener.java
+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.
+ */
+package net.sourceforge.jnlp.closinglisteners;
+
+import net.sourceforge.jnlp.ClosingListener;
+
+public  class AutoAllClosingListener extends ClosingListener {
+
+    
+
+    @Override
+    public void charReaded(char ch) {
+
+    }
+
+    @Override
+    public void lineReaded(String s) {
+       if (s.contains(AutoErrorClosingListener.MAGICAL_ERROR_CLOSING_STRING) || s.contains(AutoOkClosingListener.MAGICAL_OK_CLOSING_STRING)){
+           terminate();
+       }
+    }
+  
+}
diff -r 04eddc48a74f tests/test-extensions/net/sourceforge/jnlp/closinglisteners/AutoErrorClosingListener.java
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/tests/test-extensions/net/sourceforge/jnlp/closinglisteners/AutoErrorClosingListener.java Wed Aug 15 18:52:27 2012 +0200
@@ -0,0 +1,57 @@
+/* AutoErrorClosingListener.java
+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.
+ */
+package net.sourceforge.jnlp.closinglisteners;
+
+import net.sourceforge.jnlp.ClosingListener;
+
+public  class AutoErrorClosingListener extends ClosingListener {
+
+    public static final String MAGICAL_ERROR_CLOSING_STRING = "xception";
+
+    @Override
+    public void charReaded(char ch) {
+
+    }
+
+    @Override
+    public void lineReaded(String s) {
+       if (s.contains(MAGICAL_ERROR_CLOSING_STRING)){
+           terminate();
+       }
+    }
+
+}
diff -r 04eddc48a74f tests/test-extensions/net/sourceforge/jnlp/closinglisteners/AutoOkClosingListener.java
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/tests/test-extensions/net/sourceforge/jnlp/closinglisteners/AutoOkClosingListener.java Wed Aug 15 18:52:27 2012 +0200
@@ -0,0 +1,57 @@
+/* CountingClosingListener.java
+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.
+ */
+package net.sourceforge.jnlp.closinglisteners;
+
+import net.sourceforge.jnlp.ClosingListener;
+
+public  class AutoOkClosingListener extends ClosingListener {
+
+    public static final String MAGICAL_OK_CLOSING_STRING = "*** APPLET FINISHED ***";
+
+    @Override
+    public void charReaded(char ch) {
+
+    }
+
+    @Override
+    public void lineReaded(String s) {
+       if (s.contains(MAGICAL_OK_CLOSING_STRING)){
+           terminate();
+       }
+    }
+  
+}
diff -r 04eddc48a74f tests/test-extensions/net/sourceforge/jnlp/closinglisteners/CountingClosingListener.java
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/tests/test-extensions/net/sourceforge/jnlp/closinglisteners/CountingClosingListener.java Wed Aug 15 18:52:27 2012 +0200
@@ -0,0 +1,60 @@
+/* CountingClosingListener.java
+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.
+ */
+package net.sourceforge.jnlp.closinglisteners;
+
+import net.sourceforge.jnlp.ClosingListener;
+
+public abstract class CountingClosingListener extends ClosingListener {
+
+    protected StringBuilder sb = new StringBuilder();
+
+    @Override
+    public void charReaded(char ch) {
+        sb.append(ch);
+        if (isAlowedToFinish(sb.toString())) {
+            terminate();
+        }
+
+    }
+
+    @Override
+    public void lineReaded(String s) {
+        //nothing to do
+    }
+
+    protected abstract boolean isAlowedToFinish(String content);
+}
diff -r 04eddc48a74f tests/test-extensions/net/sourceforge/jnlp/closinglisteners/Rule.java
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/tests/test-extensions/net/sourceforge/jnlp/closinglisteners/Rule.java Wed Aug 15 18:52:27 2012 +0200
@@ -0,0 +1,44 @@
+/* Rule.java
+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.
+*/
+package net.sourceforge.jnlp.closinglisteners;
+
+public interface Rule<S,T> {
+
+    public void setRule(S rule);
+    public boolean evaluate(T upon);
+
+}
diff -r 04eddc48a74f tests/test-extensions/net/sourceforge/jnlp/closinglisteners/RulesFolowingClosingListener.java
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/tests/test-extensions/net/sourceforge/jnlp/closinglisteners/RulesFolowingClosingListener.java Wed Aug 15 18:52:27 2012 +0200
@@ -0,0 +1,171 @@
+/* RulesFolowingClosingListener.java
+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.
+ */
+package net.sourceforge.jnlp.closinglisteners;
+
+import java.util.ArrayList;
+import java.util.Arrays;
+import java.util.List;
+
+public class RulesFolowingClosingListener extends CountingClosingListener {
+
+    private List<Rule> rules = new ArrayList<Rule>();
+
+    public static class ContainsRule extends StringRule<String, String> {
+
+        public ContainsRule(String s) {
+            super(s);
+        }
+
+        @Override
+        public boolean evaluate(String upon) {
+            return (upon.contains(rule));
+        }
+
+        @Override
+        public String toString() {
+            return "should contains `" + rule + "`";
+        }
+
+        public String toNotString() {
+            return "should NOT contains `" + rule + "`";
+        }
+    }
+
+    public static class NotContainsRule extends StringRule<String, String> {
+
+        public NotContainsRule(String s) {
+            super(s);
+        }
+
+        @Override
+        public boolean evaluate(String upon) {
+            return !(upon.contains(rule));
+        }
+
+        @Override
+        public String toString() {
+            return "should NOT contains `" + rule + "`";
+        }
+
+        public String toNotString() {
+            return "should contains `" + rule + "`";
+        }
+    }
+
+    public static class MatchesRule extends StringRule<String, String> {
+
+        public MatchesRule(String s) {
+            super(s);
+        }
+
+        @Override
+        public boolean evaluate(String upon) {
+            return (upon.matches(rule));
+        }
+
+        @Override
+        public String toString() {
+            return "should match `" + rule + "`";
+        }
+
+        public String toNotString() {
+            return "should NOT match `" + rule + "`";
+        }
+    }
+
+    public static class NotMatchesRule extends StringRule<String, String> {
+
+        public NotMatchesRule(String s) {
+            super(s);
+        }
+
+        @Override
+        public boolean evaluate(String upon) {
+            return !(upon.matches(rule));
+        }
+
+        @Override
+        public String toString() {
+            return "should NOT match`" + rule + "`";
+        }
+
+        public String toNotString() {
+            return "should match`" + rule + "`";
+        }
+    }
+
+    public void addRule(Rule rule) {
+        this.rules.add(rule);
+    }
+
+    public RulesFolowingClosingListener() {
+    }
+
+    public RulesFolowingClosingListener(List<Rule> l) {
+        setRules(rules);
+    }
+
+    public RulesFolowingClosingListener(Rule[] l) {
+        setRules(rules);
+    }
+
+    public void setRules(List<Rule> rules) {
+        if (rules == null) {
+            throw new NullPointerException("rules cant be null");
+        }
+        this.rules = rules;
+    }
+
+    public void setRules(Rule[] rules) {
+        if (rules == null) {
+            throw new NullPointerException("rules cant be null");
+        }
+        this.rules = Arrays.asList(rules);
+    }
+
+    @Override
+    protected boolean isAlowedToFinish(String content) {
+        for (Rule rule : rules) {
+            if (!rule.evaluate(content)) {
+                return false;
+            }
+        }
+        return true;
+
+
+    }
+}
diff -r 04eddc48a74f tests/test-extensions/net/sourceforge/jnlp/closinglisteners/StringRule.java
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/tests/test-extensions/net/sourceforge/jnlp/closinglisteners/StringRule.java Wed Aug 15 18:52:27 2012 +0200
@@ -0,0 +1,57 @@
+/* StringRule.java
+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.
+*/
+package net.sourceforge.jnlp.closinglisteners;
+
+public abstract class StringRule<String,T>  implements Rule<String, T>{
+    protected String rule;
+
+    public StringRule(String rule) {
+        setRule(rule);
+    }
+
+    public StringRule() {
+    }
+
+
+    @Override
+    public void setRule(String rule){
+        this.rule=rule;
+    }
+    @Override
+    public abstract boolean evaluate(T upon);
+
+}

 « Return to Thread: [rfc][icedtea-web] closing listener idea