You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@tapestry.apache.org by hl...@apache.org on 2007/10/03 17:09:26 UTC

svn commit: r581620 - in /tapestry/tapestry5/trunk/tapestry-core/src: main/java/org/apache/tapestry/ main/java/org/apache/tapestry/corelib/components/ main/java/org/apache/tapestry/internal/services/ main/java/org/apache/tapestry/services/ test/java/or...

Author: hlship
Date: Wed Oct  3 08:09:23 2007
New Revision: 581620

URL: http://svn.apache.org/viewvc?rev=581620&view=rev
Log:
TAPESTRY-1793: JavaScript integration/abstract layer to support multiple client-side frameworks

Modified:
    tapestry/tapestry5/trunk/tapestry-core/src/main/java/org/apache/tapestry/PageRenderSupport.java
    tapestry/tapestry5/trunk/tapestry-core/src/main/java/org/apache/tapestry/TapestryUtils.java
    tapestry/tapestry5/trunk/tapestry-core/src/main/java/org/apache/tapestry/corelib/components/Form.java
    tapestry/tapestry5/trunk/tapestry-core/src/main/java/org/apache/tapestry/internal/services/PageRenderSupportImpl.java
    tapestry/tapestry5/trunk/tapestry-core/src/main/java/org/apache/tapestry/services/TapestryModule.java
    tapestry/tapestry5/trunk/tapestry-core/src/test/java/org/apache/tapestry/TapestryUtilsTest.java
    tapestry/tapestry5/trunk/tapestry-core/src/test/java/org/apache/tapestry/internal/services/PageRenderSupportImplTest.java

Modified: tapestry/tapestry5/trunk/tapestry-core/src/main/java/org/apache/tapestry/PageRenderSupport.java
URL: http://svn.apache.org/viewvc/tapestry/tapestry5/trunk/tapestry-core/src/main/java/org/apache/tapestry/PageRenderSupport.java?rev=581620&r1=581619&r2=581620&view=diff
==============================================================================
--- tapestry/tapestry5/trunk/tapestry-core/src/main/java/org/apache/tapestry/PageRenderSupport.java (original)
+++ tapestry/tapestry5/trunk/tapestry-core/src/main/java/org/apache/tapestry/PageRenderSupport.java Wed Oct  3 08:09:23 2007
@@ -15,6 +15,8 @@
 package org.apache.tapestry;
 
 import org.apache.tapestry.ioc.internal.util.IdAllocator;
+import org.apache.tapestry.ioc.services.SymbolSource;
+import org.apache.tapestry.services.AssetSource;
 
 /**
  * Provides support to all components that render. This is primarily about generating unique
@@ -45,8 +47,9 @@
     void addScriptLink(Asset... scriptAssets);
 
     /**
-     * Used to add scripts that are stored on the classpath. Each element has symbol expanded, then
-     * is converted to an asset and added as a script link.
+     * Used to add scripts that are stored on the classpath. Each element has
+     * {@linkplain SymbolSource symbols expanded}, then is
+     * {@linkplain AssetSource converted to an asset} and added as a script link.
      * 
      * @param classpaths
      *            array of paths. Symbols in the paths are expanded, then the paths are each

Modified: tapestry/tapestry5/trunk/tapestry-core/src/main/java/org/apache/tapestry/TapestryUtils.java
URL: http://svn.apache.org/viewvc/tapestry/tapestry5/trunk/tapestry-core/src/main/java/org/apache/tapestry/TapestryUtils.java?rev=581620&r1=581619&r2=581620&view=diff
==============================================================================
--- tapestry/tapestry5/trunk/tapestry-core/src/main/java/org/apache/tapestry/TapestryUtils.java (original)
+++ tapestry/tapestry5/trunk/tapestry-core/src/main/java/org/apache/tapestry/TapestryUtils.java Wed Oct  3 08:09:23 2007
@@ -14,6 +14,11 @@
 
 package org.apache.tapestry;
 
+import java.util.Collections;
+import java.util.List;
+
+import org.apache.tapestry.ioc.internal.util.CollectionFactory;
+
 /**
  * Utilities often needed when building Tapestry applications.
  */
@@ -58,5 +63,46 @@
         result.append(APOS);
 
         return result.toString();
+    }
+
+    /**
+     * Joins together several strings, sorting them alphabetically and separating them with spaces.
+     * This is often used when setting the CSS class attribute of an element.
+     */
+    public static String join(String... values)
+    {
+        List<String> list = CollectionFactory.newList(values);
+
+        return sortAndJoin(list);
+    }
+
+    /**
+     * Joins together several strings, sorting them alphabetically and separating them with spaces.
+     * This is often used when setting the CSS class attribute of an element.
+     */
+    public static String join(List<String> values)
+    {
+        List<String> copy = CollectionFactory.newList(values);
+
+        return sortAndJoin(copy);
+    }
+
+    private static String sortAndJoin(List<String> list)
+    {
+        Collections.sort(list);
+
+        StringBuilder builder = new StringBuilder(10 * list.size());
+
+        String sep = "";
+
+        for (String name : list)
+        {
+            builder.append(sep);
+            builder.append(name);
+
+            sep = " ";
+        }
+
+        return builder.toString();
     }
 }

Modified: tapestry/tapestry5/trunk/tapestry-core/src/main/java/org/apache/tapestry/corelib/components/Form.java
URL: http://svn.apache.org/viewvc/tapestry/tapestry5/trunk/tapestry-core/src/main/java/org/apache/tapestry/corelib/components/Form.java?rev=581620&r1=581619&r2=581620&view=diff
==============================================================================
--- tapestry/tapestry5/trunk/tapestry-core/src/main/java/org/apache/tapestry/corelib/components/Form.java (original)
+++ tapestry/tapestry5/trunk/tapestry-core/src/main/java/org/apache/tapestry/corelib/components/Form.java Wed Oct  3 08:09:23 2007
@@ -21,7 +21,6 @@
 import java.io.ObjectInputStream;
 import java.util.List;
 
-import org.apache.tapestry.Asset;
 import org.apache.tapestry.ClientElement;
 import org.apache.tapestry.ComponentAction;
 import org.apache.tapestry.ComponentEventHandler;
@@ -38,7 +37,6 @@
 import org.apache.tapestry.annotations.Inject;
 import org.apache.tapestry.annotations.Mixin;
 import org.apache.tapestry.annotations.Parameter;
-import org.apache.tapestry.annotations.Path;
 import org.apache.tapestry.annotations.Persist;
 import org.apache.tapestry.corelib.internal.FormSupportImpl;
 import org.apache.tapestry.corelib.mixins.RenderInformals;
@@ -167,18 +165,6 @@
 
     private Element _div;
 
-    @Inject
-    @Path("${tapestry.scriptaculous}/prototype.js")
-    private Asset _prototype;
-
-    @Inject
-    @Path("${tapestry.scriptaculous}/scriptaculous.js")
-    private Asset _scriptaculous;
-
-    @Inject
-    @Path("classpath:/org/apache/tapestry/tapestry.js")
-    private Asset _tapestry;
-
     // Collects a stream of component actions. Each action goes in as a UTF string (the component
     // component id), followed by a ComponentAction
 
@@ -255,11 +241,7 @@
         writer.end(); // div
 
         if (_clientValidation)
-        {
-            _pageRenderSupport.addScriptLink(_prototype, _scriptaculous, _tapestry);
-
             _pageRenderSupport.addScript(format("Tapestry.registerForm('%s');", _name));
-        }
 
         _environment.peek(Heartbeat.class).begin();
 

Modified: tapestry/tapestry5/trunk/tapestry-core/src/main/java/org/apache/tapestry/internal/services/PageRenderSupportImpl.java
URL: http://svn.apache.org/viewvc/tapestry/tapestry5/trunk/tapestry-core/src/main/java/org/apache/tapestry/internal/services/PageRenderSupportImpl.java?rev=581620&r1=581619&r2=581620&view=diff
==============================================================================
--- tapestry/tapestry5/trunk/tapestry-core/src/main/java/org/apache/tapestry/internal/services/PageRenderSupportImpl.java (original)
+++ tapestry/tapestry5/trunk/tapestry-core/src/main/java/org/apache/tapestry/internal/services/PageRenderSupportImpl.java Wed Oct  3 08:09:23 2007
@@ -17,6 +17,9 @@
 import static java.lang.String.format;
 import static org.apache.tapestry.ioc.internal.util.Defense.notNull;
 
+import java.util.Arrays;
+import java.util.List;
+
 import org.apache.tapestry.Asset;
 import org.apache.tapestry.PageRenderSupport;
 import org.apache.tapestry.ioc.internal.util.IdAllocator;
@@ -33,12 +36,30 @@
 
     private final AssetSource _assetSource;
 
+    private final List<String> _coreScripts;
+
+    private boolean _coreAssetsAdded;
+
+    /**
+     * @param builder
+     *            Used to assemble JavaScript includes and snippets
+     * @param symbolSource
+     *            Used to example symbols (in
+     *            {@linkplain #addClasspathScriptLink(String...) in classpath scripts)
+     * @param assetSource
+     *            Used to convert classpath scripts to {@link Asset}s
+     * @param coreScripts
+     *            core scripts (evaluated as classpaths scripts) that are added to any page that
+     *            includes a script link or script block
+     */
     public PageRenderSupportImpl(DocumentScriptBuilder builder, SymbolSource symbolSource,
-            AssetSource assetSource)
+            AssetSource assetSource, String... coreScripts)
     {
         _builder = builder;
         _symbolSource = symbolSource;
         _assetSource = assetSource;
+
+        _coreScripts = Arrays.asList(coreScripts);
     }
 
     public String allocateClientId(String id)
@@ -48,6 +69,8 @@
 
     public void addScriptLink(Asset... scriptAssets)
     {
+        addCore();
+
         for (Asset asset : scriptAssets)
         {
             notNull(asset, "scriptAsset");
@@ -58,21 +81,38 @@
 
     public void addClasspathScriptLink(String... classpaths)
     {
+        addCore();
+
         for (String path : classpaths)
-        {
-            String expanded = _symbolSource.expandSymbols(path);
+            addScriptLinkFromClasspath(path);
+    }
+
+    private void addScriptLinkFromClasspath(String path)
+    {
+        String expanded = _symbolSource.expandSymbols(path);
 
-            Asset asset = _assetSource.findAsset(null, expanded, null);
+        Asset asset = _assetSource.findAsset(null, expanded, null);
 
-            _builder.addScriptLink(asset.toClientURL());
-        }
+        _builder.addScriptLink(asset.toClientURL());
     }
 
     public void addScript(String format, Object... arguments)
     {
+        addCore();
+
         String script = format(format, arguments);
 
         _builder.addScript(script);
     }
 
+    private void addCore()
+    {
+        if (!_coreAssetsAdded)
+        {
+            for (String path : _coreScripts)
+                addScriptLinkFromClasspath(path);
+
+            _coreAssetsAdded = true;
+        }
+    }
 }

Modified: tapestry/tapestry5/trunk/tapestry-core/src/main/java/org/apache/tapestry/services/TapestryModule.java
URL: http://svn.apache.org/viewvc/tapestry/tapestry5/trunk/tapestry-core/src/main/java/org/apache/tapestry/services/TapestryModule.java?rev=581620&r1=581619&r2=581620&view=diff
==============================================================================
--- tapestry/tapestry5/trunk/tapestry-core/src/main/java/org/apache/tapestry/services/TapestryModule.java (original)
+++ tapestry/tapestry5/trunk/tapestry-core/src/main/java/org/apache/tapestry/services/TapestryModule.java Wed Oct  3 08:09:23 2007
@@ -1462,7 +1462,13 @@
 
                 environment.push(DocumentScriptBuilder.class, builder);
                 environment.push(PageRenderSupport.class, new PageRenderSupportImpl(builder,
-                        symbolSource, assetSource));
+                        symbolSource, assetSource,
+
+                        // Core scripts added to any page that uses scripting
+                        
+                        "${tapestry.scriptaculous}/prototype.js",
+                        "${tapestry.scriptaculous}/scriptaculous.js",
+                        "org/apache/tapestry/tapestry.js"));
             }
         });
 

Modified: tapestry/tapestry5/trunk/tapestry-core/src/test/java/org/apache/tapestry/TapestryUtilsTest.java
URL: http://svn.apache.org/viewvc/tapestry/tapestry5/trunk/tapestry-core/src/test/java/org/apache/tapestry/TapestryUtilsTest.java?rev=581620&r1=581619&r2=581620&view=diff
==============================================================================
--- tapestry/tapestry5/trunk/tapestry-core/src/test/java/org/apache/tapestry/TapestryUtilsTest.java (original)
+++ tapestry/tapestry5/trunk/tapestry-core/src/test/java/org/apache/tapestry/TapestryUtilsTest.java Wed Oct  3 08:09:23 2007
@@ -14,6 +14,9 @@
 
 package org.apache.tapestry;
 
+import java.util.Arrays;
+import java.util.List;
+
 import org.testng.Assert;
 import org.testng.annotations.DataProvider;
 import org.testng.annotations.Test;
@@ -27,7 +30,7 @@
     }
 
     @DataProvider(name = "string_quoting_input")
-    public Object[][] inputs()
+    public Object[][] string_quoting_input()
     {
         return new Object[][]
         {
@@ -36,5 +39,31 @@
                 { "regexp: \\d{4}", "'regexp: \\\\d{4}'" },
 
         };
+    }
+
+    @Test(dataProvider = "join_input")
+    public void join_array(String[] inputs, String expected)
+    {
+        assertEquals(TapestryUtils.join(inputs), expected);
+    }
+
+    @Test(dataProvider = "join_input")
+    public void join_list(String[] inputs, String expected)
+    {
+        List<String> list = Arrays.asList(inputs);
+
+        assertEquals(TapestryUtils.join(list), expected);
+    }
+
+    @DataProvider(name = "join_input")
+    public Object[][] join_input()
+    {
+        return new Object[][]
+        {
+        { new String[0], "" },
+        { new String[]
+        { "fred" }, "fred" },
+        { new String[]
+        { "fred", "barney", "wilma" }, "barney fred wilma" } };
     }
 }

Modified: tapestry/tapestry5/trunk/tapestry-core/src/test/java/org/apache/tapestry/internal/services/PageRenderSupportImplTest.java
URL: http://svn.apache.org/viewvc/tapestry/tapestry5/trunk/tapestry-core/src/test/java/org/apache/tapestry/internal/services/PageRenderSupportImplTest.java?rev=581620&r1=581619&r2=581620&view=diff
==============================================================================
--- tapestry/tapestry5/trunk/tapestry-core/src/test/java/org/apache/tapestry/internal/services/PageRenderSupportImplTest.java (original)
+++ tapestry/tapestry5/trunk/tapestry-core/src/test/java/org/apache/tapestry/internal/services/PageRenderSupportImplTest.java Wed Oct  3 08:09:23 2007
@@ -23,6 +23,12 @@
 
 public class PageRenderSupportImplTest extends InternalBaseTestCase
 {
+    private static final String CORE_ASSET_PATH_UNEXPANDED = "${core}";
+
+    private static final String CORE_ASSET_PATH = "/org/apache/tapestry/core/core.png";
+
+    private static final String CORE_ASSET_URL = "/assets/core/core.png";
+
     private static final String ASSET_URL = "/assets/foo/bar.pdf";
 
     @Test
@@ -37,6 +43,36 @@
         replay();
 
         PageRenderSupport support = new PageRenderSupportImpl(builder, null, null);
+
+        support.addScriptLink(asset);
+
+        verify();
+    }
+
+    @Test
+    public void core_assets_added()
+    {
+        getMocksControl().checkOrder(true);
+
+        Asset coreAsset = mockAsset();
+        DocumentScriptBuilder builder = mockDocumentScriptBuilder();
+        Asset asset = mockAsset();
+        AssetSource assetSource = mockAssetSource();
+        SymbolSource symbolSource = mockSymbolSource();
+
+        train_expandSymbols(symbolSource, CORE_ASSET_PATH_UNEXPANDED, CORE_ASSET_PATH);
+        train_findAsset(assetSource, null, CORE_ASSET_PATH, null, coreAsset);
+
+        train_toClientURL(coreAsset, CORE_ASSET_URL);
+        builder.addScriptLink(CORE_ASSET_URL);
+
+        train_toClientURL(asset, ASSET_URL);
+        builder.addScriptLink(ASSET_URL);
+
+        replay();
+
+        PageRenderSupport support = new PageRenderSupportImpl(builder, symbolSource, assetSource,
+                CORE_ASSET_PATH_UNEXPANDED);
 
         support.addScriptLink(asset);