/** * */ package org.eclipse.vjet.eclipse.javatojs.ui.commands; import java.util.ArrayList; import java.util.List; import org.eclipse.core.resources.IProject; import org.eclipse.core.resources.IResource; import org.eclipse.core.resources.IWorkspace; import org.eclipse.core.resources.IWorkspaceRunnable; import org.eclipse.core.resources.ResourcesPlugin; import org.eclipse.core.resources.WorkspaceJob; import org.eclipse.core.runtime.CoreException; import org.eclipse.core.runtime.IAdaptable; import org.eclipse.core.runtime.IProgressMonitor; import org.eclipse.core.runtime.IStatus; import org.eclipse.core.runtime.NullProgressMonitor; import org.eclipse.core.runtime.Status; import org.eclipse.core.runtime.SubProgressMonitor; import org.eclipse.ui.console.MessageConsoleStream; import org.eclipse.vjet.core.codegen.bootstrap.IJava2JsCodeGenInput; import org.eclipse.vjet.core.codegen.bootstrap.IJava2JsCodeGenOutput; import org.eclipse.vjet.core.codegen.bootstrap.IJava2JsCodeGenTool; import org.eclipse.vjet.eclipse.javatojs.ui.Java2JsPlugin; import org.eclipse.vjet.eclipse.javatojs.ui.adapters.ToolMonitor; import org.eclipse.vjet.eclipse.javatojs.ui.commands.ClassloaderUtils.ClassLoaderKey; import org.eclipse.vjet.eclipse.javatojs.ui.markers.Java2JsMarker; //import com.ebay.darwin.tools.eclipse.classloader.ClassloaderClassNameConstants; //import com.ebay.darwin.tools.eclipse.classloader.ClassloaderUtils; //import com.ebay.darwin.tools.eclipse.classloader.ClassloaderUtils.ClassLoaderKey; //import com.ebay.dsf.bootstrap.codegen.IJava2JsCodeGenInput; //import com.ebay.dsf.bootstrap.codegen.IJava2JsCodeGenOutput; //import com.ebay.dsf.bootstrap.codegen.IJava2JsCodeGenTool; //import com.ebay.tools.v4.java2js.adapters.ToolMonitor; //import com.ebay.tools.v4.java2js.markers.Java2JsMarker; //import com.ebay.tools.v4.java2js.plugin.Java2JsPlugin; /** * Work space job for generating JavaScript code from Java code. Called by the * Java2Js code generation command. * * @see Java2JsGenerateHandler * @author Ricker * */ public class Java2JsGenerateJob extends WorkspaceJob { private List<IJava2JsCodeGenInput> input; private List<IJava2JsCodeGenOutput> output; public Java2JsGenerateJob(List<IJava2JsCodeGenInput> input) { super("Java2Js Generate Job"); this.input = input; } @Override public IStatus runInWorkspace(IProgressMonitor monitor) throws CoreException { /* * create the runnable */ IWorkspaceRunnable runnable = new IWorkspaceRunnable() { public void run(IProgressMonitor monitor) throws CoreException { if (monitor == null) { monitor = new NullProgressMonitor(); } try { monitor.beginTask("Generate ", 50); /* * console */ MessageConsoleStream stream = Java2JsPlugin.getDefault() .getConsole().newMessageStream(); /* * Call generator */ IJava2JsCodeGenTool generator = getGenerator(); output = generator.generate(input, new ToolMonitor( new SubProgressMonitor(monitor, 30), stream)); /* * report output */ stream.println("Generator output:"); for (IJava2JsCodeGenOutput item : output) { stream.println(item.getUrl().toString()); } /* * create the markers */ mark(new SubProgressMonitor(monitor, 10)); /* * refresh workspace */ refresh(new SubProgressMonitor(monitor, 10)); stream.println("Generator complete."); } finally { monitor.done(); } } }; /* * run the runnable */ IWorkspace workspace = ResourcesPlugin.getWorkspace(); workspace.run(runnable, monitor); return Status.OK_STATUS; } protected void mark(IProgressMonitor monitor) { try { monitor.beginTask("Create markers", input.size() + output.size()); /* * clear markers on input */ for (IJava2JsCodeGenInput in : input) { Java2JsMarker.clearMarkers(in); monitor.worked(1); } /* * create markers from output */ for (IJava2JsCodeGenOutput out : output) { Java2JsMarker.mark(out); monitor.worked(1); } } finally { monitor.done(); } } /** * Refresh is expensive. We only want to refresh the projects that are * affected by the generation. */ protected void refresh(IProgressMonitor monitor) { try { /* * figure out projects */ List<IProject> projects = new ArrayList<IProject>(); for (IJava2JsCodeGenInput item : input) { if (item instanceof IAdaptable) { IResource resource = (IResource) ((IAdaptable) item) .getAdapter(IResource.class); if (resource != null) { projects.add(resource.getProject()); } } } monitor.beginTask("Refresh workspace", projects.size()); /* * refresh each project */ for (IProject project : projects) { try { project.refreshLocal(IResource.DEPTH_INFINITE, monitor); } catch (CoreException e) { Java2JsPlugin.logException(e); } monitor.worked(1); } } finally { monitor.done(); } } /** * The list of output beans produced from completing this job. * * @return output from code generation */ public List<IJava2JsCodeGenOutput> getOutput() { return output; } /** * Calls the class loader utilities to create the generator. * * @return code generator * @throws CoreException * if generator not found */ protected IJava2JsCodeGenTool getGenerator() { //return new JavaToJsCodeGenTool(); Object obj = ClassloaderUtils .getWorkspaceObject( "org.eclipse.vjet.eclipse.javatojs.core.JavaToJsCodeGenTool", ClassLoaderKey.DEFAULT); if (obj instanceof IJava2JsCodeGenTool) { return (IJava2JsCodeGenTool) obj; } return null; // throw new CoreException( // new Status( // Status.ERROR, // Java2JsPlugin.PLUGIN_ID, // "Could not load code generator " // + ClassloaderClassNameConstants.JAVA2JAVASCRIPT_TOOL_CLASS_PACKAGE_NAME)); } }