/*******************************************************************************
* 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.List;
import java.util.Map;
import java.util.Set;
import org.xpect.registry.IEmfFileExtensionInfo.IXtextFileExtensionInfo;
import com.google.common.collect.ImmutableList;
import com.google.common.collect.Maps;
import com.google.inject.Injector;
import com.google.inject.Module;
/**
* @author Moritz Eysholdt - Initial contribution and API
*/
public abstract class AbstractLanguageInfo implements ILanguageInfo {
private final IXtextFileExtensionInfo info;
protected Injector injector;
protected Map<List<Class<? extends Module>>, Injector> injectors = Maps.newHashMap();
protected Module runtimeModule = null;
protected Module sharedModule = null;
protected Module uiModule = null;
public AbstractLanguageInfo(IXtextFileExtensionInfo info) {
this.info = info;
}
protected abstract Injector createInjector(Module... modules);
@Override
public boolean equals(Object obj) {
if (obj == null || obj.getClass() != getClass())
return false;
return info.getLanguageID().equals(((AbstractLanguageInfo) obj).info.getLanguageID());
}
public Set<String> getFileExtensions() {
return info.getFileExtensions();
}
public Injector getInjector() {
if (injector == null)
injector = createInjector();
return injector;
}
public Injector getInjector(List<Class<? extends Module>> moduleClasses) {
if (moduleClasses.isEmpty()) {
return getInjector();
} else {
List<Class<? extends Module>> key = ImmutableList.copyOf(moduleClasses);
Injector result = injectors.get(key);
if (result != null)
return result;
Injector defaultInjector = getInjector();
Module[] modules = new Module[moduleClasses.size()];
for (int i = 0; i < moduleClasses.size(); i++)
modules[i] = defaultInjector.getInstance(moduleClasses.get(i));
result = createInjector(modules);
injectors.put(key, result);
return result;
}
}
public String getLanguageName() {
return info.getLanguageID();
}
protected Module getRuntimeModule() {
if (runtimeModule == null) {
try {
Class<? extends Module> clazz = getRuntimeModuleClass();
runtimeModule = clazz.newInstance();
} catch (InstantiationException e) {
throw new RuntimeException(e);
} catch (IllegalAccessException e) {
throw new RuntimeException(e);
}
}
return runtimeModule;
}
public Class<? extends Module> getRuntimeModuleClass() {
return info.getRuntimeModule().load();
}
protected Module getSharedStateModule() {
if (sharedModule == null) {
Class<Module> module = info.getSharedModule().load();
try {
sharedModule = module.newInstance();
} catch (InstantiationException e) {
throw new RuntimeException(e);
} catch (IllegalAccessException e) {
throw new RuntimeException(e);
}
}
return sharedModule;
}
public String getUiLangName() {
return info.getUIModule().getName();
}
public Class<? extends Module> getUIModuleClass() {
return info.getUIModule().load();
}
@Override
public int hashCode() {
return info.getLanguageID().hashCode();
}
}