/**
*
*/
package cn.bran.japid.rendererloader;
import java.util.HashMap;
import java.util.Map;
import org.eclipse.jdt.internal.compiler.classfmt.ClassFileReader;
import org.eclipse.jdt.internal.compiler.classfmt.ClassFormatException;
import org.eclipse.jdt.internal.compiler.env.INameEnvironment;
import org.eclipse.jdt.internal.compiler.env.NameEnvironmentAnswer;
import cn.bran.japid.template.JapidRenderer;
import cn.bran.japid.util.JapidFlags;
import cn.bran.japid.util.StringUtils;
/**
* @author bran
*
*/
final class NameEnv implements INameEnvironment {
private Map<String, Boolean> packagesCache = new HashMap<String, Boolean>();
private TemplateClassLoader crlr;
/**
* @param rendererCompiler
*/
NameEnv(TemplateClassLoader ldr) {
this.crlr = ldr;
}
@Override
public NameEnvironmentAnswer findType(final char[][] compoundTypeName) {
return findType(StringUtils.join(compoundTypeName, "."));
}
@Override
public NameEnvironmentAnswer findType(final char[] typeName, final char[][] packageName) {
return findType(StringUtils.join(packageName, ".") + "." + new String(typeName));
}
private NameEnvironmentAnswer findType(final String name) {
char[] fileName = name.toCharArray();
try {
if (!name.startsWith("japidviews.")) {
// let super class loader to load the bytecode
byte[] bytes = crlr.getClassDefinition(name);
if (bytes != null) {
// System.out.println("japid: byecode found: " + name);
return new NameEnvironmentAnswer(new ClassFileReader(bytes, fileName, true), null);
} else {
// System.out.println("japid: bytes not found: " + name);
}
} else { // japidviews
RendererClass applicationClass = JapidRenderer.japidClasses.get(name); // I don't like this XXX
// ApplicationClass exists
if (applicationClass != null) {
byte[] bytecode = applicationClass.getBytecode();
if (bytecode != null) {
return new NameEnvironmentAnswer(new ClassFileReader(bytecode, fileName, true), null);
} else
// Cascade compilation
return new NameEnvironmentAnswer(new CompilationUnit(name), null);
}
}
return null;
} catch (ClassFormatException e) {
throw new RuntimeException(e);
}
}
@Override
public boolean isPackage(char[][] parentPackageName, char[] packageName) {
String name = StringUtils.join(parentPackageName, ".") + "." + new String(packageName);
if (packagesCache.containsKey(name)) {
return packagesCache.get(name).booleanValue();
}
// Check if there is a .java or .class for this resource
if (crlr.getClassDefinition(name) != null) {
packagesCache.put(name, false);
return false;
}
if (JapidRenderer.japidClasses.get(name) != null) {
packagesCache.put(name, false);
return false;
}
packagesCache.put(name, true);
return true;
}
@Override
public void cleanup() {
}
}