You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@myfaces.apache.org by we...@apache.org on 2009/12/09 00:54:43 UTC

svn commit: r888639 - in /myfaces/extensions/scripting/trunk/core/core/src/main: groovy/org/apache/myfaces/groovyloader/core/ java/org/apache/myfaces/scripting/api/ java/org/apache/myfaces/scripting/core/reloading/ java/org/apache/myfaces/scripting/loa...

Author: werpu
Date: Tue Dec  8 23:54:42 2009
New Revision: 888639

URL: http://svn.apache.org/viewvc?rev=888639&view=rev
Log:
bean classcast exception no finally history, yiehaa...
thanks to the improved classloader
and thanks also to the more complicated bean reloading strategies.
renderer reloading strategy improved as well, since the renderer is a flyweight
pattern we do not have to copy anything, we just drop everything and reload anew.

Added:
    myfaces/extensions/scripting/trunk/core/core/src/main/groovy/org/apache/myfaces/groovyloader/core/GlobalReloadingStrategy.groovy
    myfaces/extensions/scripting/trunk/core/core/src/main/groovy/org/apache/myfaces/groovyloader/core/StandardGroovyReloadingStrategy.groovy
    myfaces/extensions/scripting/trunk/core/core/src/main/java/org/apache/myfaces/scripting/core/reloading/RendererReloadingStrategy.java   (with props)
    myfaces/extensions/scripting/trunk/core/core/src/main/java/test/
    myfaces/extensions/scripting/trunk/core/core/src/main/java/test/ListTest.java   (with props)
Modified:
    myfaces/extensions/scripting/trunk/core/core/src/main/groovy/org/apache/myfaces/groovyloader/core/GroovyWeaver.groovy
    myfaces/extensions/scripting/trunk/core/core/src/main/java/org/apache/myfaces/scripting/api/BaseWeaver.java
    myfaces/extensions/scripting/trunk/core/core/src/main/java/org/apache/myfaces/scripting/core/reloading/GlobalReloadingStrategy.java
    myfaces/extensions/scripting/trunk/core/core/src/main/java/org/apache/myfaces/scripting/loaders/java/JavaScriptingWeaver.java
    myfaces/extensions/scripting/trunk/core/core/src/main/java/org/apache/myfaces/scripting/loaders/java/RecompiledClassLoader.java
    myfaces/extensions/scripting/trunk/core/core/src/main/java/org/apache/myfaces/scripting/loaders/java/jdk5/ContainerFileManager.java

Added: myfaces/extensions/scripting/trunk/core/core/src/main/groovy/org/apache/myfaces/groovyloader/core/GlobalReloadingStrategy.groovy
URL: http://svn.apache.org/viewvc/myfaces/extensions/scripting/trunk/core/core/src/main/groovy/org/apache/myfaces/groovyloader/core/GlobalReloadingStrategy.groovy?rev=888639&view=auto
==============================================================================
--- myfaces/extensions/scripting/trunk/core/core/src/main/groovy/org/apache/myfaces/groovyloader/core/GlobalReloadingStrategy.groovy (added)
+++ myfaces/extensions/scripting/trunk/core/core/src/main/groovy/org/apache/myfaces/groovyloader/core/GlobalReloadingStrategy.groovy Tue Dec  8 23:54:42 2009
@@ -0,0 +1,43 @@
+package org.apache.myfaces.groovyloader.core
+
+import org.apache.myfaces.scripting.api.ReloadingStrategy
+import org.apache.myfaces.scripting.core.reloading.SimpleReloadingStrategy
+import org.apache.myfaces.scripting.api.BaseWeaver
+import org.apache.myfaces.scripting.core.reloading.RendererReloadingStrategy;
+
+/**
+ * Reloading strategy for the groovy
+ * connectors
+ *
+ * Groovy has a different behavior, because
+ * every attribute normally is reachable even
+ * some introspection ones which under no circumstances
+ * should be overwritten
+ *
+ */
+public class GlobalReloadingStrategy  implements ReloadingStrategy {
+
+    private BaseWeaver _weaver = null;
+
+    private ReloadingStrategy _rendererStrategy;
+    private ReloadingStrategy _allOthers;
+
+
+    public GlobalReloadingStrategy(weaver) {
+        _weaver = weaver;
+        _rendererStrategy = new RendererReloadingStrategy();
+        _allOthers = new StandardGroovyReloadingStrategy();
+
+    }
+
+    public Object reload(Object toReload, int artefactType) {
+
+
+        switch (artefactType) {
+            case ScriptingConst.ARTEFACT_TYPE_RENDERER:
+                return _rendererStrategy.reload(toReload, artefactType);
+            //TODO Add other artefact loading strategies on demand here
+            default:
+                return _allOthers.reload(toReload, artefactType);
+        }    }
+}
\ No newline at end of file

Modified: myfaces/extensions/scripting/trunk/core/core/src/main/groovy/org/apache/myfaces/groovyloader/core/GroovyWeaver.groovy
URL: http://svn.apache.org/viewvc/myfaces/extensions/scripting/trunk/core/core/src/main/groovy/org/apache/myfaces/groovyloader/core/GroovyWeaver.groovy?rev=888639&r1=888638&r2=888639&view=diff
==============================================================================
--- myfaces/extensions/scripting/trunk/core/core/src/main/groovy/org/apache/myfaces/groovyloader/core/GroovyWeaver.groovy (original)
+++ myfaces/extensions/scripting/trunk/core/core/src/main/groovy/org/apache/myfaces/groovyloader/core/GroovyWeaver.groovy Tue Dec  8 23:54:42 2009
@@ -53,7 +53,7 @@
         //FIXME this is private in super class
         scriptingEngine = ScriptingConst.ENGINE_TYPE_GROOVY
         fileEnding = ".groovy"
-        _reloadingStrategy = new GroovyReloadingStrategy(this)
+        _reloadingStrategy = new GlobalReloadingStrategy(this)
     }
 
 
@@ -160,7 +160,7 @@
     }
 
     public void requestRefresh() {
-        
+
     }
 
 }

Added: myfaces/extensions/scripting/trunk/core/core/src/main/groovy/org/apache/myfaces/groovyloader/core/StandardGroovyReloadingStrategy.groovy
URL: http://svn.apache.org/viewvc/myfaces/extensions/scripting/trunk/core/core/src/main/groovy/org/apache/myfaces/groovyloader/core/StandardGroovyReloadingStrategy.groovy?rev=888639&view=auto
==============================================================================
--- myfaces/extensions/scripting/trunk/core/core/src/main/groovy/org/apache/myfaces/groovyloader/core/StandardGroovyReloadingStrategy.groovy (added)
+++ myfaces/extensions/scripting/trunk/core/core/src/main/groovy/org/apache/myfaces/groovyloader/core/StandardGroovyReloadingStrategy.groovy Tue Dec  8 23:54:42 2009
@@ -0,0 +1,60 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements.  See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership.  The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License.  You may obtain a copy of the License at
+ *
+ *   http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied.  See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+package org.apache.myfaces.groovyloader.core
+
+import org.apache.myfaces.scripting.api.ReloadingStrategy
+import org.apache.myfaces.scripting.core.reloading.SimpleReloadingStrategy
+import org.apache.myfaces.scripting.api.BaseWeaver;
+
+
+public class StandardGroovyReloadingStrategy extends SimpleReloadingStrategy {
+
+    public StandardGroovyReloadingStrategy(BaseWeaver weaver) {
+        super(weaver);
+    }
+
+    /**
+     * central algorithm which determines which property values are overwritten and which are not
+     */
+    protected void mapProperties(def target, def src) {
+        src.properties.each {property ->
+            //ok here is the algorithm, basic datatypes usually are not copied but read in anew and then overwritten
+            //later on
+            //all others can be manually overwritten by adding an attribute <attributename>_changed
+
+            try {
+                if (target.properties.containsKey(property.key)
+                    && !property.key.equals("metaClass")        //the class information and meta class information cannot be changed
+                    && !property.key.equals("class")            //otherwise we will get following error
+                    // java.lang.IllegalArgumentException: object is not an instance of declaring class
+                    && !(
+                    target.properties.containsKey(property.key + "_changed") //||
+                    //nothing further needed the phases take care of that
+                    )) {
+                    target.setProperty(property.key, property.value)
+                }
+            } catch (Exception e) {
+
+            }
+        }
+    }
+
+   
+}
+

Modified: myfaces/extensions/scripting/trunk/core/core/src/main/java/org/apache/myfaces/scripting/api/BaseWeaver.java
URL: http://svn.apache.org/viewvc/myfaces/extensions/scripting/trunk/core/core/src/main/java/org/apache/myfaces/scripting/api/BaseWeaver.java?rev=888639&r1=888638&r2=888639&view=diff
==============================================================================
--- myfaces/extensions/scripting/trunk/core/core/src/main/java/org/apache/myfaces/scripting/api/BaseWeaver.java (original)
+++ myfaces/extensions/scripting/trunk/core/core/src/main/java/org/apache/myfaces/scripting/api/BaseWeaver.java Tue Dec  8 23:54:42 2009
@@ -146,8 +146,6 @@
         if (metadata == null) {
             String fileName = className.replaceAll("\\.", File.separator) + getFileEnding();
 
-            //TODO this code can probably be replaced by the functionality
-            //already given in the Groovy classloader, this needs further testing
             for (String pathEntry : getScriptPaths()) {
 
                 /**
@@ -172,6 +170,7 @@
         return null;
     }
 
+    //TODO move this into the classloader to cover dependend classes as well
     protected void refreshReloadingMetaData(String sourceRoot, String file, File currentClassFile, Class retVal, int engineType) {
         ReloadingMetadata reloadingMetaData = new ReloadingMetadata();
         reloadingMetaData.setAClass(retVal);
@@ -212,7 +211,6 @@
         this.scriptingEngine = scriptingEngine;
     }
 
-    protected abstract void mapProperties(Object target, Object src);
 
     protected abstract Class loadScriptingClassFromFile(String sourceRoot, String file);
 

Modified: myfaces/extensions/scripting/trunk/core/core/src/main/java/org/apache/myfaces/scripting/core/reloading/GlobalReloadingStrategy.java
URL: http://svn.apache.org/viewvc/myfaces/extensions/scripting/trunk/core/core/src/main/java/org/apache/myfaces/scripting/core/reloading/GlobalReloadingStrategy.java?rev=888639&r1=888638&r2=888639&view=diff
==============================================================================
--- myfaces/extensions/scripting/trunk/core/core/src/main/java/org/apache/myfaces/scripting/core/reloading/GlobalReloadingStrategy.java (original)
+++ myfaces/extensions/scripting/trunk/core/core/src/main/java/org/apache/myfaces/scripting/core/reloading/GlobalReloadingStrategy.java Tue Dec  8 23:54:42 2009
@@ -36,11 +36,13 @@
     private BaseWeaver _weaver = null;
 
     private ReloadingStrategy _beanStrategy;
+    private ReloadingStrategy _rendererStrategy;
     private ReloadingStrategy _allOthers;
 
     public GlobalReloadingStrategy(BaseWeaver weaver) {
         _weaver = weaver;
         _beanStrategy = new ManagedBeanReloadingStrategy(weaver);
+        _rendererStrategy = new RendererReloadingStrategy();
         _allOthers = new SimpleReloadingStrategy(weaver);
     }
 
@@ -57,6 +59,8 @@
         switch (artefactType) {
             case ScriptingConst.ARTEFACT_TYPE_MANAGEDBEAN:
                 return _beanStrategy.reload(toReload, artefactType);
+            case ScriptingConst.ARTEFACT_TYPE_RENDERER:
+                return _rendererStrategy.reload(toReload, artefactType);
             //TODO Add other artefact loading strategies on demand here
             default:
                 return _allOthers.reload(toReload, artefactType);

Added: myfaces/extensions/scripting/trunk/core/core/src/main/java/org/apache/myfaces/scripting/core/reloading/RendererReloadingStrategy.java
URL: http://svn.apache.org/viewvc/myfaces/extensions/scripting/trunk/core/core/src/main/java/org/apache/myfaces/scripting/core/reloading/RendererReloadingStrategy.java?rev=888639&view=auto
==============================================================================
--- myfaces/extensions/scripting/trunk/core/core/src/main/java/org/apache/myfaces/scripting/core/reloading/RendererReloadingStrategy.java (added)
+++ myfaces/extensions/scripting/trunk/core/core/src/main/java/org/apache/myfaces/scripting/core/reloading/RendererReloadingStrategy.java Tue Dec  8 23:54:42 2009
@@ -0,0 +1,35 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements.  See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership.  The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License.  You may obtain a copy of the License at
+ *
+ *   http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied.  See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+package org.apache.myfaces.scripting.core.reloading;
+
+import org.apache.myfaces.scripting.api.ReloadingStrategy;
+
+/**
+ * @author Werner Punz (latest modification by $Author$)
+ * @version $Revision$ $Date$
+ *
+ * The renderer is a stateless flyweight pattern the reloading strategy is
+ * to do nothing, this should give optimal results
+ */
+public class RendererReloadingStrategy extends SimpleReloadingStrategy {
+    @Override
+    protected void mapProperties(Object target, Object src) {
+        return;
+    }
+}

Propchange: myfaces/extensions/scripting/trunk/core/core/src/main/java/org/apache/myfaces/scripting/core/reloading/RendererReloadingStrategy.java
------------------------------------------------------------------------------
    svn:eol-style = native

Propchange: myfaces/extensions/scripting/trunk/core/core/src/main/java/org/apache/myfaces/scripting/core/reloading/RendererReloadingStrategy.java
------------------------------------------------------------------------------
    svn:keywords = Date Author Id Revision HeadURL

Modified: myfaces/extensions/scripting/trunk/core/core/src/main/java/org/apache/myfaces/scripting/loaders/java/JavaScriptingWeaver.java
URL: http://svn.apache.org/viewvc/myfaces/extensions/scripting/trunk/core/core/src/main/java/org/apache/myfaces/scripting/loaders/java/JavaScriptingWeaver.java?rev=888639&r1=888638&r2=888639&view=diff
==============================================================================
--- myfaces/extensions/scripting/trunk/core/core/src/main/java/org/apache/myfaces/scripting/loaders/java/JavaScriptingWeaver.java (original)
+++ myfaces/extensions/scripting/trunk/core/core/src/main/java/org/apache/myfaces/scripting/loaders/java/JavaScriptingWeaver.java Tue Dec  8 23:54:42 2009
@@ -46,6 +46,18 @@
  *         <p/>
  *         The Scripting Weaver for the java core which reloads the java scripts
  *         dynamically upon change
+ *
+ * <p />
+ * Note this is the central focus point for all reloading related activity
+ * this class introduces the correct class loader
+ * it manages the bean reloading on the proper stage of the lifecyle,
+ * calls the compilers single and all compile,
+ * it adds the strategies for the property handling of the reloaded instance
+ * <p />
+ * Every language implementation has to implement this weaver
+ * and (if not done differently) also the proper compiler bindings
+ * and property handling strategies.
+ *
  */
 public class JavaScriptingWeaver extends BaseWeaver implements ScriptingWeaver, Serializable {
 
@@ -98,26 +110,6 @@
 
 
     /**
-     * helper to map the properties wherever possible
-     *
-     * @param target
-     * @param src
-     */
-    protected void mapProperties(Object target, Object src) {
-        try {
-            //TODO add dynamic property reloading hook here
-            BeanUtils.copyProperties(target, src);
-        } catch (IllegalAccessException e) {
-            log.debug(e);
-            //this is wanted
-        } catch (InvocationTargetException e) {
-            log.debug(e);
-            //this is wanted
-        }
-    }
-
-
-    /**
      * loads a class from a given sourceroot and filename
      * note this method does not have to be thread safe
      * it is called in a thread safe manner by the base class
@@ -240,7 +232,7 @@
         Set<String> tainted = new HashSet<String>();
         for (Map.Entry<String, ReloadingMetadata> it : FileChangedDaemon.getInstance().getClassMap().entrySet()) {
             if (it.getValue().getScriptingEngine() == ScriptingConst.ENGINE_TYPE_JAVA && it.getValue().isTainted()) {
-                tainted.add(it.getValue().getAClass().getName());
+                tainted.add(it.getKey());
             }
         }
         if (tainted.size() > 0) {

Modified: myfaces/extensions/scripting/trunk/core/core/src/main/java/org/apache/myfaces/scripting/loaders/java/RecompiledClassLoader.java
URL: http://svn.apache.org/viewvc/myfaces/extensions/scripting/trunk/core/core/src/main/java/org/apache/myfaces/scripting/loaders/java/RecompiledClassLoader.java?rev=888639&r1=888638&r2=888639&view=diff
==============================================================================
--- myfaces/extensions/scripting/trunk/core/core/src/main/java/org/apache/myfaces/scripting/loaders/java/RecompiledClassLoader.java (original)
+++ myfaces/extensions/scripting/trunk/core/core/src/main/java/org/apache/myfaces/scripting/loaders/java/RecompiledClassLoader.java Tue Dec  8 23:54:42 2009
@@ -20,6 +20,9 @@
 
 import org.apache.myfaces.scripting.core.util.ClassUtils;
 import org.apache.myfaces.scripting.core.util.FileUtils;
+import org.apache.myfaces.scripting.refresh.FileChangedDaemon;
+import org.apache.myfaces.scripting.refresh.ReloadingMetadata;
+import org.apache.myfaces.scripting.api.ScriptingConst;
 
 import java.io.File;
 import java.io.FileInputStream;
@@ -27,14 +30,16 @@
 /**
  * @author Werner Punz (latest modification by $Author$)
  * @version $Revision$ $Date$
+ *
+ * Classloader which loads the compilates for the scripting engine
  */
-
 public class RecompiledClassLoader extends ClassLoader {
     static File tempDir = null;
     static double _tempMarker = Math.random();
+    int _scriptingEngine;
 
 
-    public RecompiledClassLoader(ClassLoader classLoader) {
+    public RecompiledClassLoader(ClassLoader classLoader, int scriptingEngine) {
         super(classLoader);
         if (tempDir == null) {
             synchronized (this.getClass()) {
@@ -45,6 +50,7 @@
                 tempDir = FileUtils.getTempDir();
             }
         }
+        _scriptingEngine = scriptingEngine;
     }
 
     RecompiledClassLoader() {
@@ -67,6 +73,10 @@
         //check if our class exists in the tempDir
         File target = getClassFile(className);
         if (target.exists()) {
+            ReloadingMetadata data = FileChangedDaemon.getInstance().getClassMap().get(className);
+            if(data != null && !data.isTainted()) {
+                return data.getAClass();
+            }
 
             FileInputStream iStream = null;
             int fileLength = (int) target.length();
@@ -78,8 +88,16 @@
                 // Erzeugt aus dem byte Feld ein Class Object.
                 Class retVal = null;
                 
-
-                return super.defineClass(className, fileContent, 0, fileLength);
+                //we have to do it here because just in case
+                //a dependend class is loaded as well we run into classcast exceptions
+                if(data != null) {
+                    data.setTainted(false);
+                    return super.defineClass(className, fileContent, 0, fileLength);
+                } else {
+                    //we store the initial reloading meta data information so that it is refreshed
+                    //later on, this we we cover dependend classes on the initial load
+                    return storeReloadableDefinitions(className, target, fileLength, fileContent);
+                }
 
             } catch (Exception e) {
                 throw new ClassNotFoundException(e.toString());
@@ -98,6 +116,23 @@
         return super.loadClass(className);    //To change body of overridden methods use File | Settings | File Templates.
     }
 
+    private Class<?> storeReloadableDefinitions(String className, File target, int fileLength, byte[] fileContent) {
+        Class retVal;
+        retVal = super.defineClass(className, fileContent, 0, fileLength);
+        ReloadingMetadata reloadingMetaData = new ReloadingMetadata();
+        reloadingMetaData.setAClass(retVal);
+
+        reloadingMetaData.setFileName(target.getAbsolutePath());
+        reloadingMetaData.setSourcePath("");
+        reloadingMetaData.setTimestamp(target.lastModified());
+        reloadingMetaData.setTainted(false);
+        reloadingMetaData.setTaintedOnce(true);
+        reloadingMetaData.setScriptingEngine(_scriptingEngine);
+
+        FileChangedDaemon.getInstance().getClassMap().put(className, reloadingMetaData);
+        return retVal;
+    }
+
 
     @Override
     protected Class<?> findClass(String name) throws ClassNotFoundException {

Modified: myfaces/extensions/scripting/trunk/core/core/src/main/java/org/apache/myfaces/scripting/loaders/java/jdk5/ContainerFileManager.java
URL: http://svn.apache.org/viewvc/myfaces/extensions/scripting/trunk/core/core/src/main/java/org/apache/myfaces/scripting/loaders/java/jdk5/ContainerFileManager.java?rev=888639&r1=888638&r2=888639&view=diff
==============================================================================
--- myfaces/extensions/scripting/trunk/core/core/src/main/java/org/apache/myfaces/scripting/loaders/java/jdk5/ContainerFileManager.java (original)
+++ myfaces/extensions/scripting/trunk/core/core/src/main/java/org/apache/myfaces/scripting/loaders/java/jdk5/ContainerFileManager.java Tue Dec  8 23:54:42 2009
@@ -20,6 +20,7 @@
 
 import org.apache.myfaces.scripting.core.util.ClassUtils;
 import org.apache.myfaces.scripting.loaders.java.RecompiledClassLoader;
+import org.apache.myfaces.scripting.api.ScriptingConst;
 
 import java.io.File;
 import java.net.URL;
@@ -38,7 +39,7 @@
     RecompiledClassLoader classLoader = null;
 
     public ContainerFileManager() {
-        classLoader = new RecompiledClassLoader(ClassUtils.getContextClassLoader());
+        classLoader = new RecompiledClassLoader(ClassUtils.getContextClassLoader(), ScriptingConst.ENGINE_TYPE_JAVA);
     }
 
     public String getClassPath() {

Added: myfaces/extensions/scripting/trunk/core/core/src/main/java/test/ListTest.java
URL: http://svn.apache.org/viewvc/myfaces/extensions/scripting/trunk/core/core/src/main/java/test/ListTest.java?rev=888639&view=auto
==============================================================================
--- myfaces/extensions/scripting/trunk/core/core/src/main/java/test/ListTest.java (added)
+++ myfaces/extensions/scripting/trunk/core/core/src/main/java/test/ListTest.java Tue Dec  8 23:54:42 2009
@@ -0,0 +1,47 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements.  See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership.  The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License.  You may obtain a copy of the License at
+ *
+ *   http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied.  See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+package test;
+
+import java.util.List;
+import java.util.LinkedList;
+
+/**
+ * @author Werner Punz (latest modification by $Author$)
+ * @version $Revision$ $Date$
+ */
+
+public class ListTest {
+
+    public static void main (String ... arg) {
+
+        List<String> testList = new LinkedList<String>();
+        testList.add("one");
+        testList.add("two");
+        testList.add("three");
+
+        List testlist2 = testList.subList(0,1);
+        testList.remove(0);
+        System.out.println(testList.size());
+
+        System.out.println(testlist2.size());
+
+
+
+    }
+}

Propchange: myfaces/extensions/scripting/trunk/core/core/src/main/java/test/ListTest.java
------------------------------------------------------------------------------
    svn:eol-style = native

Propchange: myfaces/extensions/scripting/trunk/core/core/src/main/java/test/ListTest.java
------------------------------------------------------------------------------
    svn:keywords = Date Author Id Revision HeadURL