package org.webpieces.compiler.impl;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import org.webpieces.util.logging.Logger;
import org.webpieces.util.logging.LoggerFactory;
import org.webpieces.compiler.api.CompileConfig;
import org.webpieces.util.file.VirtualFile;
/**
* Application classes container.
*/
public class CompileMetaMgr {
private static final Logger log = LoggerFactory.getLogger(CompileMetaMgr.class);
/**
* Cache of all compiled classes
*/
Map<String, CompileClassMeta> classes = new HashMap<String, CompileClassMeta>();
private CompileConfig config;
public CompileMetaMgr(CompileConfig config) {
this.config = config;
}
/**
* Clear the classes cache
*/
public void clear() {
classes = new HashMap<String, CompileClassMeta>();
}
public CompileClassMeta getOrCreateApplicationClass(String name, VirtualFile current) {
CompileClassMeta applicationClass = classes.get(name);
if(applicationClass != null)
return applicationClass;
else if(current == null)
return null;
log.trace(()->"Adding class="+name+" to ApplicationClassMgr");
CompileClassMeta appClass = new CompileClassMeta(name, current, config);
classes.put(name, appClass);
return appClass;
}
/**
* Get a class by name
* @param name The fully qualified class name
* @return The ApplicationClass or null
*/
public CompileClassMeta getApplicationClass(String name) {
CompileClassMeta applicationClass = classes.get(name);
if(applicationClass != null)
return applicationClass;
//the compiler looks up packages that we don't have (or classes we don't have like java.lang.Object)
return null;
}
/**
* All loaded classes.
* @return All loaded classes
*/
public List<CompileClassMeta> all() {
return new ArrayList<CompileClassMeta>(classes.values());
}
/**
* Put a new class to the cache.
*/
public void add(CompileClassMeta applicationClass) {
classes.put(applicationClass.name, applicationClass);
}
/**
* Remove a class from cache
*/
public void remove(CompileClassMeta applicationClass) {
classes.remove(applicationClass.name);
}
public void remove(String applicationClass) {
classes.remove(applicationClass);
}
/**
* Does this class is already loaded ?
* @param name The fully qualified class name
*/
public boolean hasClass(String name) {
return classes.containsKey(name);
}
@Override
public String toString() {
return classes.toString();
}
}