/*******************************************************************************
gocha.org-lib-java Библеотека общего назначения
(с) Камнев Георгий Павлович 2011 GPLv2
Данная программа является свободным программным обеспечением. Вы вправе
распространять ее и/или модифицировать в соответствии с условиями версии 2
либо по вашему выбору с условиями более поздней версии
Стандартной Общественной Лицензии GNU, опубликованной Free Software Foundation.
Мы распространяем данную программу в надежде на то, что она будет вам полезной,
однако НЕ ПРЕДОСТАВЛЯЕМ НА НЕЕ НИКАКИХ ГАРАНТИЙ,
в том числе ГАРАНТИИ ТОВАРНОГО СОСТОЯНИЯ ПРИ ПРОДАЖЕ
и ПРИГОДНОСТИ ДЛЯ ИСПОЛЬЗОВАНИЯ В КОНКРЕТНЫХ ЦЕЛЯХ.
Для получения более подробной информации ознакомьтесь
со Стандартной Общественной Лицензией GNU.
Вместе с данной программой вы должны были получить экземпляр
Стандартной Общественной Лицензии GNU.
Если вы его не получили, сообщите об этом в Free Software Foundation, Inc.,
59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
*******************************************************************************/
package org.gocha.jdk;
import java.io.IOException;
import java.io.OutputStreamWriter;
import java.io.Writer;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.Map;
import java.util.logging.Level;
import java.util.logging.Logger;
import javax.tools.JavaCompiler;
import javax.tools.JavaFileObject;
import javax.tools.StandardJavaFileManager;
import javax.tools.ToolProvider;
import org.gocha.jvm.MemoryByteCode;
import org.gocha.jvm.MemoryJavaFileManager;
import org.gocha.jvm.MemoryJavaSource;
/**
* Компилятор JAVA постовляемый JDK 1.6
* @author gocha
*/
public class JDKCompiler implements Compiler
{
@Override
public Iterable<? extends ByteCode> compile(Iterable<? extends SourceCode> sources) {
if (sources== null) {
throw new IllegalArgumentException("sources==null");
}
Map<String,MemoryByteCode> mem = new HashMap<String, MemoryByteCode>();
ArrayList<JavaFileObject> src = new ArrayList<JavaFileObject>();
for( SourceCode s : sources ){
if( s==null )continue;
if( s instanceof JavaFileObject ){
src.add((JavaFileObject)s);
}else{
src.add(new MemoryJavaSource(s.getClassName(), s.getSourceCode()));
}
}
if( !compileFiles(mem, src) ){
throw new Error("Compile failed see STDERR");
}
ArrayList<ByteCode> result = new ArrayList<ByteCode>();
for( MemoryByteCode memBC : mem.values() ){
result.add(memBC);
}
return result;
}
private boolean compileFiles(Map<String,MemoryByteCode> mem, Iterable<? extends JavaFileObject> javaSources)
{
JavaCompiler compiler = ToolProvider.getSystemJavaCompiler();
if( compiler==null ){
Logger.getLogger(JDKCompiler.class.getName()).log(
Level.WARNING,
"platform not support Java compiler, use JDK");
return false;
}
StandardJavaFileManager fileman = compiler.getStandardFileManager(null, null, null);
MemoryJavaFileManager fileman2 = new MemoryJavaFileManager(fileman);
fileman2.setClassDataMap(mem);
Iterable<? extends JavaFileObject> compilUnit = javaSources;
Writer writer = new OutputStreamWriter(System.err);
JavaCompiler.CompilationTask ctask = compiler.getTask(writer, fileman2, null, null, null, compilUnit);
Boolean res = ctask.call();
boolean successCompile = res!=null ? res : false;
try {
fileman.close();
}
catch (IOException ex) {
Logger.getLogger(JDKCompiler.class.getName()).log(Level.SEVERE, null, ex);
}
return successCompile;
}
}