package org.keplerproject.ldt.luaprofiler.launcher; import java.io.BufferedInputStream; import java.io.BufferedOutputStream; import java.io.File; import java.io.FileInputStream; import java.io.FileNotFoundException; import java.io.FileOutputStream; import java.io.IOException; import java.util.logging.Level; import java.util.logging.Logger; import org.eclipse.core.runtime.CoreException; import org.eclipse.debug.core.ILaunch; import org.eclipse.debug.core.model.IProcess; import org.keplerproject.ldt.internal.launching.InterpreterRunner; import org.keplerproject.ldt.internal.launching.InterpreterRunnerConfiguration; import org.keplerproject.ldt.luaprofiler.core.LuaProfiler; import org.keplerproject.ldt.luaprofiler.core.LuaProfiler.LuaProfilerInfo; import org.keplerproject.ldt.luaprofiler.core.analasyer.LuaProfilerAnalyser; import org.keplerproject.ldt.luaprofiler.core.views.LuaProfilerContentProvider; public class LuaProfilerInterpreterRunner extends InterpreterRunner { private static final Logger log = Logger.getLogger("profiler"); @Override protected String renderLabel(InterpreterRunnerConfiguration configuration) throws CoreException { // TODO Auto-generated method stub return super.renderLabel(configuration); } @Override protected String renderCommandLine(InterpreterRunnerConfiguration configuration) { File profiled = null; LuaProfilerInfo profilerLib = LuaProfiler.getDefault().getSelectedProfiler(); if (profilerLib == null) { return configuration.getAbsoluteFileName(); } try { profiled = File.createTempFile(configuration.getFileName(), "lua"); profiled.deleteOnExit(); BufferedInputStream in = new BufferedInputStream(new FileInputStream(new File(configuration.getAbsoluteFileName()))); BufferedOutputStream out = new BufferedOutputStream(new FileOutputStream(profiled)); File f = File.createTempFile(configuration.getFileName() + ".prof", "lua"); f.deleteOnExit(); LuaProfilerAnalyser.create(f.getAbsolutePath()); int i = profilerLib.getFile().getName().lastIndexOf('.'); int j = profilerLib.getFile().getPath().lastIndexOf(File.separatorChar); String profilerName = profilerLib.getFile().getName().substring(0, i); String profilerExtension = profilerLib.getFile().getName().substring(i, profilerLib.getName().length()); String profilerPath = profilerLib.getFile().getPath().substring(0, j) + File.separatorChar + "?" + profilerExtension; byte[] buf = new byte[1024]; int len; out.write(("_ = LUA_PATH\n").getBytes()); out.write(("LUA_PATH = \"" + profilerPath + "\"\n").getBytes()); out.write(("profiler = require\"" + profilerName + "\"\n").getBytes()); out.write("LUA_PATH = _\n".getBytes()); out.write(("profiler.start(\"" + f.getAbsolutePath() + "\")\n").getBytes()); while ((len = in.read(buf)) > 0) { out.write(buf, 0, len); } out.write("\nprofiler.stop()".getBytes()); in.close(); out.close(); } catch (FileNotFoundException e) { log.log(Level.WARNING, String.format("File %s not found", configuration.getAbsoluteFileName()), e); } catch (IOException e) { log.log(Level.WARNING, "I/O error", e); } return profiled.getAbsolutePath(); } @Override public IProcess run(InterpreterRunnerConfiguration configuration, ILaunch launch) throws CoreException { IProcess process = super.run(configuration, launch); LuaProfilerContentProvider.getContentProvider().fireChange(process); return process; } }