package org.xpect.registry; import java.util.Collection; import java.util.Map; import java.util.Set; import org.apache.log4j.Logger; import org.eclipse.emf.ecore.resource.Resource; import org.xpect.util.URIDelegationHandler; import com.google.common.base.Joiner; import com.google.common.base.Objects; import com.google.common.collect.HashMultimap; import com.google.common.collect.ImmutableMap; import com.google.common.collect.ImmutableSet; import com.google.common.collect.Maps; import com.google.common.collect.Multimap; public class TestSuiteInfoRegistry implements ITestSuiteInfo.Registry { private static final String ORG_XPECT_TEST_SUITE = "org.xpect.testSuite"; private final static Logger LOG = Logger.getLogger(TestSuiteInfoRegistry.class); public static class Delegate implements ITestSuiteInfo.Registry { private ITestSuiteInfo.Registry delegate; public ITestSuiteInfo getTestSuite(Resource resource) { if (delegate == null) { delegate = new TestSuiteInfoRegistry(); } return delegate.getTestSuite(resource); } public void setDelegate(ITestSuiteInfo.Registry delegate) { this.delegate = delegate; } @Override public String toString() { return delegate.toString(); } } public static class TestSuiteInfo implements ITestSuiteInfo { private final LazyClass<Object> clazz; private final Set<String> fileExtensions; public TestSuiteInfo(LazyClass<Object> clazz, Collection<String> fileExtensions) { super(); this.clazz = clazz; this.fileExtensions = ImmutableSet.copyOf(fileExtensions); } public LazyClass<Object> getClazz() { return clazz; } public Set<String> getFileExtensions() { return fileExtensions; } @Override public String toString() { return Objects.toStringHelper(this).add("fileExtensions", fileExtensions).add("class", clazz).toString(); } } public static void main(String[] args) { System.out.println(new TestSuiteInfoRegistry().toString()); } private final Map<String, ITestSuiteInfo> extToInfo; public TestSuiteInfoRegistry() { Multimap<LazyClass<Object>, String> suiteToExt = HashMultimap.create(); for (IExtensionInfo info : IExtensionInfo.Registry.INSTANCE.getExtensions(ORG_XPECT_TEST_SUITE)) { LazyClass<Object> clazz = LazyClass.create(Object.class, info, "class"); if (clazz == null) { LOG.warn("Attribute 'class' missing for extension '" + ORG_XPECT_TEST_SUITE + "' in " + info.getLocation()); continue; } String fileExtension = info.getAttributeValue("fileExtension"); if (fileExtension == null) { LOG.warn("Attribute 'fileExtension' missing for extension '" + ORG_XPECT_TEST_SUITE + "' in " + info.getLocation()); continue; } suiteToExt.put(clazz, fileExtension); } Map<String, ITestSuiteInfo> infos = Maps.newHashMap(); for (Map.Entry<LazyClass<Object>, Collection<String>> e : suiteToExt.asMap().entrySet()) { TestSuiteInfo info = new TestSuiteInfo(e.getKey(), e.getValue()); for (String ext : e.getValue()) infos.put(ext, info); } this.extToInfo = ImmutableMap.copyOf(infos); } public ITestSuiteInfo getTestSuite(Resource resource) { String fileExtension = new URIDelegationHandler().getOriginalFileExtension(resource.getURI().lastSegment()); return extToInfo.get(fileExtension); } @Override public String toString() { Collection<ITestSuiteInfo> values = extToInfo.values(); if (values.isEmpty()) return "(empty)"; return Joiner.on('\n').join(values); } }