From 94029a0173f361fdf7ae8fe3828b68539f57e6c1 Mon Sep 17 00:00:00 2001 From: Sebastian Zarnekow Date: Wed, 6 Mar 2013 19:19:05 +0100 Subject: [PATCH] [xtext][junit] Reduce the number of injectors in the tests Instead of the map of Class -> InjectProvider a mapping of Class -> InjectorProvider is used. --- .../org/eclipse/xtext/junit4/XtextRunner.java | 28 ++------ .../junit4/internal/InjectorProviders.java | 71 +++++++++++++++++++ 2 files changed, 75 insertions(+), 24 deletions(-) create mode 100644 plugins/org.eclipse.xtext.junit4/src/org/eclipse/xtext/junit4/internal/InjectorProviders.java diff --git a/plugins/org.eclipse.xtext.junit4/src/org/eclipse/xtext/junit4/XtextRunner.java b/plugins/org.eclipse.xtext.junit4/src/org/eclipse/xtext/junit4/XtextRunner.java index 985ea9524..deb9a5532 100644 --- a/plugins/org.eclipse.xtext.junit4/src/org/eclipse/xtext/junit4/XtextRunner.java +++ b/plugins/org.eclipse.xtext.junit4/src/org/eclipse/xtext/junit4/XtextRunner.java @@ -7,24 +7,18 @@ *******************************************************************************/ package org.eclipse.xtext.junit4; -import static org.eclipse.xtext.util.Exceptions.*; - -import java.util.Map; - +import org.eclipse.xtext.junit4.internal.InjectorProviders; import org.junit.runners.BlockJUnit4ClassRunner; import org.junit.runners.model.FrameworkMethod; import org.junit.runners.model.InitializationError; import org.junit.runners.model.Statement; -import com.google.common.collect.Maps; import com.google.inject.Injector; /** * @author Michael Clay - Initial contribution and API */ public class XtextRunner extends BlockJUnit4ClassRunner { - private static Map, IInjectorProvider> injectorProviderClassCache = Maps.newHashMap(); - public XtextRunner(Class klass) throws InitializationError { super(klass); } @@ -64,29 +58,15 @@ public class XtextRunner extends BlockJUnit4ClassRunner { } protected IInjectorProvider getOrCreateInjectorProvider() { - IInjectorProvider injectorProvider = getInjectorProvider(); - if (injectorProvider == null) { - injectorProvider = createInjectorProvider(); - injectorProviderClassCache.put(getTestClass().getJavaClass(), injectorProvider); - } - return injectorProvider; + return InjectorProviders.getOrCreateInjectorProvider(getTestClass()); } protected IInjectorProvider getInjectorProvider() { - return injectorProviderClassCache.get(getTestClass().getJavaClass()); + return InjectorProviders.getInjectorProvider(getTestClass()); } protected IInjectorProvider createInjectorProvider() { - IInjectorProvider injectorProvider = null; - InjectWith injectWith = getTestClass().getJavaClass().getAnnotation(InjectWith.class); - if (injectWith != null) { - try { - injectorProvider = injectWith.value().newInstance(); - } catch (Exception e) { - throwUncheckedException(e); - } - } - return injectorProvider; + return InjectorProviders.createInjectorProvider(getTestClass()); } } diff --git a/plugins/org.eclipse.xtext.junit4/src/org/eclipse/xtext/junit4/internal/InjectorProviders.java b/plugins/org.eclipse.xtext.junit4/src/org/eclipse/xtext/junit4/internal/InjectorProviders.java new file mode 100644 index 000000000..457f4e441 --- /dev/null +++ b/plugins/org.eclipse.xtext.junit4/src/org/eclipse/xtext/junit4/internal/InjectorProviders.java @@ -0,0 +1,71 @@ +/******************************************************************************* + * Copyright (c) 2013 itemis AG (http://www.itemis.eu) 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 + *******************************************************************************/ +package org.eclipse.xtext.junit4.internal; + +import static org.eclipse.xtext.util.Exceptions.*; + +import org.eclipse.xtext.junit4.IInjectorProvider; +import org.eclipse.xtext.junit4.InjectWith; +import org.junit.runners.model.TestClass; + +import com.google.common.annotations.Beta; +import com.google.common.collect.ClassToInstanceMap; +import com.google.common.collect.MutableClassToInstanceMap; + +/** + * Maintains a map of injector provider types to their instance. + * + * Clients will usually use {@link #getOrCreateInjectorProvider(TestClass)} to obtain + * an valid injector provider in the context of a given {@link TestClass}. + * + * @author Sebastian Zarnekow - Initial contribution and API + */ +@Beta +public class InjectorProviders { + + private static ClassToInstanceMap injectorProviderClassCache = MutableClassToInstanceMap.create(); + + public static IInjectorProvider getOrCreateInjectorProvider(TestClass testClass) { + InjectWith injectWith = testClass.getJavaClass().getAnnotation(InjectWith.class); + if (injectWith != null) { + Class klass = injectWith.value(); + IInjectorProvider injectorProvider = injectorProviderClassCache.get(klass); + if (injectorProvider == null) { + try { + injectorProvider = klass.newInstance(); + injectorProviderClassCache.put(klass, injectorProvider); + } catch (Exception e) { + throwUncheckedException(e); + } + } + return injectorProvider; + } + return null; + } + + public static IInjectorProvider getInjectorProvider(TestClass testClass) { + InjectWith injectWith = testClass.getJavaClass().getAnnotation(InjectWith.class); + if (injectWith != null) { + return injectorProviderClassCache.get(injectWith.value()); + } + return null; + } + + public static IInjectorProvider createInjectorProvider(TestClass testClass) { + InjectWith injectWith = testClass.getJavaClass().getAnnotation(InjectWith.class); + if (injectWith != null) { + try { + return injectWith.value().newInstance(); + } catch (Exception e) { + throwUncheckedException(e); + } + } + return null; + } + +}