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 <[email protected]>
Authored: Fri Jan 20 10:56:31 2012 +0100
Committer: Martin Tzvetanov Grigorov <[email protected]>
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"));
+               }
+       }
+
+}

Reply via email to