Package org.gocha.jdk

Source Code of org.gocha.jdk.JDKCompiler

/*******************************************************************************
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;
    }
}
TOP

Related Classes of org.gocha.jdk.JDKCompiler

TOP
Copyright © 2018 www.massapi.com. All rights reserved.
All source code are property of their respective owners. Java is a trademark of Sun Microsystems, Inc and owned by ORACLE Inc. Contact coftware#gmail.com.