package jetbrains.mps.build.mps.runner.runtime;
/*Generated by MPS */
import jetbrains.mps.tool.builder.make.GeneratorWorker;
import jetbrains.mps.tool.common.Script;
import jetbrains.mps.tool.builder.MpsWorker;
import org.apache.log4j.Logger;
import jetbrains.mps.tool.environment.EnvironmentConfig;
import java.io.File;
import jetbrains.mps.internal.collections.runtime.IMapping;
import jetbrains.mps.internal.collections.runtime.MapSequence;
import jetbrains.mps.tool.environment.Environment;
import jetbrains.mps.project.Project;
import jetbrains.mps.tool.common.MpsRunnerProperties;
import org.jetbrains.mps.openapi.module.SModuleReference;
import jetbrains.mps.project.structure.modules.ModuleReference;
import jetbrains.mps.baseLanguage.closures.runtime.Wrappers;
import org.jetbrains.mps.openapi.module.SModule;
import jetbrains.mps.module.ReloadableModule;
import java.lang.reflect.Method;
import java.lang.reflect.InvocationTargetException;
import jetbrains.mps.tool.environment.IdeaEnvironment;
import org.jetbrains.annotations.NotNull;
public class MpsRunnerWorker extends GeneratorWorker {
public MpsRunnerWorker(Script whatToDo, MpsWorker.AntLogger logger) {
super(whatToDo, logger);
}
@Override
public void work() {
Logger.getRootLogger().setLevel(myWhatToDo.getLogLevel());
EnvironmentConfig config = EnvironmentConfig.defaultConfig();
for (String jar : myWhatToDo.getLibraryJars()) {
File jarFile = new File(jar);
if (!(jarFile.exists())) {
warning("Library " + jar + " does not exist.");
}
config = config.addLib(jar);
}
for (IMapping<String, String> macro : MapSequence.fromMap(myWhatToDo.getMacro())) {
config = config.addMacro(macro.key(), new File(macro.value()));
}
Environment environment = new MpsRunnerWorker.MyEnvironment(config);
environment.init();
setupEnvironment();
final Project project = createDummyProject();
MpsRunnerProperties properties = new MpsRunnerProperties(myWhatToDo);
String className = properties.getStartClass();
String methodName = properties.getStartMethod();
final SModuleReference solutionRef = ModuleReference.parseReference(properties.getSolution());
final Wrappers._T<SModule> module = new Wrappers._T<SModule>();
project.getModelAccess().runWriteAction(new Runnable() {
public void run() {
module.value = solutionRef.resolve(project.getRepository());
}
});
boolean isClassFound = runClass(module.value, className, methodName);
if (!(isClassFound)) {
error("cannot find class " + className + " in solution " + solutionRef);
}
dispose();
}
private static boolean runClass(SModule module, String className, String methodName) {
Class cls = null;
if (!(module instanceof ReloadableModule)) {
return false;
}
try {
cls = ((ReloadableModule) (module)).getClass(className);
} catch (ClassNotFoundException e) {
}
if (cls == null) {
return false;
}
try {
// invoke public static method
Method method = cls.getMethod(methodName);
method.invoke(null);
} catch (NoSuchMethodException e) {
e.printStackTrace();
} catch (InvocationTargetException e) {
e.printStackTrace();
} catch (IllegalAccessException e) {
e.printStackTrace();
}
return true;
}
protected class MyEnvironment extends IdeaEnvironment {
public MyEnvironment(@NotNull EnvironmentConfig config) {
super(config);
}
@Override
protected ClassLoader rootClassLoader() {
return getClassLoader();
}
}
public static void main(String[] args) {
MpsRunnerWorker runner = new MpsRunnerWorker(Script.fromDumpInFile(new File(args[0])), new MpsWorker.SystemOutLogger());
runner.workFromMain();
}
protected void executeTask(Project project, MpsWorker.ObjectsToProcess go) {
}
protected void showStatistic() {
}
}