Author: ivaynberg
Date: Wed Nov 24 01:54:05 2010
New Revision: 1038436

URL: http://svn.apache.org/viewvc?rev=1038436&view=rev
Log:

Issue: WICKET-3098

Added:
    
wicket/trunk/wicket/src/main/java/org/apache/wicket/request/handler/ListenerInvocationNotAllowedException.java
   (with props)
Modified:
    
wicket/trunk/wicket/src/main/java/org/apache/wicket/DefaultExceptionMapper.java
    
wicket/trunk/wicket/src/main/java/org/apache/wicket/RequestListenerInterface.java
    
wicket/trunk/wicket/src/main/java/org/apache/wicket/behavior/AbstractBehavior.java
    wicket/trunk/wicket/src/main/java/org/apache/wicket/behavior/IBehavior.java
    
wicket/trunk/wicket/src/main/java/org/apache/wicket/request/handler/ListenerInterfaceRequestHandler.java

Modified: 
wicket/trunk/wicket/src/main/java/org/apache/wicket/DefaultExceptionMapper.java
URL: 
http://svn.apache.org/viewvc/wicket/trunk/wicket/src/main/java/org/apache/wicket/DefaultExceptionMapper.java?rev=1038436&r1=1038435&r2=1038436&view=diff
==============================================================================
--- 
wicket/trunk/wicket/src/main/java/org/apache/wicket/DefaultExceptionMapper.java 
(original)
+++ 
wicket/trunk/wicket/src/main/java/org/apache/wicket/DefaultExceptionMapper.java 
Wed Nov 24 01:54:05 2010
@@ -25,6 +25,7 @@ import org.apache.wicket.request.Request
 import org.apache.wicket.request.cycle.RequestCycle;
 import org.apache.wicket.request.handler.EmptyRequestHandler;
 import org.apache.wicket.request.handler.IPageRequestHandler;
+import org.apache.wicket.request.handler.ListenerInvocationNotAllowedException;
 import org.apache.wicket.request.handler.PageProvider;
 import org.apache.wicket.request.handler.RenderPageRequestHandler;
 import org.apache.wicket.request.http.WebRequest;
@@ -85,7 +86,8 @@ public class DefaultExceptionMapper impl
                                .getApplicationSettings()
                                .getPageExpiredErrorPage()));
                }
-               else if (e instanceof AuthorizationException)
+               else if (e instanceof AuthorizationException ||
+                       e instanceof ListenerInvocationNotAllowedException)
                {
                        return createPageRequestHandler(new 
PageProvider(Application.get()
                                .getApplicationSettings()

Modified: 
wicket/trunk/wicket/src/main/java/org/apache/wicket/RequestListenerInterface.java
URL: 
http://svn.apache.org/viewvc/wicket/trunk/wicket/src/main/java/org/apache/wicket/RequestListenerInterface.java?rev=1038436&r1=1038435&r2=1038436&view=diff
==============================================================================
--- 
wicket/trunk/wicket/src/main/java/org/apache/wicket/RequestListenerInterface.java
 (original)
+++ 
wicket/trunk/wicket/src/main/java/org/apache/wicket/RequestListenerInterface.java
 Wed Nov 24 01:54:05 2010
@@ -27,6 +27,7 @@ import org.apache.wicket.authorization.A
 import org.apache.wicket.behavior.IBehavior;
 import org.apache.wicket.request.RequestHandlerStack.ReplaceHandlerException;
 import org.apache.wicket.request.component.IRequestableComponent;
+import org.apache.wicket.request.handler.ListenerInvocationNotAllowedException;
 import org.apache.wicket.util.lang.Classes;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
@@ -191,20 +192,26 @@ public class RequestListenerInterface
         * 
         * @param page
         *            The Page that contains the component
-        * @param component
+        * @param rcomponent
         *            The component
+        * 
+        * @throws ListenerInvocationNotAllowedException
+        *             when listener invocation attempted on a component that 
does not allow it
         */
-       public final void invoke(final IRequestableComponent component)
+       public final void invoke(final IRequestableComponent rcomponent)
        {
+               // we are in Wicket core land
+               final Component component = (Component)rcomponent;
+
                if (!component.canCallListenerInterface())
                {
                        // just return so that we have a silent fail and just 
re-render the
                        // page
                        log.info("component not enabled or visible; ignoring 
call. Component: " + component);
-                       return;
+                       throw new ListenerInvocationNotAllowedException(this, 
component, null,
+                               "Component rejected interface invocation");
                }
 
-
                try
                {
                        // Invoke the interface method on the component
@@ -237,25 +244,23 @@ public class RequestListenerInterface
        /**
         * Invokes a given interface on a component's behavior.
         * 
-        * @param component
+        * @param rcomponent
         *            The component
         * @param behavior
+        * @throws ListenerInvocationNotAllowedException
+        *             when listener invocation attempted on a component that 
does not allow it
         */
-       public final void invoke(final IRequestableComponent component, final 
IBehavior behavior)
+       public final void invoke(final IRequestableComponent rcomponent, final 
IBehavior behavior)
        {
-               if (!component.canCallListenerInterface())
-               {
-                       // just return so that we have a silent fail and just 
re-render the page
-                       log.warn("component not enabled or visible; ignoring 
call. Component: " + component);
-                       return;
-               }
+               // we are in Wicket core land
+               final Component component = (Component)rcomponent;
 
-               // XXX a bit of an ugly cast here from IRequestableComponent to 
Component
-               if (!behavior.isEnabled((Component)component))
+               if (!behavior.canCallListenerInterface(component))
                {
                        log.warn("behavior not enabled; ignore call. Behavior 
{} at component {}", behavior,
                                component);
-                       return;
+                       throw new ListenerInvocationNotAllowedException(this, 
component, behavior,
+                               "Behavior rejected interface invocation");
                }
 
                try

Modified: 
wicket/trunk/wicket/src/main/java/org/apache/wicket/behavior/AbstractBehavior.java
URL: 
http://svn.apache.org/viewvc/wicket/trunk/wicket/src/main/java/org/apache/wicket/behavior/AbstractBehavior.java?rev=1038436&r1=1038435&r2=1038436&view=diff
==============================================================================
--- 
wicket/trunk/wicket/src/main/java/org/apache/wicket/behavior/AbstractBehavior.java
 (original)
+++ 
wicket/trunk/wicket/src/main/java/org/apache/wicket/behavior/AbstractBehavior.java
 Wed Nov 24 01:54:05 2010
@@ -167,4 +167,16 @@ public abstract class AbstractBehavior i
        public void renderHead(IHeaderResponse response)
        {
        }
+
+       /**
+        * Checks if a listener can be invoked on this behavior. By checks that 
both
+        * {...@link Component#canCallListenerInterface()} and {...@link 
#isEnabled(Component)} return true.
+        * 
+        * @param component
+        * @return true if a listener interface can be invoked on this behavior
+        */
+       public boolean canCallListenerInterface(Component component)
+       {
+               return component.canCallListenerInterface() && 
isEnabled(component);
+       }
 }

Modified: 
wicket/trunk/wicket/src/main/java/org/apache/wicket/behavior/IBehavior.java
URL: 
http://svn.apache.org/viewvc/wicket/trunk/wicket/src/main/java/org/apache/wicket/behavior/IBehavior.java?rev=1038436&r1=1038435&r2=1038436&view=diff
==============================================================================
--- wicket/trunk/wicket/src/main/java/org/apache/wicket/behavior/IBehavior.java 
(original)
+++ wicket/trunk/wicket/src/main/java/org/apache/wicket/behavior/IBehavior.java 
Wed Nov 24 01:54:05 2010
@@ -150,4 +150,12 @@ public interface IBehavior extends IClus
         * @return true if this behavior is temporary
         */
        boolean isTemporary();
+
+       /**
+        * Checks if a listener can be invoked on this behavior
+        * 
+        * @param component
+        * @return true if a listener interface can be invoked on this behavior
+        */
+       boolean canCallListenerInterface(Component component);
 }
\ No newline at end of file

Modified: 
wicket/trunk/wicket/src/main/java/org/apache/wicket/request/handler/ListenerInterfaceRequestHandler.java
URL: 
http://svn.apache.org/viewvc/wicket/trunk/wicket/src/main/java/org/apache/wicket/request/handler/ListenerInterfaceRequestHandler.java?rev=1038436&r1=1038435&r2=1038436&view=diff
==============================================================================
--- 
wicket/trunk/wicket/src/main/java/org/apache/wicket/request/handler/ListenerInterfaceRequestHandler.java
 (original)
+++ 
wicket/trunk/wicket/src/main/java/org/apache/wicket/request/handler/ListenerInterfaceRequestHandler.java
 Wed Nov 24 01:54:05 2010
@@ -58,7 +58,7 @@ public class ListenerInterfaceRequestHan
 
                this.pageComponentProvider = pageComponentProvider;
                this.listenerInterface = listenerInterface;
-               this.behaviorId = behaviorIndex;
+               behaviorId = behaviorIndex;
        }
 
        /**
@@ -200,7 +200,7 @@ public class ListenerInterfaceRequestHan
                        }
                        catch (IndexOutOfBoundsException e)
                        {
-                               throw new WicketRuntimeException("Couldn't find 
component behavior.");
+                               throw new WicketRuntimeException("Couldn't find 
component behavior.", e);
                        }
 
                }

Added: 
wicket/trunk/wicket/src/main/java/org/apache/wicket/request/handler/ListenerInvocationNotAllowedException.java
URL: 
http://svn.apache.org/viewvc/wicket/trunk/wicket/src/main/java/org/apache/wicket/request/handler/ListenerInvocationNotAllowedException.java?rev=1038436&view=auto
==============================================================================
--- 
wicket/trunk/wicket/src/main/java/org/apache/wicket/request/handler/ListenerInvocationNotAllowedException.java
 (added)
+++ 
wicket/trunk/wicket/src/main/java/org/apache/wicket/request/handler/ListenerInvocationNotAllowedException.java
 Wed Nov 24 01:54:05 2010
@@ -0,0 +1,84 @@
+/*
+ * 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.request.handler;
+
+import org.apache.wicket.Component;
+import org.apache.wicket.RequestListenerInterface;
+import org.apache.wicket.behavior.IBehavior;
+
+/**
+ * Thrown when a listener invocation is attempted on a component or behavior 
that does not allow it.
+ * For example, somehow the user attempted to invoke link's onclick method on 
a disabled link.
+ * 
+ * @author igor
+ */
+public class ListenerInvocationNotAllowedException extends RuntimeException
+{
+       private static final long serialVersionUID = 1L;
+
+       private final Component component;
+       private final IBehavior behavior;
+       private final RequestListenerInterface iface;
+
+       /**
+        * Constructor
+        * 
+        * @param iface
+        * @param component
+        * @param behavior
+        * @param message
+        */
+       public ListenerInvocationNotAllowedException(RequestListenerInterface 
iface,
+               Component component, IBehavior behavior, String message)
+       {
+               super(message + detail(iface, component, behavior));
+               this.iface = iface;
+               this.component = component;
+               this.behavior = behavior;
+
+       }
+
+       private static String detail(RequestListenerInterface iface, Component 
component,
+               IBehavior behavior)
+       {
+               StringBuilder detail = new StringBuilder("Component: 
").append(component.toString(false));
+               if (behavior != null)
+               {
+                       detail.append(" Behavior: 
").append(behavior.toString());
+               }
+               detail.append(" Listener: ").append(iface.toString());
+               return detail.toString();
+       }
+
+       /**
+        * @return component that was the target of invocation or hosted the 
behavior that was
+        */
+       public Component getComponent()
+       {
+               return component;
+       }
+
+       /**
+        * @return behavior that was the target of invocation or {...@code null}
+        */
+       public IBehavior getBehavior()
+       {
+               return behavior;
+       }
+
+
+}

Propchange: 
wicket/trunk/wicket/src/main/java/org/apache/wicket/request/handler/ListenerInvocationNotAllowedException.java
------------------------------------------------------------------------------
    svn:mime-type = text/plain


Reply via email to