/* | |
* 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; | |
import java.lang.annotation.ElementType; | |
import java.lang.annotation.Retention; | |
import java.lang.annotation.RetentionPolicy; | |
import java.lang.annotation.Target; | |
import java.lang.reflect.Method; | |
import org.apache.wicket.behavior.Behavior; | |
import org.apache.wicket.event.Broadcast; | |
import org.apache.wicket.event.IEvent; | |
import org.apache.wicket.markup.html.WebComponent; | |
import org.apache.wicket.util.tester.WicketTestCase; | |
import org.junit.Test; | |
/** | |
* @author Pedro Santos | |
*/ | |
public class EventDispatcherTest extends WicketTestCase | |
{ | |
/** | |
* Testing DispatchToAnnotatedMethod event dispatchers in frameworksettings. This dispatcher | |
* invoke the methods annotated with @EvenCallback | |
* */ | |
@Test | |
public void dispatchToAnnotatedMethod() | |
{ | |
tester.getApplication().getFrameworkSettings().add(new DispatchToAnnotatedMethod()); | |
MockPageWithOneComponent page = new MockPageWithOneComponent(); | |
TestComponent testComponent = new TestComponent(MockPageWithOneComponent.COMPONENT_ID); | |
page.add(testComponent); | |
page.send(page, Broadcast.DEPTH, null); | |
assertTrue(testComponent.callbackInvoked); | |
assertEquals(testComponent.getBehaviors(TestBehavior.class).get(0).invocationTimes, 2); | |
} | |
@Retention(RetentionPolicy.RUNTIME) | |
@Target(ElementType.METHOD) | |
@interface EventCallback { | |
} | |
/** */ | |
public static class DispatchToAnnotatedMethod implements IEventDispatcher | |
{ | |
@Override | |
public void dispatchEvent(Object sink, IEvent<?> event, Component component) | |
{ | |
Method[] sinkMethods = sink.getClass().getMethods(); | |
for (Method sinkMethod : sinkMethods) | |
{ | |
if (sinkMethod.isAnnotationPresent(EventCallback.class)) | |
{ | |
try | |
{ | |
sinkMethod.invoke(sink); | |
} | |
catch (Exception e) | |
{ | |
throw new RuntimeException(e); | |
} | |
} | |
} | |
} | |
} | |
/** */ | |
public static class TestComponent extends WebComponent | |
{ | |
private static final long serialVersionUID = 1L; | |
boolean callbackInvoked; | |
/** | |
* @param id | |
*/ | |
public TestComponent(String id) | |
{ | |
super(id); | |
add(new TestBehavior()); | |
} | |
/** */ | |
@EventCallback | |
public void testCallback() | |
{ | |
callbackInvoked = true; | |
} | |
} | |
private static class TestBehavior extends Behavior | |
{ | |
private static final long serialVersionUID = 1; | |
int invocationTimes = 0; | |
@Override | |
public void onEvent(Component component, IEvent<?> event) | |
{ | |
invocationTimes++; | |
} | |
@EventCallback | |
public void testCallback() | |
{ | |
invocationTimes++; | |
} | |
} | |
} |