was there any particular reason you forwarded this.... -igor
On Fri, Oct 21, 2011 at 12:55 AM, Martin Grigorov <mgrigo...@apache.org> wrote: > 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 >