JAL-3210 changed classes for net.sf.j2s.core
[jalview.git] / utils / jalviewjs / Java2ScriptCompilationParticipant.java
diff --git a/utils/jalviewjs/Java2ScriptCompilationParticipant.java b/utils/jalviewjs/Java2ScriptCompilationParticipant.java
new file mode 100644 (file)
index 0000000..9c7aeb9
--- /dev/null
@@ -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.
+        * <p>
+        * Default is to return <code>false</code>.
+        * </p>
+        * <p>
+        * For efficiency, participants that are not interested in the given project
+        * should return <code>false</code> for that project.
+        * </p>
+        * 
+        * @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.
+        * <p>
+        * Default is to return <code>READY_FOR_BUILD</code>.
+        * </p>
+        * 
+        * @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.
+        * <p>
+        * Default is to return <code>false</code>.
+        * </p>
+        * 
+        * @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.
+        * <p>
+        * Note that a participant should not modify the buffer of the working copy
+        * that is being reconciled.
+        * </p>
+        * <p>
+        * Default is to do nothing.
+        * </p>
+        * 
+        * @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