You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@wicket.apache.org by mg...@apache.org on 2012/01/20 10:56:43 UTC

git commit: WICKET-4347 renderHead not called in an IAjaxCallDecorator that implements IComponentAwareHeaderContributor

Updated Branches:
  refs/heads/wicket-1.5.x 2b6fb6b86 -> 8fe23b210


WICKET-4347
renderHead not called in an IAjaxCallDecorator that implements IComponentAwareHeaderContributor


Project: http://git-wip-us.apache.org/repos/asf/wicket/repo
Commit: http://git-wip-us.apache.org/repos/asf/wicket/commit/8fe23b21
Tree: http://git-wip-us.apache.org/repos/asf/wicket/tree/8fe23b21
Diff: http://git-wip-us.apache.org/repos/asf/wicket/diff/8fe23b21

Branch: refs/heads/wicket-1.5.x
Commit: 8fe23b210f01207609e30736c81ec93a748dec47
Parents: 2b6fb6b
Author: Martin Tzvetanov Grigorov <mg...@apache.org>
Authored: Fri Jan 20 10:56:31 2012 +0100
Committer: Martin Tzvetanov Grigorov <mg...@apache.org>
Committed: Fri Jan 20 10:56:31 2012 +0100

----------------------------------------------------------------------
 .../wicket/ajax/AbstractDefaultAjaxBehavior.java   |   49 ++++++++-
 .../AjaxPostprocessingCallDecorator.java           |    7 +-
 .../AjaxPreprocessingCallDecorator.java            |    6 +-
 .../calldecorator/IAjaxCallDecoratorDelegate.java  |   32 +++++
 .../AjaxCallDecoratorDelegateTest.java             |   89 +++++++++++++++
 5 files changed, 178 insertions(+), 5 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/wicket/blob/8fe23b21/wicket-core/src/main/java/org/apache/wicket/ajax/AbstractDefaultAjaxBehavior.java
----------------------------------------------------------------------
diff --git a/wicket-core/src/main/java/org/apache/wicket/ajax/AbstractDefaultAjaxBehavior.java b/wicket-core/src/main/java/org/apache/wicket/ajax/AbstractDefaultAjaxBehavior.java
index c9f5bab..386af7d 100644
--- a/wicket-core/src/main/java/org/apache/wicket/ajax/AbstractDefaultAjaxBehavior.java
+++ b/wicket-core/src/main/java/org/apache/wicket/ajax/AbstractDefaultAjaxBehavior.java
@@ -19,6 +19,7 @@ package org.apache.wicket.ajax;
 import org.apache.wicket.Application;
 import org.apache.wicket.Component;
 import org.apache.wicket.Page;
+import org.apache.wicket.ajax.calldecorator.IAjaxCallDecoratorDelegate;
 import org.apache.wicket.behavior.AbstractAjaxBehavior;
 import org.apache.wicket.markup.html.IComponentAwareHeaderContributor;
 import org.apache.wicket.markup.html.IHeaderResponse;
@@ -89,10 +90,52 @@ public abstract class AbstractDefaultAjaxBehavior extends AbstractAjaxBehavior
 		response.renderJavaScript("Wicket.Ajax.baseUrl=\"" + ajaxBaseUrl + "\";",
 			"wicket-ajax-base-url");
 
-		final IAjaxCallDecorator ajaxCallDecorator = getAjaxCallDecorator();
-		if (ajaxCallDecorator instanceof IComponentAwareHeaderContributor)
+		contributeAjaxCallDecorator(component, response);
+	}
+
+	/**
+	 * Contributes dependencies of IAjaxCallDecorator to the header
+	 *
+	 * @param component
+	 *      the component this behavior is attached to
+	 * @param response
+	 *      the header response to write to
+	 */
+	private void contributeAjaxCallDecorator(Component component, IHeaderResponse response)
+	{
+		IAjaxCallDecorator ajaxCallDecorator = getAjaxCallDecorator();
+		contributeComponentAwareHeaderContributor(ajaxCallDecorator, component, response);
+
+		Object cursor = ajaxCallDecorator;
+		while (cursor != null)
+		{
+			if (cursor instanceof IAjaxCallDecoratorDelegate)
+			{
+				cursor = ((IAjaxCallDecoratorDelegate) cursor).getDelegate();
+				contributeComponentAwareHeaderContributor(cursor, component, response);
+			}
+			else
+			{
+				cursor = null;
+			}
+		}
+	}
+
+	/**
+	 * Contributes to the header if {@literal target} is an instance of IComponentAwareHeaderContributor
+	 *
+	 * @param target
+	 *      the candidate object that may contribute to the header
+	 * @param component
+	 *      the component this behavior is attached to
+	 * @param response
+	 *      the header response to write to
+	 */
+	private void contributeComponentAwareHeaderContributor(Object target, Component component, IHeaderResponse response)
+	{
+		if (target instanceof IComponentAwareHeaderContributor)
 		{
-			IComponentAwareHeaderContributor contributor = (IComponentAwareHeaderContributor)ajaxCallDecorator;
+			IComponentAwareHeaderContributor contributor = (IComponentAwareHeaderContributor)target;
 			contributor.renderHead(component, response);
 		}
 	}

http://git-wip-us.apache.org/repos/asf/wicket/blob/8fe23b21/wicket-core/src/main/java/org/apache/wicket/ajax/calldecorator/AjaxPostprocessingCallDecorator.java
----------------------------------------------------------------------
diff --git a/wicket-core/src/main/java/org/apache/wicket/ajax/calldecorator/AjaxPostprocessingCallDecorator.java b/wicket-core/src/main/java/org/apache/wicket/ajax/calldecorator/AjaxPostprocessingCallDecorator.java
index b81c8ac..ae7f40e 100644
--- a/wicket-core/src/main/java/org/apache/wicket/ajax/calldecorator/AjaxPostprocessingCallDecorator.java
+++ b/wicket-core/src/main/java/org/apache/wicket/ajax/calldecorator/AjaxPostprocessingCallDecorator.java
@@ -29,7 +29,7 @@ import org.apache.wicket.ajax.IAjaxCallDecorator;
  * 
  * @author Igor Vaynberg (ivaynberg)
  */
-public abstract class AjaxPostprocessingCallDecorator implements IAjaxCallDecorator
+public abstract class AjaxPostprocessingCallDecorator implements IAjaxCallDecorator, IAjaxCallDecoratorDelegate
 {
 	/**
 	 * 
@@ -108,4 +108,9 @@ public abstract class AjaxPostprocessingCallDecorator implements IAjaxCallDecora
 	{
 		return script;
 	}
+
+	public IAjaxCallDecorator getDelegate()
+	{
+		return delegate;
+	}
 }

http://git-wip-us.apache.org/repos/asf/wicket/blob/8fe23b21/wicket-core/src/main/java/org/apache/wicket/ajax/calldecorator/AjaxPreprocessingCallDecorator.java
----------------------------------------------------------------------
diff --git a/wicket-core/src/main/java/org/apache/wicket/ajax/calldecorator/AjaxPreprocessingCallDecorator.java b/wicket-core/src/main/java/org/apache/wicket/ajax/calldecorator/AjaxPreprocessingCallDecorator.java
index 69046c7..8dd2057 100644
--- a/wicket-core/src/main/java/org/apache/wicket/ajax/calldecorator/AjaxPreprocessingCallDecorator.java
+++ b/wicket-core/src/main/java/org/apache/wicket/ajax/calldecorator/AjaxPreprocessingCallDecorator.java
@@ -28,7 +28,7 @@ import org.apache.wicket.ajax.IAjaxCallDecorator;
  * 
  * @author Igor Vaynberg (ivaynberg)
  */
-public class AjaxPreprocessingCallDecorator implements IAjaxCallDecorator
+public class AjaxPreprocessingCallDecorator implements IAjaxCallDecorator, IAjaxCallDecoratorDelegate
 {
 	private static final long serialVersionUID = 1L;
 
@@ -100,4 +100,8 @@ public class AjaxPreprocessingCallDecorator implements IAjaxCallDecorator
 	}
 
 
+	public IAjaxCallDecorator getDelegate()
+	{
+		return delegate;
+	}
 }

http://git-wip-us.apache.org/repos/asf/wicket/blob/8fe23b21/wicket-core/src/main/java/org/apache/wicket/ajax/calldecorator/IAjaxCallDecoratorDelegate.java
----------------------------------------------------------------------
diff --git a/wicket-core/src/main/java/org/apache/wicket/ajax/calldecorator/IAjaxCallDecoratorDelegate.java b/wicket-core/src/main/java/org/apache/wicket/ajax/calldecorator/IAjaxCallDecoratorDelegate.java
new file mode 100644
index 0000000..8856643
--- /dev/null
+++ b/wicket-core/src/main/java/org/apache/wicket/ajax/calldecorator/IAjaxCallDecoratorDelegate.java
@@ -0,0 +1,32 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements.  See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.
+ * The ASF licenses this file to You under the Apache License, Version 2.0
+ * (the "License"); you may not use this file except in compliance with
+ * the License.  You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+package org.apache.wicket.ajax.calldecorator;
+
+import org.apache.wicket.ajax.IAjaxCallDecorator;
+
+/**
+ * An interface that indicates that IAjaxCallDecorator delegates to another one.
+ *
+ * @since 1.5
+ */
+public interface IAjaxCallDecoratorDelegate
+{
+	/**
+	 * @return the delegate
+	 */
+	IAjaxCallDecorator getDelegate();
+}

http://git-wip-us.apache.org/repos/asf/wicket/blob/8fe23b21/wicket-core/src/test/java/org/apache/wicket/ajax/calldecorator/AjaxCallDecoratorDelegateTest.java
----------------------------------------------------------------------
diff --git a/wicket-core/src/test/java/org/apache/wicket/ajax/calldecorator/AjaxCallDecoratorDelegateTest.java b/wicket-core/src/test/java/org/apache/wicket/ajax/calldecorator/AjaxCallDecoratorDelegateTest.java
new file mode 100644
index 0000000..49be0f0
--- /dev/null
+++ b/wicket-core/src/test/java/org/apache/wicket/ajax/calldecorator/AjaxCallDecoratorDelegateTest.java
@@ -0,0 +1,89 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements.  See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.
+ * The ASF licenses this file to You under the Apache License, Version 2.0
+ * (the "License"); you may not use this file except in compliance with
+ * the License.  You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+package org.apache.wicket.ajax.calldecorator;
+
+import org.apache.wicket.Component;
+import org.apache.wicket.MarkupContainer;
+import org.apache.wicket.WicketTestCase;
+import org.apache.wicket.ajax.AjaxRequestTarget;
+import org.apache.wicket.ajax.IAjaxCallDecorator;
+import org.apache.wicket.ajax.markup.html.AjaxLink;
+import org.apache.wicket.markup.IMarkupResourceStreamProvider;
+import org.apache.wicket.markup.html.IComponentAwareHeaderContributor;
+import org.apache.wicket.markup.html.IHeaderResponse;
+import org.apache.wicket.markup.html.WebPage;
+import org.apache.wicket.request.resource.PackageResourceReference;
+import org.apache.wicket.util.resource.IResourceStream;
+import org.apache.wicket.util.resource.StringResourceStream;
+import org.junit.Test;
+
+/**
+ * Tests for IAjaxCallDecoratorDelegate
+ *
+ * @since 1.5
+ */
+public class AjaxCallDecoratorDelegateTest extends WicketTestCase
+{
+	/**
+	 * Tests that the delegates of IAjaxCallDecorator also contribute to the header
+	 * https://issues.apache.org/jira/browse/WICKET-4347
+	 */
+	@Test
+	public void delegateShouldContributeToTheHeader() {
+		
+		tester.startPage(new HomePage());
+
+		tester.assertContains("<script type=\"text/javascript\" src=\"resource/org.apache.wicket.ajax.calldecorator.AjaxCallDecoratorDelegateTest\\$ContributingDecorator/myscript.js\"></script>");
+	}
+	
+	private static class HomePage extends WebPage implements IMarkupResourceStreamProvider
+	{
+		public HomePage() {
+			add(new AjaxLink("link") {
+	
+				@Override
+				public void onClick(AjaxRequestTarget target) {
+				}
+	
+				@Override
+				protected IAjaxCallDecorator getAjaxCallDecorator() {
+					return new ContributingDecorator(super.getAjaxCallDecorator());
+				}
+			});
+		}
+
+		public IResourceStream getMarkupResourceStream(MarkupContainer container, Class<?> containerClass)
+		{
+			return new StringResourceStream("<html><body><a wicket:id='link'>link</a></body></html>");
+		}
+	}
+	
+	private static class ContributingDecorator 
+			extends AjaxPreprocessingCallDecorator 
+			implements IComponentAwareHeaderContributor
+	{
+
+		private ContributingDecorator(IAjaxCallDecorator delegate) {
+			super(delegate);
+		}
+
+		public void renderHead(Component component, IHeaderResponse response) {
+			response.renderJavaScriptReference(new PackageResourceReference(getClass(), "myscript.js"));
+		}
+	}
+
+}