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 2013/11/27 22:25:25 UTC

[5/5] git commit: TAP5-2238: When require-ing a module that is part of a JavaScript Stack, the entire stack should be imported

TAP5-2238: When require-ing a module that is part of a JavaScript Stack, the entire stack should be imported


Project: http://git-wip-us.apache.org/repos/asf/tapestry-5/repo
Commit: http://git-wip-us.apache.org/repos/asf/tapestry-5/commit/ee695314
Tree: http://git-wip-us.apache.org/repos/asf/tapestry-5/tree/ee695314
Diff: http://git-wip-us.apache.org/repos/asf/tapestry-5/diff/ee695314

Branch: refs/heads/master
Commit: ee695314fab6794edeeda80bbc9875b6114cfc2a
Parents: e514e7f
Author: Howard M. Lewis Ship <hl...@apache.org>
Authored: Wed Nov 27 13:25:13 2013 -0800
Committer: Howard M. Lewis Ship <hl...@apache.org>
Committed: Wed Nov 27 13:25:13 2013 -0800

----------------------------------------------------------------------
 .../services/ajax/JavaScriptSupportImpl.java    | 56 ++++++++++++------
 .../services/javascript/JavaScriptSupport.java  | 14 +++--
 .../ajax/JavaScriptSupportAutofocusTests.groovy |  2 +
 .../ajax/JavaScriptSupportImplTest.groovy       | 62 +++++++++++++++++++-
 4 files changed, 112 insertions(+), 22 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/tapestry-5/blob/ee695314/tapestry-core/src/main/java/org/apache/tapestry5/internal/services/ajax/JavaScriptSupportImpl.java
----------------------------------------------------------------------
diff --git a/tapestry-core/src/main/java/org/apache/tapestry5/internal/services/ajax/JavaScriptSupportImpl.java b/tapestry-core/src/main/java/org/apache/tapestry5/internal/services/ajax/JavaScriptSupportImpl.java
index bcce095..eb8defb 100644
--- a/tapestry-core/src/main/java/org/apache/tapestry5/internal/services/ajax/JavaScriptSupportImpl.java
+++ b/tapestry-core/src/main/java/org/apache/tapestry5/internal/services/ajax/JavaScriptSupportImpl.java
@@ -14,13 +14,6 @@
 
 package org.apache.tapestry5.internal.services.ajax;
 
-import java.util.ArrayList;
-import java.util.Collections;
-import java.util.Comparator;
-import java.util.List;
-import java.util.Map;
-import java.util.Set;
-
 import org.apache.tapestry5.Asset;
 import org.apache.tapestry5.ComponentResources;
 import org.apache.tapestry5.FieldFocusPriority;
@@ -34,13 +27,9 @@ import org.apache.tapestry5.ioc.internal.util.InternalUtils;
 import org.apache.tapestry5.ioc.util.IdAllocator;
 import org.apache.tapestry5.json.JSONArray;
 import org.apache.tapestry5.json.JSONObject;
-import org.apache.tapestry5.services.javascript.Initialization;
-import org.apache.tapestry5.services.javascript.InitializationPriority;
-import org.apache.tapestry5.services.javascript.JavaScriptStack;
-import org.apache.tapestry5.services.javascript.JavaScriptStackSource;
-import org.apache.tapestry5.services.javascript.JavaScriptSupport;
-import org.apache.tapestry5.services.javascript.ModuleConfigurationCallback;
-import org.apache.tapestry5.services.javascript.StylesheetLink;
+import org.apache.tapestry5.services.javascript.*;
+
+import java.util.*;
 
 public class JavaScriptSupportImpl implements JavaScriptSupport
 {
@@ -70,7 +59,7 @@ public class JavaScriptSupportImpl implements JavaScriptSupport
 
     private String focusFieldId;
 
-    private Map<String, String> libraryURLToStackName;
+    private Map<String, String> libraryURLToStackName, moduleNameToStackName;
 
     class InitializationImpl implements Initialization
     {
@@ -246,7 +235,7 @@ public class JavaScriptSupportImpl implements JavaScriptSupport
     {
         addScript(InitializationPriority.NORMAL, format, arguments);
     }
-    
+
     public void addModuleConfigurationCallback(ModuleConfigurationCallback callback)
     {
         linker.addModuleConfigurationCallback(callback);
@@ -301,6 +290,7 @@ public class JavaScriptSupportImpl implements JavaScriptSupport
         return getLibraryURLToStackName().get(libraryURL);
     }
 
+
     private Map<String, String> getLibraryURLToStackName()
     {
         if (libraryURLToStackName == null)
@@ -319,6 +309,31 @@ public class JavaScriptSupportImpl implements JavaScriptSupport
         return libraryURLToStackName;
     }
 
+    private String findStackForModule(String moduleName)
+    {
+        return getModuleNameToStackName().get(moduleName);
+    }
+
+    private Map<String, String> getModuleNameToStackName()
+    {
+
+        if (moduleNameToStackName == null)
+        {
+            moduleNameToStackName = CollectionFactory.newMap();
+
+            for (String stackName : javascriptStackSource.getStackNames())
+            {
+                for (String moduleName : javascriptStackSource.getStack(stackName).getModules())
+                {
+                    moduleNameToStackName.put(moduleName, stackName);
+                }
+            }
+        }
+
+        return moduleNameToStackName;
+    }
+
+
     private void addAssetsFromStack(String stackName)
     {
         if (addedStacks.containsKey(stackName))
@@ -333,7 +348,7 @@ public class JavaScriptSupportImpl implements JavaScriptSupport
         // end, avoiding the TAP5-2197 bug.
         final List<String> reversedStacks = new ArrayList<String>(stack.getStacks());
         Collections.reverse(reversedStacks);
-        
+
         for (String dependentStackname : reversedStacks)
         {
             addAssetsFromStack(dependentStackname);
@@ -423,6 +438,13 @@ public class JavaScriptSupportImpl implements JavaScriptSupport
 
         addAssetsFromStack(InternalConstants.CORE_STACK_NAME);
 
+        String stackName = findStackForModule(moduleName);
+
+        if (stackName != null)
+        {
+            importStack(stackName);
+        }
+
         InitializationImpl init = new InitializationImpl(moduleName);
 
         inits.add(init);

http://git-wip-us.apache.org/repos/asf/tapestry-5/blob/ee695314/tapestry-core/src/main/java/org/apache/tapestry5/services/javascript/JavaScriptSupport.java
----------------------------------------------------------------------
diff --git a/tapestry-core/src/main/java/org/apache/tapestry5/services/javascript/JavaScriptSupport.java b/tapestry-core/src/main/java/org/apache/tapestry5/services/javascript/JavaScriptSupport.java
index 1b24e1b..caff985 100644
--- a/tapestry-core/src/main/java/org/apache/tapestry5/services/javascript/JavaScriptSupport.java
+++ b/tapestry-core/src/main/java/org/apache/tapestry5/services/javascript/JavaScriptSupport.java
@@ -1,4 +1,4 @@
-// Copyright 2010, 2011, 2012 The Apache Software Foundation
+// Copyright 2010-2013 The Apache Software Foundation
 //
 // Licensed under the Apache License, Version 2.0 (the "License");
 // you may not use this file except in compliance with the License.
@@ -250,6 +250,11 @@ public interface JavaScriptSupport
      * In some cases, a module exports no functions, but performs some initialization (typically, adding document-level
      * event handlers), in which case a call to require() is sufficient. In cases where the module, or a function
      * within the module, are invoked with no parameters, the calls will be collapsed into a single invocation.
+     * <p/>
+     * If the module is part of a {@linkplain org.apache.tapestry5.services.javascript.JavaScriptStack#getModules() JavaScript stack},
+     * then the stack will be imported; this is important when {@linkplain SymbolConstants#COMBINE_SCRIPTS JavaScript aggregation is enabled},
+     * but also ensures that libraries in the stack are loaded before the module (for cases where the
+     * module has dependencies on libraries not wrapped as AMD modules).
      *
      * @param moduleName
      *         the name of the module to require
@@ -257,11 +262,12 @@ public interface JavaScriptSupport
      * @since 5.4
      */
     Initialization require(String moduleName);
-    
+
     /**
      * Adds a module configuration callback for this request.
-     * 
-     * @param callback a {@link ModuleConfigurationCallback}. It cannot be null.
+     *
+     * @param callback
+     *         a {@link ModuleConfigurationCallback}. It cannot be null.
      * @see DocumentLinker#addModuleConfigurationCallback(ModuleConfigurationCallback)
      * @since 5.4
      */

http://git-wip-us.apache.org/repos/asf/tapestry-5/blob/ee695314/tapestry-core/src/test/groovy/org/apache/tapestry5/internal/services/ajax/JavaScriptSupportAutofocusTests.groovy
----------------------------------------------------------------------
diff --git a/tapestry-core/src/test/groovy/org/apache/tapestry5/internal/services/ajax/JavaScriptSupportAutofocusTests.groovy b/tapestry-core/src/test/groovy/org/apache/tapestry5/internal/services/ajax/JavaScriptSupportAutofocusTests.groovy
index ba023f8..afd7279 100644
--- a/tapestry-core/src/test/groovy/org/apache/tapestry5/internal/services/ajax/JavaScriptSupportAutofocusTests.groovy
+++ b/tapestry-core/src/test/groovy/org/apache/tapestry5/internal/services/ajax/JavaScriptSupportAutofocusTests.groovy
@@ -34,6 +34,8 @@ class JavaScriptSupportAutofocusTests extends InternalBaseTestCase {
         def stackSource = newMock(JavaScriptStackSource.class)
         def stackPathConstructor = newMock(JavaScriptStackPathConstructor.class)
 
+        expect(stackSource.stackNames).andReturn([])
+
         linker.addInitialization(InitializationPriority.NORMAL, "t5/core/pageinit", "focus",
             JSONArray.from([expectedFieldId]))
 

http://git-wip-us.apache.org/repos/asf/tapestry-5/blob/ee695314/tapestry-core/src/test/groovy/org/apache/tapestry5/internal/services/ajax/JavaScriptSupportImplTest.groovy
----------------------------------------------------------------------
diff --git a/tapestry-core/src/test/groovy/org/apache/tapestry5/internal/services/ajax/JavaScriptSupportImplTest.groovy b/tapestry-core/src/test/groovy/org/apache/tapestry5/internal/services/ajax/JavaScriptSupportImplTest.groovy
index 2b8abd1..b8947d4 100644
--- a/tapestry-core/src/test/groovy/org/apache/tapestry5/internal/services/ajax/JavaScriptSupportImplTest.groovy
+++ b/tapestry-core/src/test/groovy/org/apache/tapestry5/internal/services/ajax/JavaScriptSupportImplTest.groovy
@@ -40,13 +40,16 @@ class JavaScriptSupportImplTest extends InternalBaseTestCase {
     @Test
     void partial_mode_add_script() {
         DocumentLinker linker = mockDocumentLinker()
+        def stackSource = mockJavaScriptStackSource()
+
+        train_for_just_core_stack stackSource
 
         linker.addInitialization(InitializationPriority.NORMAL, "t5/core/pageinit", "evalJavaScript",
             new JSONArray().put("doSomething();"))
 
         replay()
 
-        JavaScriptSupportImpl jss = new JavaScriptSupportImpl(linker, null, null, new IdAllocator(), true)
+        JavaScriptSupportImpl jss = new JavaScriptSupportImpl(linker, stackSource, null, new IdAllocator(), true)
 
         jss.addScript("doSomething();")
 
@@ -158,6 +161,44 @@ class JavaScriptSupportImplTest extends InternalBaseTestCase {
         verify()
     }
 
+    @Test
+    void requireing_a_module_may_import_a_stack() {
+        DocumentLinker linker = mockDocumentLinker()
+        JavaScriptStackSource stackSource = mockJavaScriptStackSource()
+        JavaScriptStackPathConstructor pathConstructor = mockJavaScriptStackPathConstructor()
+
+        JavaScriptStack mystack = mockJavaScriptStack()
+
+        expect(stackSource.stackNames).andReturn(["mystack"])
+        expect(stackSource.getStack("mystack")).andReturn(mystack).atLeastOnce()
+
+        expect(mystack.modules).andReturn(["foo/bar"])
+
+        expect(mystack.stacks).andReturn([])
+
+        expect(pathConstructor.constructPathsForJavaScriptStack("mystack")).andReturn(["stacks/mystack.js"])
+
+        expect(mystack.stylesheets).andReturn([])
+
+        expect(mystack.initialization).andReturn null
+
+        linker.addLibrary("stacks/mystack.js")
+
+        linker.addInitialization(InitializationPriority.NORMAL, "foo/bar", null, null)
+
+        replay()
+
+        JavaScriptSupportImpl jss = new JavaScriptSupportImpl(linker, stackSource, pathConstructor, null, true)
+
+        jss.require("foo/bar")
+
+        jss.commit()
+
+        verify()
+
+    }
+
+
     private void trainForNoStackNames(JavaScriptStackSource stackSource) {
         // This is slightly odd, as it would normally return "core" at a minimum, but we test for that separately.
 
@@ -288,6 +329,8 @@ class JavaScriptSupportImplTest extends InternalBaseTestCase {
         JavaScriptStackSource stackSource = mockJavaScriptStackSource()
         JavaScriptStackPathConstructor pathConstructor = mockJavaScriptStackPathConstructor()
 
+        train_for_just_core_stack stackSource
+
         train_init(linker, InitializationPriority.IMMEDIATE, "setup", "chuck")
         train_init(linker, InitializationPriority.IMMEDIATE, "setup", "charley")
 
@@ -312,6 +355,8 @@ class JavaScriptSupportImplTest extends InternalBaseTestCase {
         JSONArray chuck = new JSONArray("chuck", "yeager")
         JSONArray buzz = new JSONArray("buzz", "aldrin")
 
+        train_for_just_core_stack stackSource
+
         train_init(linker, InitializationPriority.IMMEDIATE, "setup", chuck)
         train_init(linker, InitializationPriority.IMMEDIATE, "setup", buzz)
 
@@ -341,6 +386,8 @@ class JavaScriptSupportImplTest extends InternalBaseTestCase {
         JavaScriptStackSource stackSource = mockJavaScriptStackSource()
         JavaScriptStackPathConstructor pathConstructor = mockJavaScriptStackPathConstructor()
 
+        train_for_just_core_stack stackSource
+
         train_init(linker, InitializationPriority.NORMAL, "setup", "chuck")
 
         replay()
@@ -354,6 +401,17 @@ class JavaScriptSupportImplTest extends InternalBaseTestCase {
         verify()
     }
 
+    def train_for_just_core_stack(stackSource) {
+        def coreStack = mockJavaScriptStack()
+
+        expect(stackSource.stackNames).andReturn(["core"])
+
+        expect(stackSource.getStack("core")).andReturn(coreStack)
+
+        expect(coreStack.modules).andReturn([])
+    }
+
+
     @Test
     void default_for_init_array_is_normal_priority() {
         DocumentLinker linker = mockDocumentLinker()
@@ -362,6 +420,8 @@ class JavaScriptSupportImplTest extends InternalBaseTestCase {
 
         JSONArray chuck = new JSONArray("chuck", "yeager")
 
+        train_for_just_core_stack stackSource
+
         train_init(linker, InitializationPriority.NORMAL, "setup", chuck)
 
         replay()