The eclipse plugin does not work after upgrading to juno (eclipse 4)

I created an eclipse plugin that hooks into the save action to create a miniature javascript file with the goolge close compiler. See Files below. This worked before the eclipse 3.7.2. Unfortunately, now in eclipse 4.2.1 it seems like this sometimes creates an endless loop. The job "compile.min.js" (line 64 in ResourceChangedListener.java) seems to be the reason. This causes the workpaced to start building again and again. I assume that this is due to the fact that this task creates or modifies a file that starts assembling the workspace again, which again starts a task that starts assembling, and so on. But I can’t figure out how to prevent this.

//Activator.java

package closure_compiler_save; import org.eclipse.core.resources.ResourcesPlugin; import org.eclipse.ui.plugin.AbstractUIPlugin; import org.osgi.framework.BundleContext; /** * The activator class controls the plug-in life cycle */ public class Activator extends AbstractUIPlugin { // The plug-in ID public static final String PLUGIN_ID = "closure-compiler-save"; //$NON-NLS-1$ // The shared instance private static Activator plugin; /** * The constructor */ public Activator() { } @Override public void start(BundleContext context) throws Exception { super.start(context); Activator.plugin = this; ResourceChangedListener listener = new ResourceChangedListener(); ResourcesPlugin.getWorkspace().addResourceChangeListener(listener); } @Override public void stop(BundleContext context) throws Exception { Activator.plugin = null; super.stop(context); } /** * Returns the shared instance * * @return the shared instance */ public static Activator getDefault() { return plugin; } } 

//ResourceChangedListener.java

 package closure_compiler_save; import java.io.ByteArrayInputStream; import java.io.IOException; import java.io.InputStream; import org.eclipse.core.resources.IFile; import org.eclipse.core.resources.IProject; import org.eclipse.core.resources.IResource; import org.eclipse.core.resources.IResourceChangeEvent; import org.eclipse.core.resources.IResourceChangeListener; import org.eclipse.core.resources.IResourceDelta; import org.eclipse.core.runtime.CoreException; import org.eclipse.core.runtime.IPath; import org.eclipse.core.runtime.IProgressMonitor; import org.eclipse.core.runtime.IStatus; import org.eclipse.core.runtime.Status; import org.eclipse.core.runtime.jobs.Job; public class ResourceChangedListener implements IResourceChangeListener { public void resourceChanged(IResourceChangeEvent event) { if (event.getType() != IResourceChangeEvent.POST_CHANGE) return; IResourceDelta delta = event.getDelta(); try { processDelta(delta); } catch (CoreException e) { e.printStackTrace(); } } // find out which class files were just built private void processDelta(IResourceDelta delta) throws CoreException { IResourceDelta[] kids = delta.getAffectedChildren(); for (IResourceDelta delta2 : kids) { if (delta2.getAffectedChildren().length == 0) { if (delta.getKind() != IResourceDelta.CHANGED) return; IResource res = delta2.getResource(); if (res.getType() == IResource.FILE && "js".equalsIgnoreCase(res.getFileExtension())) { if (res.getName().contains("min")) return; compile(res); } } processDelta(delta2); } } private void compile(final IResource res) throws CoreException { final IPath fullPath = res.getFullPath(); final IPath fullLocation = res.getLocation(); final String fileName = fullPath.lastSegment().toString(); final String outputFilename = fileName.substring(0, fileName.lastIndexOf(".")).concat(".min.js"); final String outputPath = fullPath.removeFirstSegments(1).removeLastSegments(1).toString(); final IProject project = res.getProject(); final IFile newFile = project.getFile(outputPath.concat("/".concat(outputFilename))); Job compileJob = new Job("Compile .min.js") { public IStatus run(IProgressMonitor monitor) { byte[] bytes = null; try { bytes = CallCompiler.compile(fullLocation.toString(), CallCompiler.SIMPLE_OPTIMIZATION).getBytes(); InputStream source = new ByteArrayInputStream(bytes); if (!newFile.exists()) { newFile.create(source, IResource.NONE, null); } else { newFile.setContents(source, IResource.NONE, null); } } catch (IOException e) { e.printStackTrace(); } catch (CoreException e) { e.printStackTrace(); } return Status.OK_STATUS; } }; compileJob.setRule(newFile.getProject()); // this will ensure that no two jobs are writing simultaneously on the same file compileJob.schedule(); } } 
+6
source share
1 answer

After setting up an empty classic environment, eclipse launched a new eclipse plug-in project and recreated all the files that it worked again. In this environment, starting debugging, I can save .js files and .min.js files are created automatically. So far, so good! But when I install the plugin in my real eclipse development environment, automatic saving does not work.

At least one more step!

Step 2: There were some files that were not included in the assembly, clearly needed as a manifest. I don’t know why they were canceled. Anyway, it looks like it's just setting up an empty eclipse 4 classic, and through my eclipse plug-in wizard my original problem has been fixed. I would still like to know what the problem was ...

+3
source

All Articles