package org.jnario.jvmmodel;
import static com.google.common.base.Strings.isNullOrEmpty;
import static org.eclipse.xtext.EcoreUtil2.getContainerOfType;
import org.eclipse.emf.ecore.EObject;
import org.eclipse.xtend.core.xtend.XtendClass;
import org.eclipse.xtext.util.IResourceScopeCache;
import org.jnario.util.XtendTypes;
import com.google.common.collect.ImmutableList;
import com.google.inject.Inject;
import com.google.inject.Provider;
public abstract class JnarioNameProvider {
@Inject
private IResourceScopeCache cache;
private class Cache {
public String get(EObject key, Provider<String> provider) {
if (key.eResource() != null) {
return cache.get(ImmutableList.of(key, this), key.eResource(), provider);
}
return provider.get();
}
}
private Cache classNameCache = new Cache();
private Cache fieldNameCache = new Cache();
private Cache methodNameCache = new Cache();
private Cache qualifiedNameCache = new Cache();
private Cache describeCache = new Cache();
public final String toQualifiedJavaClassName(final EObject eObject) {
return qualifiedNameCache.get(eObject, new Provider<String>() {
public String get() {
return internalToQualifiedJavaClassName(eObject);
}
});
}
protected String internalToQualifiedJavaClassName(EObject eObject) {
if (eObject == null) {
return null;
}
String className = toJavaClassName(eObject);
if (isNullOrEmpty(className)) {
return null;
}
String packageName = getPackageName(eObject);
if (isNullOrEmpty(packageName)) {
return className;
}
return packageName + "." + className;
}
protected String getPackageName(EObject eObject) {
XtendClass xtendClass = getContainerOfType(eObject, XtendClass.class);
String packageName = XtendTypes.packageName(xtendClass);
return packageName;
}
public final String toJavaClassName(final EObject eObject) {
return classNameCache.get(eObject, new Provider<String>() {
public String get() {
return internalToJavaClassName(eObject);
}
});
}
public final String describe(final EObject eObject) {
return describeCache.get(eObject, new Provider<String>() {
public String get() {
return internalDescribe(eObject);
}
});
}
public final String toMethodName(final EObject eObject) {
return methodNameCache.get(eObject, new Provider<String>() {
public String get() {
return internalToMethodName(eObject);
}
});
}
public final String toFieldName(final EObject eObject) {
return fieldNameCache.get(eObject, new Provider<String>() {
public String get() {
return internalToFieldName(eObject);
}
});
}
protected abstract String internalToJavaClassName(EObject eObject);
protected abstract String internalDescribe(EObject eObject);
protected abstract String internalToMethodName(EObject eObject);
protected abstract String internalToFieldName(EObject eObject);
}