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 2012/07/06 02:38:00 UTC

[9/16] git commit: Start to refactor module and script loading logic from DocumentLinker to ModuleManager

Start to refactor module and script loading logic from DocumentLinker to ModuleManager


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

Branch: refs/heads/5.4-js-rewrite
Commit: 153e2d2e6fdd9afaa693a42a987cb9ed42d3aba4
Parents: 7edf894
Author: Howard M. Lewis Ship <hl...@apache.org>
Authored: Thu Jul 5 12:37:52 2012 -0700
Committer: Howard M. Lewis Ship <hl...@apache.org>
Committed: Thu Jul 5 12:37:52 2012 -0700

----------------------------------------------------------------------
 .../internal/services/DocumentLinkerImpl.java      |   17 +---
 .../services/javascript/ModuleManagerImpl.java     |   17 ++++-
 .../apache/tapestry5/services/TapestryModule.java  |    2 +-
 .../services/javascript/ModuleManager.java         |    9 +-
 .../services/DocumentLinkerImplTest.groovy         |   59 +++++++--------
 5 files changed, 50 insertions(+), 54 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/tapestry-5/blob/153e2d2e/tapestry-core/src/main/java/org/apache/tapestry5/internal/services/DocumentLinkerImpl.java
----------------------------------------------------------------------
diff --git a/tapestry-core/src/main/java/org/apache/tapestry5/internal/services/DocumentLinkerImpl.java b/tapestry-core/src/main/java/org/apache/tapestry5/internal/services/DocumentLinkerImpl.java
index 14cae57..c87e153 100644
--- a/tapestry-core/src/main/java/org/apache/tapestry5/internal/services/DocumentLinkerImpl.java
+++ b/tapestry-core/src/main/java/org/apache/tapestry5/internal/services/DocumentLinkerImpl.java
@@ -14,7 +14,6 @@
 
 package org.apache.tapestry5.internal.services;
 
-import org.apache.tapestry5.Asset;
 import org.apache.tapestry5.dom.Document;
 import org.apache.tapestry5.dom.Element;
 import org.apache.tapestry5.ioc.internal.util.CollectionFactory;
@@ -47,23 +46,18 @@ public class DocumentLinkerImpl implements DocumentLinker
 
     private boolean hasDynamicScript;
 
-    private final Asset requireJS;
-
     /**
      * @param moduleManager
      *         used to identify the root folder for dynamically loaded modules
-     * @param requireJS
-     *         asset for the library
      * @param omitGeneratorMetaTag
      *         via symbol configuration
      * @param tapestryVersion
      *         version of Tapestry framework (for meta tag)
      * @param compactJSON
      */
-    public DocumentLinkerImpl(ModuleManager moduleManager, Asset requireJS, boolean omitGeneratorMetaTag, String tapestryVersion, boolean compactJSON)
+    public DocumentLinkerImpl(ModuleManager moduleManager, boolean omitGeneratorMetaTag, String tapestryVersion, boolean compactJSON)
     {
         this.moduleManager = moduleManager;
-        this.requireJS = requireJS;
         this.omitGeneratorMetaTag = omitGeneratorMetaTag;
 
         tapestryBanner = String.format("Apache Tapestry Framework (version %s)", tapestryVersion);
@@ -181,11 +175,8 @@ public class DocumentLinkerImpl implements DocumentLinker
         if (!rootElementName.equals("html"))
             throw new RuntimeException(String.format("The root element of the rendered document was <%s>, not <html>. A root element of <html> is needed when linking JavaScript and stylesheet resources.", rootElementName));
 
-        Element head = findOrCreateElement(root, "head", true);
-
         // TAPESTRY-2364
 
-
         addScriptsToEndOfBody(findOrCreateElement(root, "body", false));
     }
 
@@ -208,7 +199,9 @@ public class DocumentLinkerImpl implements DocumentLinker
         // Create the element is it is missing.
 
         if (container == null)
+        {
             container = atTop ? root.elementAt(0, childElement) : root.element(childElement);
+        }
 
         return container;
     }
@@ -227,9 +220,7 @@ public class DocumentLinkerImpl implements DocumentLinker
         // Eventually, (nearly) everything will be loaded as modules.
         // TODO: Do we need to include type="text/javascript"?
 
-        body.element("script", "src", requireJS.toClientURL());
-
-        moduleManager.writeConfiguration(body.element("script", "type", "text/javascript"));
+        moduleManager.writeInitialization(body);
 
         // Next, include all stacks and individual JavaScript files *after* RequireJS.
 

http://git-wip-us.apache.org/repos/asf/tapestry-5/blob/153e2d2e/tapestry-core/src/main/java/org/apache/tapestry5/internal/services/javascript/ModuleManagerImpl.java
----------------------------------------------------------------------
diff --git a/tapestry-core/src/main/java/org/apache/tapestry5/internal/services/javascript/ModuleManagerImpl.java b/tapestry-core/src/main/java/org/apache/tapestry5/internal/services/javascript/ModuleManagerImpl.java
index a4a1708..6f57358 100644
--- a/tapestry-core/src/main/java/org/apache/tapestry5/internal/services/javascript/ModuleManagerImpl.java
+++ b/tapestry-core/src/main/java/org/apache/tapestry5/internal/services/javascript/ModuleManagerImpl.java
@@ -14,6 +14,9 @@
 
 package org.apache.tapestry5.internal.services.javascript;
 
+import org.apache.tapestry5.Asset;
+import org.apache.tapestry5.SymbolConstants;
+import org.apache.tapestry5.annotations.Path;
 import org.apache.tapestry5.dom.Element;
 import org.apache.tapestry5.func.F;
 import org.apache.tapestry5.func.Worker;
@@ -34,6 +37,8 @@ public class ModuleManagerImpl implements ModuleManager
 {
     private final String requireConfig;
 
+    private final Asset requireJS;
+
     private final Map<String, Resource> configuration;
 
     // Library names, sorted by order of descending length.
@@ -46,8 +51,12 @@ public class ModuleManagerImpl implements ModuleManager
     // Note: ConcurrentHashMap does not support null as a value, alas. We use classpathRoot as a null.
     private final Map<String, Resource> cache = CollectionFactory.newConcurrentMap();
 
-    public ModuleManagerImpl(AssetPathConstructor constructor, final ComponentClassResolver resolver, AssetSource assetSource, Map<String, Resource> configuration)
+    public ModuleManagerImpl(AssetPathConstructor constructor, final ComponentClassResolver resolver, AssetSource assetSource,
+                             @Path("${" + SymbolConstants.REQUIRE_JS + "}")
+                             Asset requireJS,
+                             Map<String, Resource> configuration)
     {
+        this.requireJS = requireJS;
         this.configuration = configuration;
         String baseURL = constructor.constructAssetPath("module-root", "");
 
@@ -85,9 +94,11 @@ public class ModuleManagerImpl implements ModuleManager
     }
 
     @Override
-    public void writeConfiguration(Element scriptElement)
+    public void writeInitialization(Element body)
     {
-        scriptElement.raw(requireConfig);
+        body.element("script", "src", requireJS.toClientURL());
+
+        body.element("script", "type", "text/javascript").raw(requireConfig);
     }
 
     @Override

http://git-wip-us.apache.org/repos/asf/tapestry-5/blob/153e2d2e/tapestry-core/src/main/java/org/apache/tapestry5/services/TapestryModule.java
----------------------------------------------------------------------
diff --git a/tapestry-core/src/main/java/org/apache/tapestry5/services/TapestryModule.java b/tapestry-core/src/main/java/org/apache/tapestry5/services/TapestryModule.java
index 70f4014..24176f2 100644
--- a/tapestry-core/src/main/java/org/apache/tapestry5/services/TapestryModule.java
+++ b/tapestry-core/src/main/java/org/apache/tapestry5/services/TapestryModule.java
@@ -1820,7 +1820,7 @@ public final class TapestryModule
         {
             public void renderMarkup(MarkupWriter writer, MarkupRenderer renderer)
             {
-                DocumentLinkerImpl linker = new DocumentLinkerImpl(moduleManager, requireJS, omitGeneratorMeta, tapestryVersion, compactJSON);
+                DocumentLinkerImpl linker = new DocumentLinkerImpl(moduleManager, omitGeneratorMeta, tapestryVersion, compactJSON);
 
                 environment.push(DocumentLinker.class, linker);
 

http://git-wip-us.apache.org/repos/asf/tapestry-5/blob/153e2d2e/tapestry-core/src/main/java/org/apache/tapestry5/services/javascript/ModuleManager.java
----------------------------------------------------------------------
diff --git a/tapestry-core/src/main/java/org/apache/tapestry5/services/javascript/ModuleManager.java b/tapestry-core/src/main/java/org/apache/tapestry5/services/javascript/ModuleManager.java
index e131d22..d534907 100644
--- a/tapestry-core/src/main/java/org/apache/tapestry5/services/javascript/ModuleManager.java
+++ b/tapestry-core/src/main/java/org/apache/tapestry5/services/javascript/ModuleManager.java
@@ -33,13 +33,14 @@ public interface ModuleManager
 {
     /**
      * Invoked by the internal {@link org.apache.tapestry5.internal.services.DocumentLinker} service to write the configuration
-     * of the module system into the page. This is the necessary initialization of the client-side {@code require} object, including
+     * of the module system into the page, including the tag to load the RequireJS library, and the
+     * necessary initialization of the client-side {@code require} object, including
      * (critically) its baseUrl property.
      *
-     * @param scriptElement
-     *         {@code <script>} element to write configuration should be written (using {@link Element#raw(String)}
+     * @param body
+     *         {@code <body>} element of the page, to which new {@code <script>>} element(s) will be added.
      */
-    void writeConfiguration(Element scriptElement);
+    void writeInitialization(Element body);
 
     /**
      * Given a module name (which may be a path of names separated by slashes), locates the corresponding {@link Resource}.

http://git-wip-us.apache.org/repos/asf/tapestry-5/blob/153e2d2e/tapestry-core/src/test/groovy/org/apache/tapestry5/internal/services/DocumentLinkerImplTest.groovy
----------------------------------------------------------------------
diff --git a/tapestry-core/src/test/groovy/org/apache/tapestry5/internal/services/DocumentLinkerImplTest.groovy b/tapestry-core/src/test/groovy/org/apache/tapestry5/internal/services/DocumentLinkerImplTest.groovy
index f241b52..2dc55d6 100644
--- a/tapestry-core/src/test/groovy/org/apache/tapestry5/internal/services/DocumentLinkerImplTest.groovy
+++ b/tapestry-core/src/test/groovy/org/apache/tapestry5/internal/services/DocumentLinkerImplTest.groovy
@@ -1,7 +1,6 @@
 package org.apache.tapestry5.internal.services;
 
 
-import org.apache.tapestry5.Asset
 import org.apache.tapestry5.dom.Document
 import org.apache.tapestry5.dom.Element
 import org.apache.tapestry5.dom.XMLMarkupModel
@@ -30,7 +29,7 @@ class DocumentLinkerImplTest extends InternalBaseTestCase {
 
         document.newRootElement("not-html").text("not an HTML document")
 
-        DocumentLinkerImpl linker = new DocumentLinkerImpl(null, null, true, "1.2.3", true)
+        DocumentLinkerImpl linker = new DocumentLinkerImpl(null, true, "1.2.3", true)
 
         // Only checked if there's something to link.
 
@@ -53,7 +52,7 @@ class DocumentLinkerImplTest extends InternalBaseTestCase {
 
         document.newRootElement("not-html").text("not an HTML document")
 
-        DocumentLinkerImpl linker = new DocumentLinkerImpl(null, null, true, "1.2.3", true)
+        DocumentLinkerImpl linker = new DocumentLinkerImpl(null, true, "1.2.3", true)
 
         // Only checked if there's something to link.
 
@@ -74,7 +73,7 @@ class DocumentLinkerImplTest extends InternalBaseTestCase {
     void missing_root_element_is_a_noop() {
         Document document = new Document()
 
-        DocumentLinkerImpl linker = new DocumentLinkerImpl(null, null, true, "1.2.3", true)
+        DocumentLinkerImpl linker = new DocumentLinkerImpl(null, true, "1.2.3", true)
 
         linker.addScriptLink("foo.js")
         linker.addScript(InitializationPriority.NORMAL, "doSomething();")
@@ -90,7 +89,7 @@ class DocumentLinkerImplTest extends InternalBaseTestCase {
 
         document.newRootElement("html").element("body").element("p").text("Ready to be updated with scripts.")
 
-        DocumentLinkerImpl linker = new DocumentLinkerImpl(mockModuleManager(), mockRequireJS(), true, "1.2.3", true)
+        DocumentLinkerImpl linker = new DocumentLinkerImpl(mockModuleManager(), true, "1.2.3", true)
 
         replay()
 
@@ -102,7 +101,7 @@ class DocumentLinkerImplTest extends InternalBaseTestCase {
 
         check document, '''
 <?xml version="1.0"?>
-<html><head/><body><p>Ready to be updated with scripts.</p><script src="/js/require.js"/><script type="text/javascript">require.config();
+<html><body><p>Ready to be updated with scripts.</p><script src="/js/require.js"/><script type="text/javascript">require.config();
 </script><script src="foo.js" type="text/javascript"/><script src="bar/baz.js" type="text/javascript"/><script type="text/javascript">Tapestry.onDOMLoaded(function() {
 pageInitialization();
 });
@@ -120,7 +119,7 @@ pageInitialization();
 
         document.newRootElement("html").element("body").element("p").text("Ready to be marked with generator meta.")
 
-        DocumentLinkerImpl linker = new DocumentLinkerImpl(null, null, false, "1.2.3", true)
+        DocumentLinkerImpl linker = new DocumentLinkerImpl(null, false, "1.2.3", true)
 
         linker.updateDocument(document)
 
@@ -139,7 +138,7 @@ pageInitialization();
 
         document.newRootElement("no_html").text("Generator meta only added if root is html tag.")
 
-        DocumentLinkerImpl linker = new DocumentLinkerImpl(null, null, false, "1.2.3", true)
+        DocumentLinkerImpl linker = new DocumentLinkerImpl(null, false, "1.2.3", true)
 
         linker.updateDocument(document)
 
@@ -156,7 +155,7 @@ pageInitialization();
 
         document.newRootElement("html").element("body").element("p").text("Ready to be updated with styles.")
 
-        DocumentLinkerImpl linker = new DocumentLinkerImpl(null, mockRequireJS(), true, "1.2.3", true)
+        DocumentLinkerImpl linker = new DocumentLinkerImpl(null, true, "1.2.3", true)
 
         linker.addStylesheetLink(new StylesheetLink("foo.css"))
         linker.addStylesheetLink(new StylesheetLink("bar/baz.css", new StylesheetOptions("print")))
@@ -176,7 +175,7 @@ pageInitialization();
         document.newRootElement("html").element("head").comment(" existing head ").container.element("body").text(
             "body content")
 
-        DocumentLinkerImpl linker = new DocumentLinkerImpl(null, mockRequireJS(), true, "1.2.3", true)
+        DocumentLinkerImpl linker = new DocumentLinkerImpl(null, true, "1.2.3", true)
 
         linker.addStylesheetLink(new StylesheetLink("foo.css"))
 
@@ -194,7 +193,7 @@ pageInitialization();
 
         document.newRootElement("html").element("body").element("p").text("Ready to be updated with scripts.")
 
-        DocumentLinkerImpl linker = new DocumentLinkerImpl(mockModuleManager(), mockRequireJS(), true, "1.2.3", true)
+        DocumentLinkerImpl linker = new DocumentLinkerImpl(mockModuleManager(), true, "1.2.3", true)
 
         replay()
 
@@ -204,7 +203,7 @@ pageInitialization();
         linker.updateDocument(document)
 
         check document, '''
-<html><head></head><body><p>Ready to be updated with scripts.</p><script src="/js/require.js"></script><script type="text/javascript">require.config();
+<html><body><p>Ready to be updated with scripts.</p><script src="/js/require.js"></script><script type="text/javascript">require.config();
 </script><script type="text/javascript">doSomething();
 doSomethingElse();
 </script></body></html>
@@ -222,7 +221,7 @@ doSomethingElse();
 
         document.newRootElement("html").element("notbody").element("p").text("Ready to be updated with scripts.")
 
-        DocumentLinkerImpl linker = new DocumentLinkerImpl(mockModuleManager(), mockRequireJS(), true, "1.2.3", true)
+        DocumentLinkerImpl linker = new DocumentLinkerImpl(mockModuleManager(), true, "1.2.3", true)
 
         linker.addScriptLink("foo.js")
 
@@ -230,7 +229,7 @@ doSomethingElse();
 
         check document, '''
 <?xml version="1.0"?>
-<html><head/><notbody><p>Ready to be updated with scripts.</p></notbody><body><script/><script type="text/javascript">require.config();
+<html><notbody><p>Ready to be updated with scripts.</p></notbody><body><script src="/js/require.js"/><script type="text/javascript">require.config();
 </script><script src="foo.js" type="text/javascript"/></body></html>
 '''
     }
@@ -241,7 +240,7 @@ doSomethingElse();
 
         document.newRootElement("html").element("body").element("p").text("Ready to be updated with scripts.")
 
-        DocumentLinkerImpl linker = new DocumentLinkerImpl(mockModuleManager(), mockRequireJS(), true, "1.2.3", true)
+        DocumentLinkerImpl linker = new DocumentLinkerImpl(mockModuleManager(), true, "1.2.3", true)
 
         replay()
 
@@ -250,7 +249,7 @@ doSomethingElse();
         linker.updateDocument(document)
 
         check document, '''
-<html><head></head><body><p>Ready to be updated with scripts.</p><script src="/js/require.js"></script><script type="text/javascript">require.config();
+<html><body><p>Ready to be updated with scripts.</p><script src="/js/require.js"></script><script type="text/javascript">require.config();
 </script><script type="text/javascript">for (var i = 0; i < 5; i++)  { doIt(i); }
 </script></body></html>
 '''
@@ -264,7 +263,7 @@ doSomethingElse();
 
         document.newRootElement("html").element("body").element("p").text("Ready to be updated with scripts.")
 
-        DocumentLinkerImpl linker = new DocumentLinkerImpl(mockModuleManager(), mockRequireJS(), true, "1.2.3", true)
+        DocumentLinkerImpl linker = new DocumentLinkerImpl(mockModuleManager(), true, "1.2.3", true)
 
         replay()
 
@@ -287,7 +286,7 @@ doSomethingElse();
         head.element("meta")
         head.element("script")
 
-        DocumentLinkerImpl linker = new DocumentLinkerImpl(mockModuleManager(), mockRequireJS(), true, "1.2.3", true)
+        DocumentLinkerImpl linker = new DocumentLinkerImpl(mockModuleManager(), true, "1.2.3", true)
 
         replay()
 
@@ -314,7 +313,7 @@ doSomethingElse();
 
         head.element("meta")
 
-        DocumentLinkerImpl linker = new DocumentLinkerImpl(mockModuleManager(), mockRequireJS(), true, "1.2.3", false)
+        DocumentLinkerImpl linker = new DocumentLinkerImpl(mockModuleManager(), true, "1.2.3", false)
 
         replay()
 
@@ -358,7 +357,7 @@ require(["core/pageinit"], function (pageinit) {
         head.element("meta")
         head.element("script")
 
-        DocumentLinkerImpl linker = new DocumentLinkerImpl(mockModuleManager(), mockRequireJS(), true, "1.2.3", true)
+        DocumentLinkerImpl linker = new DocumentLinkerImpl(mockModuleManager(), true, "1.2.3", true)
 
         replay()
 
@@ -384,7 +383,7 @@ require(["core/pageinit"], function (pageinit) {
 
         document.newRootElement("html")
 
-        DocumentLinkerImpl linker = new DocumentLinkerImpl(null, null, true, "1.2.3", true)
+        DocumentLinkerImpl linker = new DocumentLinkerImpl(null, true, "1.2.3", true)
 
         linker.addStylesheetLink(new StylesheetLink("everybody.css"))
         linker.addStylesheetLink(new StylesheetLink("just_ie.css", new StylesheetOptions().withCondition("IE")))
@@ -406,7 +405,7 @@ require(["core/pageinit"], function (pageinit) {
 
         document.newRootElement("html")
 
-        DocumentLinkerImpl linker = new DocumentLinkerImpl(null, mockRequireJS(), true, "1.2.3", true)
+        DocumentLinkerImpl linker = new DocumentLinkerImpl(null, true, "1.2.3", true)
 
         linker.addStylesheetLink(new StylesheetLink("whatever.css"))
         linker.addStylesheetLink(new StylesheetLink("insertion-point.css", new StylesheetOptions().asAjaxInsertionPoint()))
@@ -426,7 +425,7 @@ require(["core/pageinit"], function (pageinit) {
 
         head.element("meta")
 
-        DocumentLinkerImpl linker = new DocumentLinkerImpl(mockModuleManager(), mockRequireJS(), true, "1.2.3", true)
+        DocumentLinkerImpl linker = new DocumentLinkerImpl(mockModuleManager(), true, "1.2.3", true)
 
         replay()
 
@@ -455,8 +454,10 @@ require(["core/pageinit"], function (pageinit) {
         return new ModuleManager() {
 
             @Override
-            void writeConfiguration(Element scriptElement) {
-                scriptElement.raw("require.config();\n")
+            void writeInitialization(Element body) {
+                // Placeholder for the real code, inside ModuleManagerImpl
+                body.element("script", "src", "/js/require.js");
+                body.element("script", "type", "text/javascript").raw("require.config();\n")
             }
 
             @Override
@@ -465,12 +466,4 @@ require(["core/pageinit"], function (pageinit) {
             }
         };
     }
-
-    private Asset mockRequireJS() {
-        Asset mock = newMock(Asset.class)
-
-        expect(mock.toClientURL()).andReturn("/js/require.js").once()
-
-        return mock;
-    }
 }