/*******************************************************************************
* 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 java.util.List;
import org.eclipse.riena.core.injector.extension.ExtensionInjector;
import org.eclipse.riena.core.injector.extension.IData;
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.ExtensionInjectorBuilder;
/**
* Test the {@code ExtensionInjectorBuilder}.
*/
@NonUITestCase
public class ExtensionInjectorBuilderTest extends RienaTestCase {
public void testBuildForUpdate1() throws NoSuchMethodException {
final Method bindMethod = ExtensionInjectorBuilderTest.class.getDeclaredMethod("update1",
new Class[] { IData.class });
final ExtensionInjectorBuilder builder = new ExtensionInjectorBuilder(this, bindMethod);
final ExtensionInjector injector = builder.build();
assertNotNull(injector);
assertEquals("testA", rawId(injector));
assertEquals(IData.class, useType(injector));
assertEquals(0, getMin(injector));
assertEquals(1, getMax(injector));
assertTrue(getHomogenious(injector));
assertSame(this, getTarget(injector));
assertEquals("update1", getUpdateMethodName(injector));
assertFalse(getDoNotReplaceSymbols(injector));
assertFalse(getSpecific(injector));
assertFalse(getOnceOnly(injector));
}
@InjectExtension(id = "testA")
public void update1(final IData data) {
}
public void testBuildForUpdate1Array() throws NoSuchMethodException {
final Method bindMethod = ExtensionInjectorBuilderTest.class.getDeclaredMethod("update1Array",
new Class[] { IData[].class });
final ExtensionInjectorBuilder builder = new ExtensionInjectorBuilder(this, bindMethod);
final ExtensionInjector injector = builder.build();
assertNotNull(injector);
assertEquals("testA[]", rawId(injector));
assertEquals(IData.class, useType(injector));
assertEquals(0, getMin(injector));
assertEquals(Integer.MAX_VALUE, getMax(injector));
assertTrue(getHomogenious(injector));
assertSame(this, getTarget(injector));
assertEquals("update1Array", getUpdateMethodName(injector));
assertFalse(getDoNotReplaceSymbols(injector));
assertFalse(getSpecific(injector));
assertFalse(getOnceOnly(injector));
}
@InjectExtension(id = "testA[]")
public void update1Array(final IData[] data) {
}
public void testBuildForUpdate2() throws NoSuchMethodException {
final Method bindMethod = ExtensionInjectorBuilderTest.class.getDeclaredMethod("update2",
new Class[] { IData[].class });
final ExtensionInjectorBuilder builder = new ExtensionInjectorBuilder(this, bindMethod);
final ExtensionInjector injector = builder.build();
assertNotNull(injector);
assertEquals("testB", rawId(injector));
assertEquals(IData.class, useType(injector));
assertEquals(2, getMin(injector));
assertEquals(5, getMax(injector));
assertFalse(getHomogenious(injector));
assertSame(this, getTarget(injector));
assertEquals("update2", getUpdateMethodName(injector));
assertTrue(getDoNotReplaceSymbols(injector));
assertTrue(getSpecific(injector));
assertFalse(getOnceOnly(injector));
}
@InjectExtension(id = "testB", doNotReplaceSymbols = true, heterogeneous = true, specific = true, min = 2, max = 5)
public void update2(final IData[] data) {
}
public void testBuildForUpdate3() throws NoSuchMethodException {
final Method bindMethod = ExtensionInjectorBuilderTest.class.getDeclaredMethod("update3",
new Class[] { IData.class });
final ExtensionInjectorBuilder builder = new ExtensionInjectorBuilder(this, bindMethod);
final ExtensionInjector injector = builder.build();
assertNotNull(injector);
assertEquals("testC", rawId(injector));
assertEquals(IData.class, useType(injector));
assertEquals(0, getMin(injector));
assertEquals(1, getMax(injector));
assertFalse(getHomogenious(injector));
assertSame(this, getTarget(injector));
assertEquals("update3", getUpdateMethodName(injector));
assertFalse(getDoNotReplaceSymbols(injector));
assertTrue(getSpecific(injector));
assertFalse(getOnceOnly(injector));
}
@InjectExtension(id = "testC", heterogeneous = true, specific = true, min = 0, max = 1)
public void update3(final IData data) {
}
public void testBuildForUpdateWithAnExtensionInterfaceWithID() throws NoSuchMethodException {
final Method bindMethod = ExtensionInjectorBuilderTest.class.getDeclaredMethod("updateWithID",
new Class[] { IDataWithID.class });
final ExtensionInjectorBuilder builder = new ExtensionInjectorBuilder(this, bindMethod);
final ExtensionInjector injector = builder.build();
assertNotNull(injector);
final String expectedId = getContext().getBundle().getSymbolicName() + ".testWithID";
try {
injector.andStart(getContext());
} catch (final IllegalArgumentException e) {
assertTrue(e.getMessage().contains(expectedId));
}
assertEquals(expectedId, firstNormalizedId(injector));
assertEquals(IDataWithID.class, useType(injector));
assertEquals(0, getMin(injector));
assertEquals(1, getMax(injector));
assertFalse(getHomogenious(injector));
assertSame(this, getTarget(injector));
assertEquals("updateWithID", getUpdateMethodName(injector));
assertFalse(getDoNotReplaceSymbols(injector));
assertTrue(getSpecific(injector));
assertFalse(getOnceOnly(injector));
}
@InjectExtension(heterogeneous = true, specific = true, min = 0, max = 1)
public void updateWithID(final IDataWithID data) {
}
public void testBuildForUpdateWithAnExtensionInterfaceWithIDinAnnotation() throws NoSuchMethodException {
final Method bindMethod = ExtensionInjectorBuilderTest.class.getDeclaredMethod("updateWithIDinAnnotation",
new Class[] { IDataWithIDinAnnotation.class });
final ExtensionInjectorBuilder builder = new ExtensionInjectorBuilder(this, bindMethod);
final ExtensionInjector injector = builder.build();
assertNotNull(injector);
final String expectedId = getContext().getBundle().getSymbolicName() + ".testWithIDinAnnotation";
try {
injector.andStart(getContext());
} catch (final IllegalArgumentException e) {
assertTrue(e.getMessage().contains(expectedId));
}
assertEquals(expectedId, firstNormalizedId(injector));
assertEquals(IDataWithIDinAnnotation.class, useType(injector));
assertEquals(0, getMin(injector));
assertEquals(1, getMax(injector));
assertFalse(getHomogenious(injector));
assertSame(this, getTarget(injector));
assertEquals("updateWithIDinAnnotation", getUpdateMethodName(injector));
assertFalse(getDoNotReplaceSymbols(injector));
assertTrue(getSpecific(injector));
assertFalse(getOnceOnly(injector));
}
@InjectExtension(heterogeneous = true, specific = true, min = 0, max = 1)
public void updateWithIDinAnnotation(final IDataWithIDinAnnotation data) {
}
public void testBuildForUpdate4WithAnExtensionInterfaceWithIDinAnnotationAndWithOnceOnlyViaStatic()
throws NoSuchMethodException {
final Method bindMethod = ExtensionInjectorBuilderTest.class.getDeclaredMethod("update4WithIDinAnnotation",
new Class[] { IDataWithIDinAnnotation.class });
final ExtensionInjectorBuilder builder = new ExtensionInjectorBuilder(this, bindMethod);
final ExtensionInjector injector = builder.build();
assertNotNull(injector);
final String expectedId = getContext().getBundle().getSymbolicName() + ".testWithIDinAnnotation";
try {
injector.andStart(getContext());
} catch (final IllegalArgumentException e) {
assertTrue(e.getMessage().contains(expectedId));
}
assertEquals(expectedId, firstNormalizedId(injector));
assertEquals(IDataWithIDinAnnotation.class, useType(injector));
assertEquals(0, getMin(injector));
assertEquals(1, getMax(injector));
assertFalse(getHomogenious(injector));
assertSame(this, getTarget(injector));
assertEquals("update4WithIDinAnnotation", getUpdateMethodName(injector));
assertFalse(getDoNotReplaceSymbols(injector));
assertTrue(getSpecific(injector));
assertTrue(getOnceOnly(injector));
}
@InjectExtension(heterogeneous = true, specific = true, min = 0, max = 1)
public static void update4WithIDinAnnotation(final IDataWithIDinAnnotation data) {
}
public void testBuildForUpdate5WithAnExtensionInterfaceWithIDinAnnotationAndWithOnceOnlyViaAnnotation()
throws NoSuchMethodException {
final Method bindMethod = ExtensionInjectorBuilderTest.class.getDeclaredMethod("update5WithIDinAnnotation",
new Class[] { IDataWithIDinAnnotation.class });
final ExtensionInjectorBuilder builder = new ExtensionInjectorBuilder(this, bindMethod);
final ExtensionInjector injector = builder.build();
assertNotNull(injector);
final String expectedId = getContext().getBundle().getSymbolicName() + ".testWithIDinAnnotation";
try {
injector.andStart(getContext());
} catch (final IllegalArgumentException e) {
assertTrue(e.getMessage().contains(expectedId));
}
assertEquals(expectedId, firstNormalizedId(injector));
assertEquals(IDataWithIDinAnnotation.class, useType(injector));
assertEquals(0, getMin(injector));
assertEquals(1, getMax(injector));
assertFalse(getHomogenious(injector));
assertSame(this, getTarget(injector));
assertEquals("update5WithIDinAnnotation", getUpdateMethodName(injector));
assertFalse(getDoNotReplaceSymbols(injector));
assertTrue(getSpecific(injector));
assertTrue(getOnceOnly(injector));
}
@InjectExtension(heterogeneous = true, specific = true, min = 0, max = 1, onceOnly = true)
public void update5WithIDinAnnotation(final IDataWithIDinAnnotation data) {
}
private String rawId(final ExtensionInjector injector) {
final Object extensionDescriptor = ReflectionUtils.getHidden(injector, "extensionDesc");
final Object extensionPointId = ReflectionUtils.getHidden(extensionDescriptor, "extensionPointId");
return ReflectionUtils.getHidden(extensionPointId, "rawId");
}
private String firstNormalizedId(final ExtensionInjector injector) {
final Object extensionDescriptor = ReflectionUtils.getHidden(injector, "extensionDesc");
final Object extensionPointId = ReflectionUtils.getHidden(extensionDescriptor, "extensionPointId");
final List<String> ids = ReflectionUtils.getHidden(extensionPointId, "normalizedIds");
return ids.get(0);
}
private Object useType(final ExtensionInjector injector) {
final Object extensionDescriptor = ReflectionUtils.getHidden(injector, "extensionDesc");
return ReflectionUtils.getHidden(extensionDescriptor, "interfaceType");
}
private int getMin(final ExtensionInjector injector) {
final Object extensionDescriptor = ReflectionUtils.getHidden(injector, "extensionDesc");
return ReflectionUtils.getHidden(extensionDescriptor, "minOccurrences");
}
private int getMax(final ExtensionInjector injector) {
final Object extensionDescriptor = ReflectionUtils.getHidden(injector, "extensionDesc");
return ReflectionUtils.getHidden(extensionDescriptor, "maxOccurrences");
}
private boolean getHomogenious(final ExtensionInjector injector) {
final Object extensionDescriptor = ReflectionUtils.getHidden(injector, "extensionDesc");
return ReflectionUtils.getHidden(extensionDescriptor, "homogeneous");
}
private Object getTarget(final ExtensionInjector injector) {
final WeakRef<?> ref = ReflectionUtils.getHidden(injector, "targetRef");
return ref.get();
}
private String getUpdateMethodName(final ExtensionInjector injector) {
return ReflectionUtils.getHidden(injector, "updateMethodName");
}
private boolean getDoNotReplaceSymbols(final ExtensionInjector injector) {
return !(Boolean) ReflectionUtils.getHidden(injector, "symbolReplace");
}
private boolean getSpecific(final ExtensionInjector injector) {
return !(Boolean) ReflectionUtils.getHidden(injector, "nonSpecific");
}
private boolean getOnceOnly(final ExtensionInjector injector) {
return ReflectionUtils.getHidden(injector, "onceOnly");
}
}