Remove Script class

The Script class was created in an attempt to have a simple way to share
script code for ClientListener without transporting it multiple times
within one session, while also allow using the code in other ways.
However, this is more easily achieved registering the code as a resource
and loading it either by JavaScriptLoader or a (later on) a new
ClientListener API. This also allows caching the code.
diff --git a/bundles/org.eclipse.rap.clientscripting.demo/src/org/eclipse/rap/clientscripting/demo/CustomBehaviors.java b/bundles/org.eclipse.rap.clientscripting.demo/src/org/eclipse/rap/clientscripting/demo/CustomBehaviors.java
index 2e339df..c936423 100644
--- a/bundles/org.eclipse.rap.clientscripting.demo/src/org/eclipse/rap/clientscripting/demo/CustomBehaviors.java
+++ b/bundles/org.eclipse.rap.clientscripting.demo/src/org/eclipse/rap/clientscripting/demo/CustomBehaviors.java
@@ -10,11 +10,15 @@
  ******************************************************************************/
 package org.eclipse.rap.clientscripting.demo;
 
+import java.io.IOException;
+import java.io.InputStream;
+
 import org.eclipse.rap.clientscripting.ClientListener;
-import org.eclipse.rap.clientscripting.Script;
 import org.eclipse.rap.clientscripting.WidgetDataWhiteList;
 import org.eclipse.rap.rwt.RWT;
+import org.eclipse.rap.rwt.client.service.JavaScriptLoader;
 import org.eclipse.rap.rwt.lifecycle.WidgetUtil;
+import org.eclipse.rap.rwt.service.ResourceManager;
 import org.eclipse.swt.SWT;
 import org.eclipse.swt.events.MouseAdapter;
 import org.eclipse.swt.events.MouseEvent;
@@ -129,20 +133,22 @@
   public static void addNumKeyBehavior( Text text, int number, Button button ) {
     button.setData( "textWidget", WidgetUtil.getId( text ) );
     button.setData( "numValue", Integer.valueOf( number ) );
-    ClientListener listener = new ClientListener( getScript( "NumKey.js" ) );
-    button.addListener( SWT.MouseDown, listener );
+    ensure( "NumKey.js" );
+    button.addListener( SWT.MouseDown, new ClientListener( "var handleEvent = demoscripts.numKey;") );
   }
 
-  private static Script getScript( String fileName ) {
-    String key = CustomBehaviors.class.getCanonicalName() + fileName;
-    Script result = ( Script )RWT.getUISession().getAttribute( key );
-    if( result == null ) {
-      String scriptCode
-        = ResourceLoaderUtil.readTextContent( RESOURCES_PREFIX + fileName );
-      result = new Script( scriptCode );
-      RWT.getUISession().setAttribute( key, result );
+  private static void ensure( String fileName ) {
+    String path = RESOURCES_PREFIX + fileName;
+    InputStream stream = CustomBehaviors.class.getClassLoader().getResourceAsStream( path );
+    ResourceManager manager = RWT.getResourceManager();
+    manager.register( path, stream );
+    try {
+      stream.close();
+    } catch( IOException e ) {
+      e.printStackTrace();
     }
-    return result;
+    JavaScriptLoader jsl = RWT.getClient().getService( JavaScriptLoader.class );
+    jsl.require( manager.getLocation( path ) );
   }
 
 }
diff --git a/bundles/org.eclipse.rap.clientscripting.demo/src/org/eclipse/rap/clientscripting/demo/NumKey.js b/bundles/org.eclipse.rap.clientscripting.demo/src/org/eclipse/rap/clientscripting/demo/NumKey.js
index eaf9e0b..f7df0f4 100644
--- a/bundles/org.eclipse.rap.clientscripting.demo/src/org/eclipse/rap/clientscripting/demo/NumKey.js
+++ b/bundles/org.eclipse.rap.clientscripting.demo/src/org/eclipse/rap/clientscripting/demo/NumKey.js
@@ -1,6 +1,9 @@
 //# sourceURL=NumKey.js
 
-var handleEvent = function( event ) {
+/*globals demoscripts:true */
+demoscripts = ( typeof demoscripts !== "undefined" ) ? demoscripts : {};
+
+demoscripts.numKey = function( event ) {
   var button = event.widget;
   var text = rap.getObject( button.getData( "textWidget" ) );
   var value = button.getData( "numValue" );
diff --git a/bundles/org.eclipse.rap.clientscripting/js/rwt/scripting/handler/ScriptHandler.js b/bundles/org.eclipse.rap.clientscripting/js/rwt/scripting/handler/ScriptHandler.js
deleted file mode 100644
index aa77121..0000000
--- a/bundles/org.eclipse.rap.clientscripting/js/rwt/scripting/handler/ScriptHandler.js
+++ /dev/null
@@ -1,23 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2012, 2013 EclipseSource and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *    EclipseSource - initial API and implementation
- ******************************************************************************/
-
-(function(){
-
-rap.registerTypeHandler( "rwt.scripting.Script", {
-
-  factory : function( properties ) {
-    var text = properties.text;
-    return { "getText" : function(){ return text; } };
-  }
-
-} );
-
-}());
diff --git a/bundles/org.eclipse.rap.clientscripting/src/org/eclipse/rap/clientscripting/ClientListener.java b/bundles/org.eclipse.rap.clientscripting/src/org/eclipse/rap/clientscripting/ClientListener.java
index 650419e..e34a59c 100644
--- a/bundles/org.eclipse.rap.clientscripting/src/org/eclipse/rap/clientscripting/ClientListener.java
+++ b/bundles/org.eclipse.rap.clientscripting/src/org/eclipse/rap/clientscripting/ClientListener.java
@@ -65,10 +65,6 @@
     super( scriptCode );
   }
 
-  public ClientListener( Script script ) {
-    super( script );
-  }
-
   /**
    * This method will NOT be called on a ClientListener.
    */
diff --git a/bundles/org.eclipse.rap.clientscripting/src/org/eclipse/rap/clientscripting/Script.java b/bundles/org.eclipse.rap.clientscripting/src/org/eclipse/rap/clientscripting/Script.java
deleted file mode 100644
index 4234ee6..0000000
--- a/bundles/org.eclipse.rap.clientscripting/src/org/eclipse/rap/clientscripting/Script.java
+++ /dev/null
@@ -1,43 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2013 EclipseSource and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *    EclipseSource - initial API and implementation
- ******************************************************************************/
-package org.eclipse.rap.clientscripting;
-
-import org.eclipse.rap.rwt.RWT;
-import org.eclipse.rap.rwt.remote.Connection;
-import org.eclipse.rap.rwt.remote.RemoteObject;
-
-
-public class Script {
-
-  private static final String REMOTE_TYPE = "rwt.scripting.Script";
-  private final RemoteObject remoteObject;
-
-  /**
-   * Provisional/Experimental
-   */
-  public Script( String scriptCode ) {
-    if( scriptCode == null ) {
-      throw new NullPointerException( "Parameter is null: scriptCode" );
-    }
-    Connection connection = RWT.getUISession().getConnection();
-    remoteObject = connection.createRemoteObject( REMOTE_TYPE );
-    remoteObject.set( "text", scriptCode );
-  }
-
-  public String getId() {
-    return remoteObject.getId();
-  }
-
-  public void dispose() {
-    remoteObject.destroy();
-  }
-
-}
diff --git a/bundles/org.eclipse.rap.clientscripting/src/org/eclipse/rap/clientscripting/internal/ClientFunction.java b/bundles/org.eclipse.rap.clientscripting/src/org/eclipse/rap/clientscripting/internal/ClientFunction.java
index cb48315..565ac35 100644
--- a/bundles/org.eclipse.rap.clientscripting/src/org/eclipse/rap/clientscripting/internal/ClientFunction.java
+++ b/bundles/org.eclipse.rap.clientscripting/src/org/eclipse/rap/clientscripting/internal/ClientFunction.java
@@ -13,7 +13,6 @@
 import java.util.ArrayList;
 import java.util.Collection;
 
-import org.eclipse.rap.clientscripting.Script;
 import org.eclipse.rap.clientscripting.internal.resources.ClientScriptingResources;
 import org.eclipse.rap.rwt.RWT;
 import org.eclipse.rap.rwt.remote.RemoteObject;
@@ -27,26 +26,14 @@
   private final Collection<ClientListenerBinding> bindings;
 
   public ClientFunction( String scriptCode ) {
-    this();
-    if( scriptCode == null ) {
-      throw new NullPointerException( "Parameter is null: scriptCode" );
-    }
-    remoteObject.set( "scriptCode", scriptCode );
-  }
-
-  public ClientFunction( Script script ) {
-    this();
-    if( script == null ) {
-      throw new NullPointerException( "Parameter is null: script" );
-    }
-    remoteObject.set( "scriptId", script.getId() );
-  }
-
-  private ClientFunction() {
     bindings = new ArrayList<ClientListenerBinding>();
     remoteObject = RWT.getUISession().getConnection().createRemoteObject( REMOTE_TYPE );
     ClientScriptingResources.ensure();
     remoteObject.set( "name", "handleEvent" );
+    if( scriptCode == null ) {
+      throw new NullPointerException( "Parameter is null: scriptCode" );
+    }
+    remoteObject.set( "scriptCode", scriptCode );
   }
 
   protected String getRemoteId() {
diff --git a/bundles/org.eclipse.rap.clientscripting/src/org/eclipse/rap/clientscripting/internal/resources/ClientScriptingResources.java b/bundles/org.eclipse.rap.clientscripting/src/org/eclipse/rap/clientscripting/internal/resources/ClientScriptingResources.java
index d488090..b2dce9a 100644
--- a/bundles/org.eclipse.rap.clientscripting/src/org/eclipse/rap/clientscripting/internal/resources/ClientScriptingResources.java
+++ b/bundles/org.eclipse.rap.clientscripting/src/org/eclipse/rap/clientscripting/internal/resources/ClientScriptingResources.java
@@ -33,7 +33,6 @@
     "FunctionFactory.js",
     "handler/FunctionHandler.js",
     "WidgetProxyFactory.js",
-    "handler/ScriptHandler.js",
     "init.js"
   };
 
diff --git a/tests/org.eclipse.rap.clientscripting.jstest/js/org/eclipse/rap/clientscripting/Function_Test.js b/tests/org.eclipse.rap.clientscripting.jstest/js/org/eclipse/rap/clientscripting/Function_Test.js
index 6cab237..79f43ef 100644
--- a/tests/org.eclipse.rap.clientscripting.jstest/js/org/eclipse/rap/clientscripting/Function_Test.js
+++ b/tests/org.eclipse.rap.clientscripting.jstest/js/org/eclipse/rap/clientscripting/Function_Test.js
@@ -78,27 +78,6 @@
       assertTrue( result instanceof Function );
     },
 
-    testCreateFunctionByProtocol_withScriptId : function() {
-      var ObjectManager = rwt.remote.ObjectRegistry;
-      var processor = rwt.remote.MessageProcessor;
-      var code = "var handleEvent = function(){};";
-      var createScript = [ "create", "r3", "rwt.scripting.Script", { "text" : code } ];
-      processor.processOperationArray( createScript );
-
-      processor.processOperation( {
-        "target" : "w3",
-        "action" : "create",
-        "type" : "rwt.scripting.Function",
-        "properties" : {
-          "scriptId" : "r3",
-          "name" : "handleEvent"
-        }
-      } );
-
-      var result = ObjectManager.getObject( "w3" );
-      assertTrue( result instanceof Function );
-    },
-
     testCallWithArgument : function() {
       var code = "function handleEvent( e ){ e.x++; }";
       var listener = FunctionFactory.createFunction( code, "handleEvent" );
diff --git a/tests/org.eclipse.rap.clientscripting.jstest/js/org/eclipse/rap/clientscripting/Script_Test.js b/tests/org.eclipse.rap.clientscripting.jstest/js/org/eclipse/rap/clientscripting/Script_Test.js
deleted file mode 100644
index be62da0..0000000
--- a/tests/org.eclipse.rap.clientscripting.jstest/js/org/eclipse/rap/clientscripting/Script_Test.js
+++ /dev/null
@@ -1,40 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2013 EclipseSource and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *    EclipseSource - initial API and implementation
- ******************************************************************************/
-
-(function() {
-
-var Function = rwt.scripting.Function;
-var SWT = rwt.scripting.SWT;
-var MessageProcessor = rwt.remote.MessageProcessor;
-
-rwt.qx.Class.define( "org.eclipse.rap.clientscripting.Script_Test", {
-
-  extend : rwt.qx.Object,
-
-  members : {
-
-    testCreateScriptWithTextByProtocol : function() {
-      var code = "1+1;";
-
-      var op = [ "create", "r3", "rwt.scripting.Script", { "text" : code } ];
-      MessageProcessor.processOperationArray( op );
-
-      var ObjectManager = rwt.remote.ObjectRegistry;
-      var result = ObjectManager.getObject( "r3" );
-      assertEquals( 2, eval( result.getText() ) );
-      MessageProcessor.processOperationArray( [ "destroy", "r3" ] );
-    }
-
-  }
-
-} );
-
-}());
diff --git a/tests/org.eclipse.rap.clientscripting.jstest/src/org/eclipse/rap/clientscripting/internal/ClientScriptingResourcesContribution.java b/tests/org.eclipse.rap.clientscripting.jstest/src/org/eclipse/rap/clientscripting/internal/ClientScriptingResourcesContribution.java
index 2165c24..7c9dd6e 100644
--- a/tests/org.eclipse.rap.clientscripting.jstest/src/org/eclipse/rap/clientscripting/internal/ClientScriptingResourcesContribution.java
+++ b/tests/org.eclipse.rap.clientscripting.jstest/src/org/eclipse/rap/clientscripting/internal/ClientScriptingResourcesContribution.java
@@ -29,7 +29,6 @@
     "handler/EventBindingHandler.js",
     "EventProxy.js",
     "WidgetProxyFactory.js",
-    "handler/ScriptHandler.js",
     "init.js"
   };
 
diff --git a/tests/org.eclipse.rap.clientscripting.jstest/src/org/eclipse/rap/clientscripting/internal/ClientScriptingTestContribution.java b/tests/org.eclipse.rap.clientscripting.jstest/src/org/eclipse/rap/clientscripting/internal/ClientScriptingTestContribution.java
index e87ba40..f8e332e 100644
--- a/tests/org.eclipse.rap.clientscripting.jstest/src/org/eclipse/rap/clientscripting/internal/ClientScriptingTestContribution.java
+++ b/tests/org.eclipse.rap.clientscripting.jstest/src/org/eclipse/rap/clientscripting/internal/ClientScriptingTestContribution.java
@@ -24,8 +24,7 @@
     "Function_Test.js",
     "EventBinding_Test.js",
     "EventProxy_Test.js",
-    "WidgetProxyFactory_Test.js",
-    "Script_Test.js",
+    "WidgetProxyFactory_Test.js"
   };
 
   public String getName() {
diff --git a/tests/org.eclipse.rap.clientscripting.test/src/org/eclipse/rap/clientscripting/ClientListener_Test.java b/tests/org.eclipse.rap.clientscripting.test/src/org/eclipse/rap/clientscripting/ClientListener_Test.java
index 128d187..87415f1 100644
--- a/tests/org.eclipse.rap.clientscripting.test/src/org/eclipse/rap/clientscripting/ClientListener_Test.java
+++ b/tests/org.eclipse.rap.clientscripting.test/src/org/eclipse/rap/clientscripting/ClientListener_Test.java
@@ -200,7 +200,7 @@
   }
 
   private void createListener() {
-    listener = spy( new ClientListener( new Script( "code" ) ) );
+    listener = spy( new ClientListener( "code" ) );
   }
 
 }
diff --git a/tests/org.eclipse.rap.clientscripting.test/src/org/eclipse/rap/clientscripting/Script_Test.java b/tests/org.eclipse.rap.clientscripting.test/src/org/eclipse/rap/clientscripting/Script_Test.java
deleted file mode 100644
index 8282f04..0000000
--- a/tests/org.eclipse.rap.clientscripting.test/src/org/eclipse/rap/clientscripting/Script_Test.java
+++ /dev/null
@@ -1,81 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2012, 2013 EclipseSource and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *    EclipseSource - initial API and implementation
- ******************************************************************************/
-package org.eclipse.rap.clientscripting;
-
-import static org.junit.Assert.assertEquals;
-import static org.mockito.Matchers.eq;
-import static org.mockito.Mockito.mock;
-import static org.mockito.Mockito.verify;
-import static org.mockito.Mockito.when;
-
-import org.eclipse.rap.rwt.remote.Connection;
-import org.eclipse.rap.rwt.remote.RemoteObject;
-import org.eclipse.rap.rwt.testfixture.Fixture;
-import org.junit.*;
-
-
-public class Script_Test {
-
-  private static final String REMOTE_TYPE = "rwt.scripting.Script";
-  private Connection connection;
-  private RemoteObject remoteObject;
-
-  @Before
-  public void setUp() throws Exception {
-    Fixture.setUp();
-    connection = mock( Connection.class );
-    remoteObject = mock( RemoteObject.class );
-    when( remoteObject.getId() ).thenReturn( "foo" );
-    when( connection.createRemoteObject( REMOTE_TYPE ) ).thenReturn( remoteObject );
-    Fixture.fakeConnection( connection );
-  }
-
-  @After
-  public void tearDown() throws Exception {
-    Fixture.tearDown();
-  }
-
-  @Test( expected = NullPointerException.class )
-  public void testConstructor_nullArgumenFails() {
-    new Script( null );
-  }
-
-  @Test
-  public void testConstructor_createsRemoteObject() {
-    new Script( "1+1;" );
-
-    verify( connection ).createRemoteObject( eq( REMOTE_TYPE ) );
-  }
-
-  @Test
-  public void testConstructor_setsTextOnRemoteObject() {
-    new Script( "1+1;" );
-
-    verify( remoteObject ).set( eq( "text" ), eq( "1+1;" ) );
-  }
-
-  @Test
-  public void testGetId() {
-    Script script = new Script( "1+1;" );
-
-    assertEquals( "foo", script.getId() );
-  }
-
-  @Test
-  public void testDispose_callsDestroyOnRemoteObject() {
-    Script script = new Script( "1+1;" );
-
-    script.dispose();
-
-    verify( remoteObject ).destroy();
-  }
-
-}
diff --git a/tests/org.eclipse.rap.clientscripting.test/src/org/eclipse/rap/clientscripting/internal/ClientFunction_Test.java b/tests/org.eclipse.rap.clientscripting.test/src/org/eclipse/rap/clientscripting/internal/ClientFunction_Test.java
index 9c37407..3f31c41 100644
--- a/tests/org.eclipse.rap.clientscripting.test/src/org/eclipse/rap/clientscripting/internal/ClientFunction_Test.java
+++ b/tests/org.eclipse.rap.clientscripting.test/src/org/eclipse/rap/clientscripting/internal/ClientFunction_Test.java
@@ -23,7 +23,6 @@
 import static org.mockito.Mockito.verify;
 import static org.mockito.Mockito.when;
 
-import org.eclipse.rap.clientscripting.Script;
 import org.eclipse.rap.rwt.remote.Connection;
 import org.eclipse.rap.rwt.remote.RemoteObject;
 import org.eclipse.rap.rwt.testfixture.Fixture;
@@ -59,20 +58,10 @@
   }
 
   @Test
-  public void testCreation_failsWithScriptNull() {
-    try {
-      new ClientFunction( ( Script )null );
-      fail();
-    } catch( NullPointerException expected ) {
-      assertTrue( expected.getMessage().contains( "script" ) );
-    }
-  }
-
-  @Test
   public void testCreation_createsRemoteObject() {
     Connection connection = fakeConnection( mock( RemoteObject.class ), CLIENT_LISTENER_TYPE );
 
-    new ClientFunction( new Script( "script code" ) );
+    new ClientFunction( "script code" );
 
     verify( connection ).createRemoteObject( "rwt.scripting.Function" );
   }
@@ -106,18 +95,6 @@
   }
 
   @Test
-  public void testCreationWithScript_setsScriptId() {
-    RemoteObject listenerRemoteObject = mock( RemoteObject.class );
-    fakeConnection( listenerRemoteObject, CLIENT_LISTENER_TYPE );
-    Script script = mock( Script.class );
-    when( script.getId() ).thenReturn( "fooId" );
-
-    new ClientFunction( script );
-
-    verify( listenerRemoteObject ).set( eq( "scriptId" ), eq( "fooId" ) );
-  }
-
-  @Test
   public void testAddTo_createsBinding() {
     function.addTo( "w101", "MouseDown" );
 
@@ -173,7 +150,7 @@
   }
 
   private void createListener() {
-    function = spy( new ClientFunction( new Script( "code" ) ) );
+    function = spy( new ClientFunction( "code" ) );
   }
 
 }