/******************************************************************************* * Copyright (c) 2007, 2015 compeople AG and others. * All rights reserved. This program and the accompanying materials * are made available under the terms of the Eclipse Public License v1.0 * which accompanies this distribution, and is available at * http://www.eclipse.org/legal/epl-v10.html * * Contributors: * compeople AG - initial API and implementation *******************************************************************************/ package org.eclipse.riena.ui.ridgets.annotation.processor; import java.lang.annotation.Annotation; import java.lang.reflect.Method; import java.util.ArrayList; import java.util.Collection; import java.util.HashMap; import java.util.List; import java.util.Map; import org.eclipse.core.databinding.observable.Realm; import org.eclipse.jface.databinding.swt.SWTObservables; import org.eclipse.swt.widgets.Display; import org.eclipse.riena.core.annotationprocessor.AnnotatedOverriddenMethodsGuard; import org.eclipse.riena.core.annotationprocessor.AnnotationProcessor; import org.eclipse.riena.core.annotationprocessor.IAnnotatedMethodHandler; import org.eclipse.riena.core.test.RienaTestCase; import org.eclipse.riena.core.test.collect.NonUITestCase; import org.eclipse.riena.core.util.ListenerList; import org.eclipse.riena.core.util.ReflectionUtils; import org.eclipse.riena.internal.core.annotationprocessor.IAnnotatedMethodHandlerExtension; import org.eclipse.riena.internal.ui.ridgets.swt.TextRidget; import org.eclipse.riena.ui.ridgets.IRidget; import org.eclipse.riena.ui.ridgets.IRidgetContainer; import org.eclipse.riena.ui.ridgets.IStatuslineRidget; import org.eclipse.riena.ui.ridgets.annotation.OnClick; import org.eclipse.riena.ui.ridgets.annotation.handler.AbstractRidgetContainerAnnotationHandler; import org.eclipse.riena.ui.ridgets.listener.FocusEvent; import org.eclipse.riena.ui.ridgets.listener.IFocusListener; /** * Test the {@code AnnotationProcessor}. */ @SuppressWarnings("restriction") @NonUITestCase public class RidgetContainerAnnotationProcessorTest extends RienaTestCase { private AnnotationProcessor processor; @Override protected void setUp() throws Exception { super.setUp(); processor = AnnotationProcessor.getInstance(); final Display display = Display.getDefault(); final Realm realm = SWTObservables.getRealm(display); assertNotNull(realm); ReflectionUtils.invokeHidden(realm, "setDefault", realm); //$NON-NLS-1$ } @Override protected void tearDown() throws Exception { super.tearDown(); } @SuppressWarnings("deprecation") public void testAddListenerToRidgetWithAbstractRidgetContainerAnnotationHandler() { final Handler onClick = new Handler(OnClick.class); processor.update(new IAnnotatedMethodHandlerExtension[] { create(OnClick.class, onClick) }); final B container = new B(); final IRidget ridget1 = new TextRidget(); final IRidget ridget2 = new TextRidget(); final IRidget ridget3 = new TextRidget(); container.addRidget("RidgetA1", ridget1); //$NON-NLS-1$ container.addRidget("RidgetA2", ridget2); //$NON-NLS-1$ container.addRidget("RidgetB1", ridget3); //$NON-NLS-1$ AnnotationProcessor.getInstance().processMethods(container); assertEquals(2, onClick.getHandled().size()); assertTrue(onClick.getHandled().get(0) instanceof OnClick); assertTrue(onClick.getHandled().get(1) instanceof OnClick); assertEquals("RidgetA1", ((OnClick) onClick.getHandled().get(0)).ridgetId()); //$NON-NLS-1$ assertEquals("RidgetA2", ((OnClick) onClick.getHandled().get(1)).ridgetId()); //$NON-NLS-1$ assertEquals(ridget1, container.getRidget("RidgetA1")); //$NON-NLS-1$ assertEquals(ridget2, container.getRidget("RidgetA2")); //$NON-NLS-1$ assertEquals(ridget3, container.getRidget("RidgetB1")); //$NON-NLS-1$ ListenerList<IFocusListener> focusListeners = ReflectionUtils.getHidden(ridget1, "focusListeners"); //$NON-NLS-1$ assertTrue(focusListeners.size() == 1); focusListeners = ReflectionUtils.getHidden(ridget2, "focusListeners"); //$NON-NLS-1$ assertTrue(focusListeners.size() == 1); focusListeners = ReflectionUtils.getHidden(ridget3, "focusListeners"); //$NON-NLS-1$ assertTrue(focusListeners.size() == 0); } @SuppressWarnings("deprecation") public void testAddListenerToRidgetFromAnotherClass() { final Handler onClick = new Handler(OnClick.class); processor.update(new IAnnotatedMethodHandlerExtension[] { create(OnClick.class, onClick) }); final B container = new B(); final IRidget ridget1 = new TextRidget(); final IRidget ridget2 = new TextRidget(); container.addRidget("RidgetA1", ridget1); //$NON-NLS-1$ container.addRidget("RidgetA2", ridget2); //$NON-NLS-1$ AnnotationProcessor.getInstance().processMethods(container, new C()); assertEquals(1, onClick.getHandled().size()); assertTrue(onClick.getHandled().get(0) instanceof OnClick); assertEquals("RidgetA2", ((OnClick) onClick.getHandled().get(0)).ridgetId()); //$NON-NLS-1$ assertEquals(ridget1, container.getRidget("RidgetA1")); //$NON-NLS-1$ assertEquals(ridget2, container.getRidget("RidgetA2")); //$NON-NLS-1$ ListenerList<IFocusListener> focusListeners = ReflectionUtils.getHidden(ridget1, "focusListeners"); //$NON-NLS-1$ assertTrue(focusListeners.size() == 0); focusListeners = ReflectionUtils.getHidden(ridget2, "focusListeners"); //$NON-NLS-1$ assertTrue(focusListeners.size() == 1); } // Helper functions & class /////////////////////////// private IAnnotatedMethodHandlerExtension create(final Class<? extends Annotation> annotationClass, final IAnnotatedMethodHandler handler) { return new IAnnotatedMethodHandlerExtension() { public Class<? extends Annotation> getAnnotation() { return annotationClass; } public IAnnotatedMethodHandler createHandler() { return handler; } }; } private static class Handler extends AbstractRidgetContainerAnnotationHandler { private final Class<? extends Annotation> annotationClass; private final List<Annotation> handled = new ArrayList<Annotation>(); public Handler(final Class<? extends Annotation> annotationClass) { this.annotationClass = annotationClass; } @Override public void handleAnnotation(final Annotation annotation, final IRidgetContainer ridgetContainer, final Object target, final Method targetMethod, final AnnotatedOverriddenMethodsGuard guard) { assertTrue(annotationClass.isInstance(annotation)); handled.add(annotation); final IRidget ridget = getRidget(annotation, targetMethod, ridgetContainer, ((OnClick) annotation).ridgetId()); ridget.addFocusListener(new IFocusListener() { @Override public void focusLost(final FocusEvent event) { } @Override public void focusGained(final FocusEvent event) { } }); } public List<Annotation> getHandled() { return handled; } } private static class A extends DummyContainer { @OnClick(ridgetId = "RidgetA1") public void onClick() { } } private static class B extends A { @Override @OnClick(ridgetId = "RidgetA2") public void onClick() { } } private static class C { @OnClick(ridgetId = "RidgetA2") public void onClick() { } } private static class DummyContainer implements IRidgetContainer { private final Map<String, IRidget> ridgets = new HashMap<String, IRidget>(); public void addRidget(final String id, final IRidget ridget) { ridgets.put(id, ridget); } public boolean removeRidget(final String id) { return false; } public void configureRidgets() { // nothing } @SuppressWarnings("unchecked") public <R extends IRidget> R getRidget(final String id) { return (R) ridgets.get(id); } public <R extends IRidget> R getRidget(final Class<R> ridgetClazz, final String id) { return getRidget(id); } public Collection<? extends IRidget> getRidgets() { return ridgets.values(); } public boolean isConfigured() { return false; } public void setConfigured(final boolean configured) { } public void setStatuslineToShowMarkerMessages(final IStatuslineRidget statuslineToShowMarkerMessages) { } } }