/**
*
*/
package eu.quanticol.carma.core;
import java.nio.file.Paths;
import java.util.LinkedList;
import javax.tools.DiagnosticCollector;
import javax.tools.JavaFileObject;
import javax.tools.SimpleJavaFileObject;
import org.eclipse.emf.common.util.URI;
import org.eclipse.emf.ecore.EObject;
import org.eclipse.emf.ecore.resource.Resource;
import org.eclipse.xtext.resource.XtextResource;
import org.eclipse.xtext.resource.XtextResourceSet;
import com.google.inject.Injector;
import eu.quanticol.carma.core.carma.Model;
import eu.quanticol.carma.core.generator.ms.MSCompiler;
import eu.quanticol.carma.core.generator.ms.model.ModelHandler;
import eu.quanticol.carma.core.utils.LabelUtil;
import eu.quanticol.carma.simulator.CarmaModel;
import eu.quanticol.carma.simulator.CarmaSystem;
/**
* @author loreti
*
*/
public class ModelLoader {
private XtextResourceSet resourceSet;
private CharSequenceCompiler<CarmaModel> compiler;
//private Utilities utilities;
private ModelHandler generator;
public ModelLoader() {
Injector injector = new CARMAStandaloneSetup().createInjectorAndDoEMFRegistration();
this.resourceSet = injector.getInstance(XtextResourceSet.class);
this.resourceSet.addLoadOption(XtextResource.OPTION_RESOLVE_ALL, Boolean.TRUE);
//this.generator = new ModelHandler();//injector.getInstance(CARMAGenerator.class);
this.generator = injector.getInstance(ModelHandler.class);
// this.utilities = injector.getInstance(Utilities.class);
this.compiler = new CharSequenceCompiler<>(CarmaModel.class.getClassLoader(), new LinkedList<>());
}
public CarmaModel load( String fileName ) {
System.out.println("Loading: "+fileName);
URI uri = URI.createFileURI(Paths.get(fileName).toFile().toString());
Resource resource = resourceSet.getResource(uri, true);
EObject object = resource.getContents().get(0);
if (object instanceof Model) {
Model model = (Model) object;
String packageName = MSCompiler.PACK;//utilities.getPackageName(uri);
String className = new LabelUtil().name(model);
String fullClassName = packageName+"."+className;
CharSequence code = generator.modelToJava(model, className, packageName);//generator.generateJavaCode(model, packageName, className);
final DiagnosticCollector<JavaFileObject> errs =
new DiagnosticCollector<JavaFileObject>();
try {
Class<CarmaModel> compiledScript = compiler.compile(fullClassName, code, errs, new Class<?>[] { CarmaModel.class } );
return compiledScript.newInstance();
} catch (ClassCastException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (CharSequenceCompilerException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (IllegalAccessException e) {
e.printStackTrace();
} catch (InstantiationException e) {
e.printStackTrace();
}
}
return null;
}
class JavaSourceFromString extends SimpleJavaFileObject {
final String code;
JavaSourceFromString(String name, String code) {
super(java.net.URI.create("string:///" + name.replace('.','/') + Kind.SOURCE.extension),Kind.SOURCE);
this.code = code;
}
@Override
public CharSequence getCharContent(boolean ignoreEncodingErrors) {
return code;
}
}
}