X-Git-Url: http://source.jalview.org/gitweb/?a=blobdiff_plain;f=utils%2Fjalviewjs%2FJava2ScriptCompilationParticipant.java;fp=utils%2Fjalviewjs%2FJava2ScriptCompilationParticipant.java;h=9c7aeb95c226fa827a373c0e5520f9c0f1b4ffdb;hb=41ba5838e9920dbc3609dbabe04df91f733c4f85;hp=0000000000000000000000000000000000000000;hpb=741ffd68a834d7501e3fc480f8917429d0e687c4;p=jalview.git diff --git a/utils/jalviewjs/Java2ScriptCompilationParticipant.java b/utils/jalviewjs/Java2ScriptCompilationParticipant.java new file mode 100644 index 0000000..9c7aeb9 --- /dev/null +++ b/utils/jalviewjs/Java2ScriptCompilationParticipant.java @@ -0,0 +1,185 @@ +package net.sf.j2s.core; + +import java.util.Arrays; +import java.util.Properties; + +import org.eclipse.jdt.core.IJavaProject; +import org.eclipse.jdt.core.compiler.BuildContext; +import org.eclipse.jdt.core.compiler.ReconcileContext; + +/** + * New Java2Script compiler uses org.eclipse.jdt.core.compiler.CompilationParticipant instead of builder + * + * source: https://github.com/eclipse/org.aspectj.shadows/blob/master/org.eclipse.jdt.core/model/org/eclipse/jdt/core/compiler/CompilationParticipant.java + * + * @author hansonr + * + */ +public class Java2ScriptCompilationParticipant extends org.eclipse.jdt.core.compiler.CompilationParticipant { + private BuildContext[] javaFiles; + private boolean isCleanBuild; + + public Java2ScriptCompilationParticipant() { + System.out.println("CompilationParticipant started"); + } + + /** + * Returns whether this participant is active for a given project. + *

+ * Default is to return false. + *

+ *

+ * For efficiency, participants that are not interested in the given project + * should return false for that project. + *

+ * + * @param project + * the project to participate in + * @return whether this participant is active for a given project + */ + public boolean isActive(IJavaProject project) { + boolean isj2s = Java2ScriptCompiler.isActive(project); + System.out.println("isActive " + isj2s + " " + project.getProject().getLocation()); + return isj2s; + } + + /** + * Notifies this participant that a build is about to start and provides it + * the opportunity to create missing source folders for generated source + * files. Additional source folders should be marked as optional so the + * project can be built when the folders do not exist. Only sent to + * participants interested in the project. + *

+ * Default is to return READY_FOR_BUILD. + *

+ * + * @see #buildFinished(IJavaProject project) + * @param project + * the project about to build + * @return READY_FOR_BUILD or NEEDS_FULL_BUILD + */ + public int aboutToBuild(IJavaProject project) { + System.out.println("aboutToBuild " + project.getProject().getLocation()); + return READY_FOR_BUILD; + } + + /** + * Notifies this participant that a clean is about to start and provides it + * the opportunity to delete generated source files. Only sent to + * participants interested in the project. + * + * @param project + * the project about to be cleaned + */ + public void cleanStarting(IJavaProject project) { + System.out.println("cleanStarting " + project.getProject().getLocation()); + isCleanBuild = true; + } + + /** + * Notifies this participant that a compile operation is about to start and + * provides it the opportunity to generate source files based on the source + * files about to be compiled. When isBatchBuild is true, then files + * contains all source files in the project. Only sent to participants + * interested in the current build project. + * + * @param files + * is an array of BuildContext + * @param isBatch + * identifies when the build is a batch build + */ + public void buildStarting(BuildContext[] files, boolean isBatch) { + if (javaFiles != null) { + BuildContext[] concat = Arrays.copyOf(javaFiles, javaFiles.length + files.length); + System.arraycopy(files, 0, concat , javaFiles.length, files.length); + javaFiles = concat; + } else { + javaFiles = files; + } + System.out.println("buildStarting " + files.length + " files, isBatch=" + isBatch); + } + + /** + * Notifies this participant that a build has finished for the project. This + * will be sent, even if buildStarting() was not sent when no source files + * needed to be compiled or the build failed. Only sent to participants + * interested in the project. + * + * @param project + * the project about to build + * @since 3.4 + */ + public void buildFinished(IJavaProject project) { + if (javaFiles != null) { + Java2ScriptCompiler j2sCompiler = new Java2ScriptCompiler(); + j2sCompiler.startBuild(isCleanBuild); + if (!j2sCompiler.initializeProject(project, true)) { + System.out.println(".j2s disabled"); + return; + } + System.out.println("building JavaScript " + project.getProject().getLocation()); + for (int i = 0; i < javaFiles.length; i++) { + System.out.println("[" + (i+1) + "/" + javaFiles.length + "] transpiling " + javaFiles[i]); +// trying to keep the progess monitor running - didn't work +// try { +// Thread.currentThread().sleep(1); +// } catch (InterruptedException e) { +// // ignore +// } + if (!j2sCompiler.compileToJavaScript(javaFiles[i].getFile())) { + System.out.println("Error processing " + javaFiles[i].getFile()); + break; + } + } + javaFiles = null; + System.out.println("build finished " + project.getProject().getLocation()); + } + isCleanBuild = false; + } + + /** + * Returns whether this participant is interested in only Annotations. + *

+ * Default is to return false. + *

+ * + * @return whether this participant is interested in only Annotations. + */ + public boolean isAnnotationProcessor() { + return false; + } + + /** + * Notifies this participant that a compile operation has found source files + * using Annotations. Only sent to participants interested in the current + * build project that answer true to isAnnotationProcessor(). Each + * BuildContext was informed whether its source file currently + * hasAnnotations(). + * + * @param files + * is an array of BuildContext + */ + public void processAnnotations(BuildContext[] files) { + // nothing to do + } + + /** + * Notifies this participant that a reconcile operation is happening. The + * participant can act on this reconcile operation by using the given + * context. Other participant can then see the result of this participation + * on this context. + *

+ * Note that a participant should not modify the buffer of the working copy + * that is being reconciled. + *

+ *

+ * Default is to do nothing. + *

+ * + * @param context + * the reconcile context to act on + */ + public void reconcile(ReconcileContext context) { + // fired whenever a source file is changed -- before it is saved + } +} \ No newline at end of file