/******************************************************************************* * Copyright (c) 2007, 2014 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.core.wire; import java.lang.reflect.Method; import org.eclipse.riena.core.injector.service.FilterInjector; import org.eclipse.riena.core.injector.service.RankingInjector; import org.eclipse.riena.core.injector.service.ServiceInjector; import org.eclipse.riena.core.test.RienaTestCase; import org.eclipse.riena.core.test.collect.NonUITestCase; import org.eclipse.riena.core.util.ReflectionUtils; import org.eclipse.riena.core.util.WeakRef; import org.eclipse.riena.internal.core.wire.ServiceInjectorBuilder; /** * Test the {@code ServiceInjectorBuilder}. */ @NonUITestCase public class ServiceInjectorBuilderTest extends RienaTestCase { public void testBuildForBind1() throws NoSuchMethodException { final Method bindMethod = ServiceInjectorBuilderTest.class.getMethod("bind1", new Class[] { Schtonk.class }); final ServiceInjectorBuilder builder = new ServiceInjectorBuilder(this, bindMethod); final ServiceInjector injector = builder.build().andStart(getContext()); assertNotNull(injector); assertTrue(injector instanceof FilterInjector); assertFalse(useRanking(injector)); assertNull(getFilter(injector)); assertEquals(Schtonk.class, getServiceClass(injector)); assertSame(this, getBean(injector)); assertEquals(bindMethod, getBindMethod(injector)); assertEquals("unbind1", getUnbindMethod(injector).getName()); assertFalse(getOnceOnly(injector)); } @InjectService(service = Schtonk.class) public void bind1(final Schtonk schtonk) { } public void unbind1(final Schtonk schtonk) { } public void testBuildForBind2() throws NoSuchMethodException { final Method bindMethod = ServiceInjectorBuilderTest.class.getMethod("bind2", new Class[] { Schtonk.class }); final ServiceInjectorBuilder builder = new ServiceInjectorBuilder(this, bindMethod); final ServiceInjector injector = builder.build().andStart(getContext()); assertNotNull(injector); assertTrue(injector instanceof RankingInjector); assertTrue(useRanking(injector)); assertNull(getFilter(injector)); assertEquals(Schtonk.class.getName(), getServiceClassName(injector)); assertSame(this, getBean(injector)); assertEquals("bind2", getBindMethod(injector).getName()); assertEquals("entbinde", getUnbindMethod(injector).getName()); assertFalse(getOnceOnly(injector)); } @InjectService(serviceName = "org.eclipse.riena.core.wire.Schtonk", useRanking = true, unbind = "entbinde") public void bind2(final Schtonk schtonk) { } public void entbinde(final Schtonk schtonk) { } public void testBuildForBind3() throws NoSuchMethodException { final Method bindMethod = ServiceInjectorBuilderTest.class.getMethod("bind3", new Class[] { Schtonk.class }); final ServiceInjectorBuilder builder = new ServiceInjectorBuilder(this, bindMethod); final ServiceInjector injector = builder.build().andStart(getContext()); assertNotNull(injector); assertTrue(injector instanceof FilterInjector); assertFalse(useRanking(injector)); assertEquals("(mellita = gut)", getFilter(injector)); assertEquals(Schtonk.class.getName(), getServiceClassName(injector)); assertSame(this, getBean(injector)); assertEquals("bind3", getBindMethod(injector).getName()); assertEquals("entbinde3", getUnbindMethod(injector).getName()); assertFalse(getOnceOnly(injector)); } @InjectService(serviceName = "org.eclipse.riena.core.wire.Schtonk", useFilter = "(mellita = gut)", unbind = "entbinde3") public void bind3(final Schtonk schtonk) { } public void entbinde3(final Schtonk schtonk) { } public void testBuildForBind4() throws NoSuchMethodException { final Method bindMethod = ServiceInjectorBuilderTest.class.getMethod("bind4", new Class[] { Schtonk.class }); final ServiceInjectorBuilder builder = new ServiceInjectorBuilder(this, bindMethod); final ServiceInjector injector = builder.build().andStart(getContext()); assertNotNull(injector); assertTrue(injector instanceof FilterInjector); assertFalse(useRanking(injector)); assertNull(getFilter(injector)); assertEquals(Schtonk.class, getServiceClass(injector)); assertSame(this, getBean(injector)); assertEquals("bind4", getBindMethod(injector).getName()); assertEquals("unbind4", getUnbindMethod(injector).getName()); assertFalse(getOnceOnly(injector)); } @InjectService public void bind4(final Schtonk schtonk) { } public void unbind4(final Schtonk schtonk) { } public void testBuildForBind5OnceOnlyViaStatic() throws NoSuchMethodException { final Method bindMethod = ServiceInjectorBuilderTest.class.getMethod("bind5", new Class[] { Schtonk.class }); final ServiceInjectorBuilder builder = new ServiceInjectorBuilder(this, bindMethod); final ServiceInjector injector = builder.build().andStart(getContext()); assertNotNull(injector); assertTrue(injector instanceof FilterInjector); assertFalse(useRanking(injector)); assertNull(getFilter(injector)); assertEquals(Schtonk.class, getServiceClass(injector)); assertSame(this, getBean(injector)); assertEquals("bind5", getBindMethod(injector).getName()); assertEquals("unbind5", getUnbindMethod(injector).getName()); assertTrue(getOnceOnly(injector)); } @InjectService public static void bind5(final Schtonk schtonk) { } public static void unbind5(final Schtonk schtonk) { } public void testBuildForBind6OnceOnlyViaAnnotation() throws NoSuchMethodException { final Method bindMethod = ServiceInjectorBuilderTest.class.getMethod("bind6", new Class[] { Schtonk.class }); final ServiceInjectorBuilder builder = new ServiceInjectorBuilder(this, bindMethod); final ServiceInjector injector = builder.build().andStart(getContext()); assertNotNull(injector); assertTrue(injector instanceof FilterInjector); assertFalse(useRanking(injector)); assertNull(getFilter(injector)); assertEquals(Schtonk.class, getServiceClass(injector)); assertSame(this, getBean(injector)); assertEquals("bind6", getBindMethod(injector).getName()); assertEquals("unbind6", getUnbindMethod(injector).getName()); assertTrue(getOnceOnly(injector)); } @InjectService(onceOnly = true) public void bind6(final Schtonk schtonk) { } public void unbind6(final Schtonk schtonk) { } private boolean useRanking(final ServiceInjector injector) { final Object serviceDescriptor = ReflectionUtils.getHidden(injector, "serviceDesc"); return ReflectionUtils.getHidden(serviceDescriptor, "ranking"); } private String getFilter(final ServiceInjector injector) { final Object serviceDescriptor = ReflectionUtils.getHidden(injector, "serviceDesc"); return ReflectionUtils.getHidden(serviceDescriptor, "filter"); } private Object getServiceClassName(final ServiceInjector injector) { final Object serviceDescriptor = ReflectionUtils.getHidden(injector, "serviceDesc"); return ReflectionUtils.getHidden(serviceDescriptor, "className"); } private Object getServiceClass(final ServiceInjector injector) { final Object serviceDescriptor = ReflectionUtils.getHidden(injector, "serviceDesc"); return ReflectionUtils.getHidden(serviceDescriptor, "clazz"); } private Object getBean(final ServiceInjector injector) { final WeakRef<?> ref = ReflectionUtils.getHidden(injector, "targetRef"); return ref.get(); } private Method getBindMethod(final ServiceInjector injector) { return ReflectionUtils.getHidden(injector, "bindMethod"); } private Method getUnbindMethod(final ServiceInjector injector) { return ReflectionUtils.getHidden(injector, "unbindMethod"); } private boolean getOnceOnly(final ServiceInjector injector) { return ReflectionUtils.getHidden(injector, "onceOnly"); } }