/*******************************************************************************
* Copyright (c) 2012 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.xpect.registry;
import java.util.Collection;
import java.util.List;
import java.util.Map;
import org.apache.log4j.Logger;
import org.eclipse.emf.ecore.plugin.EcorePlugin;
import org.eclipse.xtext.resource.IResourceServiceProvider;
import org.eclipse.xtext.util.Modules2;
import org.xpect.XpectConstants;
import org.xpect.registry.IEmfFileExtensionInfo.IXtextFileExtensionInfo;
import org.xpect.services.XtResourceServiceProviderProvider;
import com.google.common.base.Joiner;
import com.google.common.collect.Lists;
import com.google.common.collect.Maps;
import com.google.inject.Guice;
import com.google.inject.Injector;
import com.google.inject.Module;
/**
* @author Moritz Eysholdt - Initial contribution and API
*/
public class StandaloneLanguageRegistry implements ILanguageInfo.Registry {
protected static class StandaloneLanguageInfoImpl extends AbstractLanguageInfo {
public StandaloneLanguageInfoImpl(IXtextFileExtensionInfo info) {
super(info);
}
protected Injector createInjector(Module... modules) {
try {
if (modules.length > 0)
return Guice.createInjector(Modules2.mixin(getRuntimeModule(), Modules2.mixin(modules)));
else
return Guice.createInjector(getRuntimeModule());
} catch (Throwable t) {
List<String> moduleNames = Lists.newArrayList(getRuntimeModule().getClass().getName());
for (Module m : modules)
moduleNames.add(m.getClass().getName());
throw new RuntimeException("Error creating Injector with modules " + Joiner.on(", ").join(moduleNames), t);
}
}
}
private static final Logger LOG = Logger.getLogger(StandaloneLanguageRegistry.class);
private static boolean running = false;
private Map<String, ILanguageInfo> ext2language;
private Map<String, ILanguageInfo> name2language;
public StandaloneLanguageRegistry() {
try {
init();
} catch (Throwable e) {
LOG.error("Error initalizing language registry", e);
}
}
public ILanguageInfo getLanguageByFileExtension(String fileExtension) {
return ext2language.get(fileExtension);
}
public ILanguageInfo getLanguageByName(String name) {
return name2language.get(name);
}
public Collection<ILanguageInfo> getLanguages() {
return name2language.values();
}
protected void init() {
ext2language = Maps.newHashMap();
name2language = Maps.newHashMap();
if (EcorePlugin.IS_ECLIPSE_RUNNING)
throw new IllegalStateException("This class can only run in standalone mode (no OSGi, no Eclipse)");
if (running)
throw new IllegalStateException("I want to be a singleton!");
running = true;
for (String nsURI : IEPackageInfo.Registry.INSTANCE.getNamespaceURIs())
EPackageRegistrar.register(IEPackageInfo.Registry.INSTANCE.getEPackageInfo(nsURI));
for (IEmfFileExtensionInfo info : IEmfFileExtensionInfo.Registry.INSTANCE.getFileExtensionInfos()) {
FileExtensionRegistrar.register(info);
if (info instanceof IXtextFileExtensionInfo) {
StandaloneLanguageInfoImpl infoImpl = new StandaloneLanguageInfoImpl((IXtextFileExtensionInfo) info);
name2language.put(infoImpl.getLanguageName(), infoImpl);
for (String ext : info.getFileExtensions())
ext2language.put(ext, infoImpl);
}
}
registerRSPProviderForXt();
}
protected void registerRSPProviderForXt() {
if (IResourceServiceProvider.Registry.INSTANCE.getExtensionToFactoryMap().get(XpectConstants.XT_FILE_EXT) == null) {
IResourceServiceProvider.Registry.INSTANCE.getExtensionToFactoryMap().put(XpectConstants.XT_FILE_EXT, XtResourceServiceProviderProvider.INSTANCE);
}
}
}