ah, i see. next time leave some space around the inline comment so it doesnt blend in :)
i thought about isEnabled() being called twice, i dont think it will be a huge problem. if it is expensive the user can always cache it and clear the cache in detach(). -igor On Fri, Oct 21, 2011 at 8:14 AM, Igor Vaynberg <[email protected]> wrote: > was there any particular reason you forwarded this.... > > -igor > > On Fri, Oct 21, 2011 at 12:55 AM, Martin Grigorov <[email protected]> > wrote: >> On Fri, Oct 21, 2011 at 8:33 AM, <[email protected]> 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 >> >
