package org.xpect.registry;
import org.eclipse.emf.ecore.resource.Resource;
import org.eclipse.emf.ecore.resource.Resource.Factory;
import org.eclipse.xtext.resource.IResourceServiceProvider;
import org.xpect.registry.IEmfFileExtensionInfo.IXtextFileExtensionInfo;
import com.google.inject.Provider;
public class FileExtensionRegistrar {
protected abstract static class AbstractDesrc<T extends IEmfFileExtensionInfo> {
protected final T info;
public AbstractDesrc(T info) {
this.info = info;
}
public T getInfo() {
return info;
}
protected <X> X newInstance(LazyClass<X> clazz) {
Class<X> loaded = clazz.load();
if (info instanceof IXtextFileExtensionInfo) {
IXtextFileExtensionInfo xtextInfo = (IXtextFileExtensionInfo) info;
ILanguageInfo languageInfo = ILanguageInfo.Registry.INSTANCE.getLanguageByName(xtextInfo.getLanguageID());
return languageInfo.getInjector().getInstance(loaded);
} else {
try {
return loaded.newInstance();
} catch (InstantiationException e) {
throw new RuntimeException(e);
} catch (IllegalAccessException e) {
throw new RuntimeException(e);
}
}
}
}
protected static class ResourceFactoryDescr extends AbstractDesrc<IEmfFileExtensionInfo> implements Resource.Factory.Descriptor {
private Factory factory;
public ResourceFactoryDescr(IEmfFileExtensionInfo info) {
super(info);
}
public Factory createFactory() {
if (factory == null)
factory = newInstance(info.getResourceFactory());
return factory;
}
}
protected static class ServiceProvider extends AbstractDesrc<IXtextFileExtensionInfo> implements Provider<IResourceServiceProvider> {
private IResourceServiceProvider provider;
public ServiceProvider(IXtextFileExtensionInfo info) {
super(info);
}
public IResourceServiceProvider get() {
if (provider == null)
provider = newInstance(info.getResourceServiceProvider());
return provider;
}
}
public static void register(IEmfFileExtensionInfo info) {
ResourceFactoryDescr rf = new ResourceFactoryDescr(info);
ServiceProvider spp = info instanceof IXtextFileExtensionInfo ? new ServiceProvider((IXtextFileExtensionInfo) info) : null;
for (String ext : info.getFileExtensions()) {
Resource.Factory.Registry.INSTANCE.getExtensionToFactoryMap().put(ext, rf);
if (spp != null)
IResourceServiceProvider.Registry.INSTANCE.getExtensionToFactoryMap().put(ext, spp);
}
}
}