On Fri, Oct 21, 2011 at 8:33 AM,  <ivaynb...@apache.org> wrote:
> Author: ivaynberg
> Date: Fri Oct 21 05:33:34 2011
> New Revision: 1187184
>
> URL: http://svn.apache.org/viewvc?rev=1187184&view=rev
> Log:
>
> Issue: WICKET-4149
>
> Modified:
>    wicket/trunk/wicket-core/src/main/java/org/apache/wicket/Component.java
>    
> wicket/trunk/wicket-core/src/main/java/org/apache/wicket/RequestListenerInterface.java
>    
> wicket/trunk/wicket-core/src/main/java/org/apache/wicket/behavior/Behavior.java
>    
> wicket/trunk/wicket-core/src/main/java/org/apache/wicket/markup/html/image/Image.java
>
> Modified: 
> wicket/trunk/wicket-core/src/main/java/org/apache/wicket/Component.java
> URL: 
> http://svn.apache.org/viewvc/wicket/trunk/wicket-core/src/main/java/org/apache/wicket/Component.java?rev=1187184&r1=1187183&r2=1187184&view=diff
> ==============================================================================
> --- wicket/trunk/wicket-core/src/main/java/org/apache/wicket/Component.java 
> (original)
> +++ wicket/trunk/wicket-core/src/main/java/org/apache/wicket/Component.java 
> Fri Oct 21 05:33:34 2011
> @@ -17,6 +17,7 @@
>  package org.apache.wicket;
>
>  import java.io.Serializable;
> +import java.lang.reflect.Method;
>  import java.util.ArrayList;
>  import java.util.Iterator;
>  import java.util.List;
> @@ -4336,9 +4337,30 @@ public abstract class Component
>        }
>
>
> -       /** TODO WICKET-NG javadoc */
> +       /**
> +        * TODO WICKET-NG javadoc
> +        *
> +        * @deprecated use {@link #canCallListenerInterface(Method)} instead
> +        */
> +       @Deprecated
>        public final boolean canCallListenerInterface()
>        {
> +               return true;
> +       }
> +
> +       /**
> +        * Checks whether or not a listener method can be invoked on this 
> component. Usually components deny these invocations if they are either 
> invisible or disabled in hierarchy. Components can examine which listener 
> interface is being invoked by examining the declaring class of the passed in 
> {@literal method} parameter.
> +        * <p>
> +        * WARNING: be careful when overriding this method because it may 
> open security holes - such as allowing a user to click on a link that should 
> be disabled.
> +        * </p>
> +        * <p>
> +        * Example usecase for overriding: Suppose you are building an 
> component that displays images. The component generates a callback to itself 
> using {@link IRequestListener} interface and uses this callback to stream 
> image data. If such a component is placed inside a disable webmarkupcontainer 
> we still want to allow the invocation of the request listener callback method 
> so that image data can be streamed. Such a component would override this 
> method and return {@literal true} if the listener method belongs to {@link 
> IRequestListener}.
> +        * </p>
> +        * @param method listener method about to be invoked on this component
> +        *
> +        * @return {@literal true} iff the listener method can be invoked on 
> this component
> +        */
> +       public boolean canCallListenerInterface(Method method) {
>                return isEnabledInHierarchy() && isVisibleInHierarchy();
>        }
>
>
> Modified: 
> wicket/trunk/wicket-core/src/main/java/org/apache/wicket/RequestListenerInterface.java
> URL: 
> http://svn.apache.org/viewvc/wicket/trunk/wicket-core/src/main/java/org/apache/wicket/RequestListenerInterface.java?rev=1187184&r1=1187183&r2=1187184&view=diff
> ==============================================================================
> --- 
> wicket/trunk/wicket-core/src/main/java/org/apache/wicket/RequestListenerInterface.java
>  (original)
> +++ 
> wicket/trunk/wicket-core/src/main/java/org/apache/wicket/RequestListenerInterface.java
>  Fri Oct 21 05:33:34 2011
> @@ -204,7 +204,7 @@ public class RequestListenerInterface
>                // we are in Wicket core land
>                final Component component = (Component)rcomponent;
>
> -               if (!component.canCallListenerInterface())
> +               if (!component.canCallListenerInterface(method))
>                {
>                        // just return so that we have a silent fail and just 
> re-render the
>                        // page
> @@ -230,7 +230,7 @@ public class RequestListenerInterface
>                // we are in Wicket core land
>                final Component component = (Component)rcomponent;
>
> -               if (!behavior.canCallListenerInterface(component))
> +               if (!behavior.canCallListenerInterface(component, method))
>                {
>                        log.warn("behavior not enabled; ignore call. Behavior 
> {} at component {}", behavior,
>                                component);
>
> Modified: 
> wicket/trunk/wicket-core/src/main/java/org/apache/wicket/behavior/Behavior.java
> URL: 
> http://svn.apache.org/viewvc/wicket/trunk/wicket-core/src/main/java/org/apache/wicket/behavior/Behavior.java?rev=1187184&r1=1187183&r2=1187184&view=diff
> ==============================================================================
> --- 
> wicket/trunk/wicket-core/src/main/java/org/apache/wicket/behavior/Behavior.java
>  (original)
> +++ 
> wicket/trunk/wicket-core/src/main/java/org/apache/wicket/behavior/Behavior.java
>  Fri Oct 21 05:33:34 2011
> @@ -16,6 +16,8 @@
>  */
>  package org.apache.wicket.behavior;
>
> +import java.lang.reflect.Method;
> +
>  import org.apache.wicket.Application;
>  import org.apache.wicket.Component;
>  import org.apache.wicket.IClusterable;
> @@ -199,13 +201,37 @@ public abstract class Behavior
>         *
>         * @param component
>         * @return true if a listener interface can be invoked on this behavior
> +        *
> +        * @deprecated use {@link #canCallListenerInterface(Component, 
> Method)}
>         */
> +       @Deprecated
>        public boolean canCallListenerInterface(Component component)
>        {
>                return isEnabled(component) && 
> component.canCallListenerInterface();
>        }
>
>        /**
> +        * Checks whether or not a listener interface can be invoked on this 
> behavior. For further
> +        * information please read the javadoc on {@link 
> Component#canCallListenerInterface(Method)},
> +        * this method has the same semantics.
> +        *
> +        * WARNING: Read the javadoc of {@link 
> Component#canCallListenerInterface(Method)} for important
> +        * security-related information.
> +        *
> +        * @param component
> +        *            component this behavior is attached to
> +        * @param method
> +        *            listener method being invoked
> +        * @return {@literal true} iff the listener method can be invoked
> +        */
> +       public boolean canCallListenerInterface(Component component, Method 
> method)
> +       {
> +               return canCallListenerInterface(component) && 
> isEnabled(component) &&
> +                       component.canCallListenerInterface(method);
I guess the reason to call the deprecated
"canCallListenerInterface(component)" is backward compatibility, but
this way "isEnabled(component)" is called twice. Maybe we should
replace "canCallListenerInterface(component)" with
"component.canCallListenerInterface()" instead ?
> +       }
> +
> +
> +       /**
>         * Render to the web response whatever the component wants to 
> contribute to the head section.
>         *
>         * @param component
>
> Modified: 
> wicket/trunk/wicket-core/src/main/java/org/apache/wicket/markup/html/image/Image.java
> URL: 
> http://svn.apache.org/viewvc/wicket/trunk/wicket-core/src/main/java/org/apache/wicket/markup/html/image/Image.java?rev=1187184&r1=1187183&r2=1187184&view=diff
> ==============================================================================
> --- 
> wicket/trunk/wicket-core/src/main/java/org/apache/wicket/markup/html/image/Image.java
>  (original)
> +++ 
> wicket/trunk/wicket-core/src/main/java/org/apache/wicket/markup/html/image/Image.java
>  Fri Oct 21 05:33:34 2011
> @@ -16,6 +16,8 @@
>  */
>  package org.apache.wicket.markup.html.image;
>
> +import java.lang.reflect.Method;
> +
>  import org.apache.wicket.Component;
>  import org.apache.wicket.IResourceListener;
>  import org.apache.wicket.ajax.AjaxRequestTarget;
> @@ -290,4 +292,20 @@ public class Image extends WebComponent
>        public void onComponentTagBody(final MarkupStream markupStream, final 
> ComponentTag openTag)
>        {
>        }
> +
> +       @Override
> +       public boolean canCallListenerInterface(Method method)
> +       {
> +               boolean isResource = 
> IResourceListener.class.isAssignableFrom(method.getDeclaringClass());
> +               if (isResource && isVisibleInHierarchy())
> +               {
> +                       // when the image data is requested we do not care if 
> this component is enabled in
> +                       // hierarchy or not, only that it is visible
> +                       return true;
> +               }
> +               else
> +               {
> +                       return super.canCallListenerInterface(method);
> +               }
> +       }
>  }
>
>
>



-- 
Martin Grigorov
jWeekend
Training, Consulting, Development
http://jWeekend.com

Reply via email to