Author: hlship
Date: Mon Apr 19 14:41:21 2010
New Revision: 935598

URL: http://svn.apache.org/viewvc?rev=935598&view=rev
Log:
Add method importStack() to JavascriptSupport environmental

Modified:
    
tapestry/tapestry5/trunk/tapestry-core/src/main/java/org/apache/tapestry5/internal/services/ajax/JavascriptSupportImpl.java
    
tapestry/tapestry5/trunk/tapestry-core/src/main/java/org/apache/tapestry5/services/javascript/JavascriptSupport.java
    
tapestry/tapestry5/trunk/tapestry-core/src/test/java/org/apache/tapestry5/internal/services/ajax/JavascriptSupportImplTest.java

Modified: 
tapestry/tapestry5/trunk/tapestry-core/src/main/java/org/apache/tapestry5/internal/services/ajax/JavascriptSupportImpl.java
URL: 
http://svn.apache.org/viewvc/tapestry/tapestry5/trunk/tapestry-core/src/main/java/org/apache/tapestry5/internal/services/ajax/JavascriptSupportImpl.java?rev=935598&r1=935597&r2=935598&view=diff
==============================================================================
--- 
tapestry/tapestry5/trunk/tapestry-core/src/main/java/org/apache/tapestry5/internal/services/ajax/JavascriptSupportImpl.java
 (original)
+++ 
tapestry/tapestry5/trunk/tapestry-core/src/main/java/org/apache/tapestry5/internal/services/ajax/JavascriptSupportImpl.java
 Mon Apr 19 14:41:21 2010
@@ -205,7 +205,7 @@ public class JavascriptSupportImpl imple
         Defense.notNull(parameter, "parameter");
 
         addCoreStackIfNeeded();
-        
+
         JSONObject init = inits.get(priority);
 
         if (init == null)
@@ -342,4 +342,13 @@ public class JavascriptSupportImpl imple
         otherStylesheets.add(new Stylesheet(stylesheetURL, media));
     }
 
+    public void importStack(String stackName)
+    {
+        Defense.notBlank(stackName, "stackName");
+
+        addCoreStackIfNeeded();
+
+        addAssetsFromStack(stackName);
+    }
+
 }

Modified: 
tapestry/tapestry5/trunk/tapestry-core/src/main/java/org/apache/tapestry5/services/javascript/JavascriptSupport.java
URL: 
http://svn.apache.org/viewvc/tapestry/tapestry5/trunk/tapestry-core/src/main/java/org/apache/tapestry5/services/javascript/JavascriptSupport.java?rev=935598&r1=935597&r2=935598&view=diff
==============================================================================
--- 
tapestry/tapestry5/trunk/tapestry-core/src/main/java/org/apache/tapestry5/services/javascript/JavascriptSupport.java
 (original)
+++ 
tapestry/tapestry5/trunk/tapestry-core/src/main/java/org/apache/tapestry5/services/javascript/JavascriptSupport.java
 Mon Apr 19 14:41:21 2010
@@ -17,6 +17,7 @@ package org.apache.tapestry5.services.ja
 import org.apache.tapestry5.Asset;
 import org.apache.tapestry5.ComponentResources;
 import org.apache.tapestry5.RenderSupport;
+import org.apache.tapestry5.SymbolConstants;
 import org.apache.tapestry5.annotations.Environmental;
 import org.apache.tapestry5.annotations.IncludeJavaScriptLibrary;
 import org.apache.tapestry5.json.JSONObject;
@@ -24,14 +25,17 @@ import org.apache.tapestry5.services.Env
 
 /**
  * An environmental that acts as a replacement for the {...@link 
RenderSupport} environmental, renaming and streamlining
- * the the key methods. JavascriptSupport is very stateful, accumulating 
JavaScript libraries and initialization code
- * until the end of the main page render; it then updates the rendered DOM 
(adding <script> tags to the
+ * the the key methods. JavascriptSupport is very stateful, accumulating 
JavaScript stacks, libraries and initialization
+ * code until the end of the main page render; it then updates the rendered 
DOM (adding <script> tags to the
  * <head> and <body>) before the document is streamed to the 
client.
  * <p>
  * JavascriptSupport is normally accessed within a component by using the 
{...@link Environmental} annotation on a
  * component field. In addition, JavascriptSupport may also be accessed as a 
service (the service
  * {...@linkplain EnvironmentalShadowBuilder internally delegates to the 
current environmental instance}), which is useful
  * for service-layer objects.
+ * <p>
+ * The term "import" is used on many methods to indicate that the indicated 
resource (stack, library or stylesheet) will
+ * only be added to the final Document once.
  * 
  * @since 5.2.0
  */
@@ -162,4 +166,15 @@ public interface JavascriptSupport
      */
     void importStylesheet(String stylesheetURL, String media);
 
+    /**
+     * Imports a {...@link JavascriptStack} by name, a related set of 
JavaScript libraries and stylesheets.
+     * Stacks are contributions to the {...@link JavascriptStackSource} 
service. When
+     * {...@linkplain SymbolConstants#COMBINE_SCRIPTS Javascript aggregation} 
in enabled, the stack will be represented by
+     * a single virtual URL; otherwise the individual asset URLs of the stack
+     * will be added to the document.
+     * 
+     * @param stackName
+     *            the name of the stack (case is ignored); the stack must exist
+     */
+    void importStack(String stackName);
 }

Modified: 
tapestry/tapestry5/trunk/tapestry-core/src/test/java/org/apache/tapestry5/internal/services/ajax/JavascriptSupportImplTest.java
URL: 
http://svn.apache.org/viewvc/tapestry/tapestry5/trunk/tapestry-core/src/test/java/org/apache/tapestry5/internal/services/ajax/JavascriptSupportImplTest.java?rev=935598&r1=935597&r2=935598&view=diff
==============================================================================
--- 
tapestry/tapestry5/trunk/tapestry-core/src/test/java/org/apache/tapestry5/internal/services/ajax/JavascriptSupportImplTest.java
 (original)
+++ 
tapestry/tapestry5/trunk/tapestry-core/src/test/java/org/apache/tapestry5/internal/services/ajax/JavascriptSupportImplTest.java
 Mon Apr 19 14:41:21 2010
@@ -242,6 +242,45 @@ public class JavascriptSupportImplTest e
     }
 
     @Test
+    public void import_stack()
+    {
+        DocumentLinker linker = mockDocumentLinker();
+        JavascriptStackSource stackSource = mockJavascriptStackSource();
+        JavascriptStackPathConstructor pathConstructor = 
mockJavascriptStackPathConstructor();
+
+        trainForCoreStack(linker, stackSource, pathConstructor);
+
+        JavascriptStack stack = mockJavascriptStack();
+
+        Asset stylesheet = mockAsset("stack.css");
+
+        expect(stackSource.getStack("custom")).andReturn(stack);
+        
expect(pathConstructor.constructPathsForJavascriptStack("custom")).andReturn(
+                CollectionFactory.newList("stack.js"));
+        
expect(stack.getStylesheets()).andReturn(CollectionFactory.newList(stylesheet));
+
+        expect(stack.getInitialization()).andReturn("customInit();");
+
+        linker.addScriptLink("stack.js");
+        linker.addStylesheetLink("stack.css", null);
+
+        linker.addScript("stackInit();\ncustomInit();\n");
+
+        replay();
+
+        JavascriptSupportImpl jss = new JavascriptSupportImpl(linker, 
stackSource, pathConstructor);
+
+        jss.importStack("custom");
+        
+        // Duplicate calls are ignored.
+        jss.importStack("Custom");
+
+        jss.commit();
+
+        verify();
+    }
+
+    @Test
     public void duplicate_imported_libraries_are_filtered()
     {
         DocumentLinker linker = mockDocumentLinker();


Reply via email to