i am currently using this patch for our wicket code so that we can move on..


First check is that if it is an ajax request for that behavior then
just throw an abort exception..
Dont just return null because the constantly a full page render is
done instead of the ajax behavior request.

Second is that i introduced an tagging interface so that behaviors can
make them self work for disabled components if they want to.

anybody a better idea?

johan

### Eclipse Workspace Patch 1.0
#P wicket
Index: 
src/main/java/org/apache/wicket/behavior/IIgnoreDisabledComponentBehavior.java
===================================================================
--- 
src/main/java/org/apache/wicket/behavior/IIgnoreDisabledComponentBehavior.java  
    (revision
0)
+++ 
src/main/java/org/apache/wicket/behavior/IIgnoreDisabledComponentBehavior.java  
    (revision
0)
@@ -0,0 +1,28 @@
+/*
+ * 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.behavior;
+
+/**
+ * Interface that can be used to tag behaviors where response should
be called on even if the
+ * component is disabled.
+ *
+ * @author jcompagner
+ */
+public interface IIgnoreDisabledComponentBehavior extends IBehavior
+{
+
+}
Index: 
src/main/java/org/apache/wicket/request/target/component/listener/BehaviorRequestTarget.java
===================================================================
--- 
src/main/java/org/apache/wicket/request/target/component/listener/BehaviorRequestTarget.java
        (revision
1033481)
+++ 
src/main/java/org/apache/wicket/request/target/component/listener/BehaviorRequestTarget.java
        (working
copy)
@@ -18,13 +18,16 @@

 import java.util.List;

+import org.apache.wicket.AbortException;
 import org.apache.wicket.Component;
 import org.apache.wicket.Page;
 import org.apache.wicket.RequestCycle;
 import org.apache.wicket.RequestListenerInterface;
 import org.apache.wicket.behavior.IBehavior;
 import org.apache.wicket.behavior.IBehaviorListener;
+import org.apache.wicket.behavior.IIgnoreDisabledComponentBehavior;
 import org.apache.wicket.protocol.http.PageExpiredException;
+import org.apache.wicket.protocol.http.WebRequest;
 import org.apache.wicket.request.RequestParameters;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
@@ -85,13 +88,6 @@
                // Get the IBehavior for the component based on the request 
parameters
                final Component component = getTarget();

-               if (!component.isVisibleInHierarchy() || 
!component.isEnabledInHierarchy())
-               {
-                       // ignore this request
-                       logger.warn("component not enabled or visible; ignoring 
call.
Component: {}", component);
-                       return;
-               }
-
                final String id = getRequestParameters().getBehaviorId();
                if (id == null)
                {
@@ -124,6 +120,11 @@
                                        logger.warn(
                                                "behavior not enabled; ignoring 
call. behavior: {} at index: {}
on component: {}",
                                                new Object[] { behavior, 
idAsInt, component });
+                                       if (requestCycle.getRequest() 
instanceof WebRequest &&
+                                               
((WebRequest)requestCycle.getRequest()).isAjax())
+                                       {
+                                               throw new AbortException();
+                                       }
                                        return;
                                }

@@ -138,6 +139,20 @@
                                "; Component: " + component.toString());
                }

+               if (!component.isVisibleInHierarchy() ||
+                       (!(behaviorListener instanceof 
IIgnoreDisabledComponentBehavior)
&& !component.isEnabledInHierarchy()))
+               {
+                       // ignore this request
+                       logger.warn("component not enabled or visible; ignoring 
call.
Component: {}", component);
+                       if (requestCycle.getRequest() instanceof WebRequest &&
+                               
((WebRequest)requestCycle.getRequest()).isAjax())
+                       {
+                               throw new AbortException();
+                       }
+                       return;
+               }
+
+
                // Invoke the interface method
                behaviorListener.onRequest();
        }



On Tue, Nov 23, 2010 at 09:42, Johan Compagner <[email protected]> wrote:
> hi,
>
> i suddenly bump big time into this issue that is fixed.
> ( https://issues.apache.org/jira/browse/WICKET-3098 )
>
> I get that disabled behaviors can't be used to do respond, because
> that behavior shouldnt be rendered in the first place.
>
> But the fix also goes one step deeper... It also blocks if the
> component is disabled.. That is a big problem
>
> Because a disabled component is rendered, and all the behaviors are
> accepted and rendered also so now suddenly a behavior is rendered
> (because the behavior is not disabled)
> but a callback will fail...
>
> thats something i dont like...because now i get loads of these in the log:
>
> 2010-11-23 09:10:57,934 WARN [http-8080-1]
> org.apache.wicket.request.target.component.listener.BehaviorRequestTarget
> - component not enabled or visible; ignoring call. Component:
> [MarkupContainer [Component id = View]]
>
>
> and the worse thing is if the behavior blocks like that it fall backs
> to a IRedirectListener so it rerenders the whole page and that again
> renders the disabled component with its behavior and it starts all
> over again and again and again.
>
> the example i have here is that we have a ListView/Repeater with some
> paging component and that listview has a behavior attached that does a
> call back when it got first rendered to give us back the sizes it has
> in the browser
> and if we see that it has way more space then it currently shows (if
> it now shows 10 rows and it has space for 20) we rerender the ListView
> again but then with a bigger visible row count.
> that is a behavior of the ListView, but the listview can be in a
> disabled state (because a user first have to press a button of "edit"
> or something like that) but that resizing i still want to happen if if
> the ListView is disabled...
>
> So i like to some how tell that that this behavior should be called.
> Now we do this:
>
>
> test component enablement
> test behavior id
> test behaviors
> test behaviors enabledment.
> call behavior
>
> i like to turn that around
>
> test behavior id
> test behaviors
> test behaviors enabledment.
> test component enablement IF behavior doesnt implement 
> IWorkForDisabledComponent
> call behavior
>
> So that a developer can be explicit in that check..
>
> We could also introduce a public method on Component:
> isEnabledFor(IBehavior) which returns defaults its own enable state.
>
> johan
>

Reply via email to