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 2010/07/29 22:38:04 UTC
svn commit: r980565 - in /tapestry/tapestry5/trunk/tapestry-core/src:
main/java/org/apache/tapestry5/annotations/
main/java/org/apache/tapestry5/internal/services/ajax/
main/java/org/apache/tapestry5/internal/services/javascript/
main/java/org/apache/t...
Author: hlship
Date: Thu Jul 29 20:38:03 2010
New Revision: 980565
URL: http://svn.apache.org/viewvc?rev=980565&view=rev
Log:
Add support for dependencies from one JavaScriptStack to others
Modified:
tapestry/tapestry5/trunk/tapestry-core/src/main/java/org/apache/tapestry5/annotations/Import.java
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/internal/services/javascript/CoreJavaScriptStack.java
tapestry/tapestry5/trunk/tapestry-core/src/main/java/org/apache/tapestry5/internal/services/javascript/DateFieldStack.java
tapestry/tapestry5/trunk/tapestry-core/src/main/java/org/apache/tapestry5/services/javascript/JavaScriptStack.java
tapestry/tapestry5/trunk/tapestry-core/src/main/java/org/apache/tapestry5/services/javascript/StylesheetOptions.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/annotations/Import.java
URL: http://svn.apache.org/viewvc/tapestry/tapestry5/trunk/tapestry-core/src/main/java/org/apache/tapestry5/annotations/Import.java?rev=980565&r1=980564&r2=980565&view=diff
==============================================================================
--- tapestry/tapestry5/trunk/tapestry-core/src/main/java/org/apache/tapestry5/annotations/Import.java (original)
+++ tapestry/tapestry5/trunk/tapestry-core/src/main/java/org/apache/tapestry5/annotations/Import.java Thu Jul 29 20:38:03 2010
@@ -49,7 +49,9 @@ import org.apache.tapestry5.services.jav
public @interface Import
{
/**
- * JavaScript Stacks to import. Stacks are imported before individual libraries.
+ * JavaScript Stacks to import. Stacks are imported before individual libraries. Note that
+ * stacks themselves may have {@linkplain JavaScriptStack#getStacks() dependencies on other
+ * stacks}.
*
* @see JavaScriptStack
* @see JavaScriptSupport#importStack(String)
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=980565&r1=980564&r2=980565&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 Thu Jul 29 20:38:03 2010
@@ -220,6 +220,11 @@ public class JavaScriptSupportImpl imple
JavaScriptStack stack = javascriptStackSource.getStack(stackName);
+ for (String dependentStackname : stack.getStacks())
+ {
+ addAssetsFromStack(dependentStackname);
+ }
+
stackLibraries.addAll(stackPathConstructor.constructPathsForJavaScriptStack(stackName));
stylesheetLinks.addAll(stack.getStylesheets());
Modified: tapestry/tapestry5/trunk/tapestry-core/src/main/java/org/apache/tapestry5/internal/services/javascript/CoreJavaScriptStack.java
URL: http://svn.apache.org/viewvc/tapestry/tapestry5/trunk/tapestry-core/src/main/java/org/apache/tapestry5/internal/services/javascript/CoreJavaScriptStack.java?rev=980565&r1=980564&r2=980565&view=diff
==============================================================================
--- tapestry/tapestry5/trunk/tapestry-core/src/main/java/org/apache/tapestry5/internal/services/javascript/CoreJavaScriptStack.java (original)
+++ tapestry/tapestry5/trunk/tapestry-core/src/main/java/org/apache/tapestry5/internal/services/javascript/CoreJavaScriptStack.java Thu Jul 29 20:38:03 2010
@@ -14,6 +14,7 @@
package org.apache.tapestry5.internal.services.javascript;
+import java.util.Collections;
import java.util.List;
import org.apache.tapestry5.Asset;
@@ -61,4 +62,9 @@ public class CoreJavaScriptStack impleme
.toList();
}
+ public List<String> getStacks()
+ {
+ return Collections.emptyList();
+ }
+
}
Modified: tapestry/tapestry5/trunk/tapestry-core/src/main/java/org/apache/tapestry5/internal/services/javascript/DateFieldStack.java
URL: http://svn.apache.org/viewvc/tapestry/tapestry5/trunk/tapestry-core/src/main/java/org/apache/tapestry5/internal/services/javascript/DateFieldStack.java?rev=980565&r1=980564&r2=980565&view=diff
==============================================================================
--- tapestry/tapestry5/trunk/tapestry-core/src/main/java/org/apache/tapestry5/internal/services/javascript/DateFieldStack.java (original)
+++ tapestry/tapestry5/trunk/tapestry-core/src/main/java/org/apache/tapestry5/internal/services/javascript/DateFieldStack.java Thu Jul 29 20:38:03 2010
@@ -16,6 +16,7 @@ package org.apache.tapestry5.internal.se
import java.text.DateFormatSymbols;
import java.util.Calendar;
+import java.util.Collections;
import java.util.List;
import java.util.Locale;
@@ -59,8 +60,9 @@ public class DateFieldStack implements J
Mapper<String, StylesheetLink> pathToStylesheetLink = pathToAsset
.combine(TapestryInternalUtils.assetToStylesheetLink);
- javaScriptStack = F.flow("${tapestry.datepicker}/js/datepicker.js",
- "org/apache/tapestry5/corelib/components/datefield.js").map(pathToAsset).toList();
+ javaScriptStack = F
+ .flow("${tapestry.datepicker}/js/datepicker.js", "org/apache/tapestry5/corelib/components/datefield.js")
+ .map(pathToAsset).toList();
stylesheetStack = F.flow("${tapestry.datepicker}/css/datepicker.css").map(pathToStylesheetLink).toList();
}
@@ -113,4 +115,8 @@ public class DateFieldStack implements J
return stylesheetStack;
}
+ public List<String> getStacks()
+ {
+ return Collections.emptyList();
+ }
}
Modified: tapestry/tapestry5/trunk/tapestry-core/src/main/java/org/apache/tapestry5/services/javascript/JavaScriptStack.java
URL: http://svn.apache.org/viewvc/tapestry/tapestry5/trunk/tapestry-core/src/main/java/org/apache/tapestry5/services/javascript/JavaScriptStack.java?rev=980565&r1=980564&r2=980565&view=diff
==============================================================================
--- tapestry/tapestry5/trunk/tapestry-core/src/main/java/org/apache/tapestry5/services/javascript/JavaScriptStack.java (original)
+++ tapestry/tapestry5/trunk/tapestry-core/src/main/java/org/apache/tapestry5/services/javascript/JavaScriptStack.java Thu Jul 29 20:38:03 2010
@@ -18,6 +18,7 @@ import java.util.List;
import org.apache.tapestry5.Asset;
import org.apache.tapestry5.SymbolConstants;
+import org.apache.tapestry5.TapestryConstants;
import org.apache.tapestry5.ioc.services.ThreadLocale;
import org.apache.tapestry5.services.AssetSource;
import org.apache.tapestry5.services.ClientInfrastructure;
@@ -30,16 +31,15 @@ import org.apache.tapestry5.services.Cli
* of the ExtJS or YUI libraries.
* <p>
* A JavaScriptStack can be thought of as a generalization of Tapestry 5.1's {@link ClientInfrastructure}, which exists
- * now to define the "core" Javascript stack.
+ * now to define the "core" JavaScript stack.
* <p>
* A JavaScript assets of a stack may (when {@linkplain SymbolConstants#COMBINE_SCRIPTS enabled}) be exposed to the
* client as a single URL (identifying the stack by name). The individual assets are combined into a single virtual
* asset, which is then streamed to the client.
* <p>
* Implementations may need to inject the {@link ThreadLocale} service in order to determine the current locale (if any
- * of the assets are localized). They will generally need to inject they {@link AssetSource} service as well.
- * <p>
- * A planned extension to this interface is to allow for dependencies between JavaScriptStacks.
+ * of the JavaScript library or stylesheet assets are localized). They will generally need to inject the
+ * {@link AssetSource} service as well.
*
* @since 5.2.0
* @see ThreadLocale
@@ -47,12 +47,19 @@ import org.apache.tapestry5.services.Cli
public interface JavaScriptStack
{
/**
+ * Returns a list of JavaScriptStack names that this stack depends on. Each stack will be processed before
+ * the current stack (thus a dependency stack's libraries, stylesheets and initialization is emitted before
+ * the dependent stack).
+ */
+ List<String> getStacks();
+
+ /**
* Returns a list of <em>localized</em> assets for JavaScript libraries that form the stack.
*/
List<Asset> getJavaScriptLibraries();
/**
- * Returns a list of <em>localized<m/e> links for stylesheets that form the stack.
+ * Returns a list of <em>localized</em> links for stylesheets that form the stack.
*/
List<StylesheetLink> getStylesheets();
Modified: tapestry/tapestry5/trunk/tapestry-core/src/main/java/org/apache/tapestry5/services/javascript/StylesheetOptions.java
URL: http://svn.apache.org/viewvc/tapestry/tapestry5/trunk/tapestry-core/src/main/java/org/apache/tapestry5/services/javascript/StylesheetOptions.java?rev=980565&r1=980564&r2=980565&view=diff
==============================================================================
--- tapestry/tapestry5/trunk/tapestry-core/src/main/java/org/apache/tapestry5/services/javascript/StylesheetOptions.java (original)
+++ tapestry/tapestry5/trunk/tapestry-core/src/main/java/org/apache/tapestry5/services/javascript/StylesheetOptions.java Thu Jul 29 20:38:03 2010
@@ -60,7 +60,7 @@ public class StylesheetOptions
@Override
public String toString()
{
- return String.format("StylesheetOptions[media=%s condition=%s]", media);
+ return String.format("StylesheetOptions[media=%s condition=%s]", media, condition);
}
@Override
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=980565&r1=980564&r2=980565&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 Thu Jul 29 20:38:03 2010
@@ -14,6 +14,7 @@
package org.apache.tapestry5.internal.services.ajax;
+import java.util.Arrays;
import java.util.Collections;
import java.util.List;
@@ -110,6 +111,7 @@ public class JavaScriptSupportImplTest e
List<String> libraryPaths = Collections.emptyList();
List<StylesheetLink> stylesheets = Collections.emptyList();
+ List<String> stacks = libraryPaths;
expect(stackSource.getStack(InternalConstants.CORE_STACK_NAME)).andReturn(stack);
expect(pathConstructor.constructPathsForJavaScriptStack(InternalConstants.CORE_STACK_NAME)).andReturn(
@@ -117,6 +119,8 @@ public class JavaScriptSupportImplTest e
expect(stack.getStylesheets()).andReturn(stylesheets);
expect(stack.getInitialization()).andReturn(null);
+
+ expect(stack.getStacks()).andReturn(stacks);
}
private void trainForCoreStack(DocumentLinker linker, JavaScriptStackSource stackSource,
@@ -133,6 +137,9 @@ public class JavaScriptSupportImplTest e
expect(stack.getInitialization()).andReturn("stackInit();");
+ List<String> stacks = Collections.emptyList();
+ expect(stack.getStacks()).andReturn(stacks);
+
linker.addScriptLink("stack1.js");
linker.addScriptLink("stack2.js");
linker.addStylesheetLink(stylesheetLink);
@@ -215,6 +222,9 @@ public class JavaScriptSupportImplTest e
expect(stack.getInitialization()).andReturn("customInit();");
+ List<String> stacks = Collections.emptyList();
+ expect(stack.getStacks()).andReturn(stacks);
+
linker.addScriptLink("stack.js");
linker.addStylesheetLink(stylesheetLink);
@@ -236,6 +246,61 @@ public class JavaScriptSupportImplTest e
}
@Test
+ public void import_stack_with_dependencies()
+ {
+ DocumentLinker linker = mockDocumentLinker();
+ JavaScriptStackSource stackSource = mockJavaScriptStackSource();
+ JavaScriptStackPathConstructor pathConstructor = mockJavaScriptStackPathConstructor();
+
+ trainForCoreStack(linker, stackSource, pathConstructor);
+
+ JavaScriptStack child = mockJavaScriptStack();
+ JavaScriptStack parent = mockJavaScriptStack();
+
+ StylesheetLink parentStylesheetLink = new StylesheetLink("parent.css");
+
+ StylesheetLink childStylesheetLink = new StylesheetLink("child.css");
+
+ expect(stackSource.getStack("child")).andReturn(child);
+
+ expect(child.getStacks()).andReturn(Arrays.asList("parent"));
+
+ expect(stackSource.getStack("parent")).andReturn(parent);
+
+ expect(pathConstructor.constructPathsForJavaScriptStack("parent")).andReturn(Arrays.asList("parent.js"));
+ expect(parent.getStylesheets()).andReturn(Arrays.asList(parentStylesheetLink));
+
+ expect(parent.getInitialization()).andReturn("parentInit();");
+
+ expect(pathConstructor.constructPathsForJavaScriptStack("child")).andReturn(Arrays.asList("child.js"));
+ expect(child.getStylesheets()).andReturn(Arrays.asList(childStylesheetLink));
+
+ expect(child.getInitialization()).andReturn("childInit();");
+
+ expect(parent.getStacks()).andReturn(Collections.<String> emptyList());
+
+ linker.addScriptLink("parent.js");
+ linker.addScriptLink("child.js");
+
+ linker.addStylesheetLink(parentStylesheetLink);
+ linker.addStylesheetLink(childStylesheetLink);
+
+ linker.addScript(InitializationPriority.IMMEDIATE, "stackInit();");
+ linker.addScript(InitializationPriority.IMMEDIATE, "parentInit();");
+ linker.addScript(InitializationPriority.IMMEDIATE, "childInit();");
+
+ replay();
+
+ JavaScriptSupportImpl jss = new JavaScriptSupportImpl(linker, stackSource, pathConstructor);
+
+ jss.importStack("child");
+
+ jss.commit();
+
+ verify();
+ }
+
+ @Test
public void duplicate_imported_libraries_are_filtered()
{
DocumentLinker linker = mockDocumentLinker();