package com.jds.jn.classes;
import java.io.File;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import org.apache.log4j.Logger;
import com.jds.jn.classes.compiler.Compiler;
import com.jds.jn.classes.compiler.MemoryClassLoader;
/**
* Author: VISTALL
* Company: J Develop Station
* Date: 27/11/2009
* Time: 7:05:13
*/
public class CLoader
{
private static CLoader _instance;
private Map<String, Class<?>> _classes = new HashMap<String, Class<?>>();
private static final Logger _log = Logger.getLogger(CLoader.class);
public static CLoader getInstance()
{
if (_instance == null)
{
_instance = new CLoader();
}
return _instance;
}
CLoader()
{
load();
}
public int size()
{
return _classes.size();
}
public void load()
{
_classes.clear();
List<File> fileNames = new ArrayList<File>();
getFiles(fileNames, new java.io.File("../files"), "");
if (Compiler.getInstance().compile(fileNames))
{
MemoryClassLoader classLoader = Compiler.getInstance().getClassLoader();
for (String name : classLoader.byteCodes.keySet())
{
if (name.contains("$"))
{
continue; // пропускаем вложенные классы
}
try
{
Class c = classLoader.loadClass(name);
_classes.put(name, c);
}
catch (ClassNotFoundException e)
{
_log.info("Can't load file " + e, e);
}
}
Compiler.getInstance().setClassLoader(null);
}
}
private void getFiles(List<File> list, File f, String dir)
{
for (java.io.File z : f.listFiles())
{
if (z.isDirectory())
{
if (z.isHidden() || z.getName().equals(".svn"))
{
continue;
}
String olddir = dir;
dir = dir + z.getName() + "/";
getFiles(list, z, dir);
dir = olddir;
}
else
{
if (z.isHidden() || !z.getName().contains(".java"))
{
continue;
}
list.add(z);
}
}
}
public Class<?> forName(String file) throws ClassNotFoundException
{
if (_classes.get(file) == null)
{
throw new ClassNotFoundException("Class not find: " + file);
}
return _classes.get(file);
}
}