/** * */ package org.objectstyle.wolips.wodclipse.core.completion; import org.eclipse.core.resources.IFile; 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.resources.IResourceDeltaVisitor; import org.eclipse.core.runtime.CoreException; import org.eclipse.core.runtime.IPath; import org.eclipse.jdt.core.ICompilationUnit; import org.eclipse.jdt.core.IJavaElement; import org.eclipse.jdt.core.IJavaProject; import org.eclipse.jdt.core.IType; import org.eclipse.jdt.core.JavaCore; import org.eclipse.jdt.core.JavaModelException; import org.eclipse.swt.widgets.Display; import org.objectstyle.wolips.bindings.Activator; public class WodParserCacheInvalidator implements IResourceChangeListener, IResourceDeltaVisitor { public void resourceChanged(IResourceChangeEvent event) { IResourceDelta delta = event.getDelta(); if (delta != null) { try { delta.accept(this); } catch (CoreException e) { Activator.getDefault().log(e); } } } public boolean visit(IResourceDelta delta) { IResource resource = delta.getResource(); if (resource.isDerived()) { return false; } else if (resource instanceof IFile) { IFile file = (IFile) resource; String name = file.getName().toLowerCase(); if (name.endsWith(".java")) { if (delta.getKind() == IResourceDelta.ADDED) { // IGNORE } else if (delta.getKind() == IResourceDelta.REMOVED) { WodParserCache.getTypeCache().clearCacheForResource(resource); } else if (delta.getKind() == IResourceDelta.CHANGED) { IJavaElement javaElement = JavaCore.create(file); if (javaElement instanceof ICompilationUnit) { try { IJavaProject javaProject = javaElement.getJavaProject(); if (javaProject != null && javaProject.isOnClasspath(javaElement)) { IType[] types = ((ICompilationUnit) javaElement).getAllTypes(); for (IType type : types) { WodParserCache.getTypeCache().clearCacheForType(type); } } } catch (JavaModelException e) { //e.printStackTrace(System.out); Activator.getDefault().log("Failed to clear caches for " + resource + ".", e); } } } } else if (name.endsWith(".api")) { IJavaProject javaProject = JavaCore.create(file.getProject()); if (javaProject != null) { String elementName = file.getName().substring(0, file.getName().lastIndexOf('.')); WodParserCache.getTypeCache().getApiCache(javaProject).clearCacheForElementNamed(elementName); } } else if (file.getParent() != null && file.getParent().getName().endsWith(".eomodeld")) { if (delta.getKind() == IResourceDelta.ADDED) { WodParserCache.getModelGroupCache().clearCacheForProject(file.getProject()); } else if (delta.getKind() == IResourceDelta.REMOVED) { WodParserCache.getModelGroupCache().clearCacheForProject(file.getProject()); } else if (delta.getKind() == IResourceDelta.CHANGED && ((delta.getFlags() & IResourceDelta.CONTENT) != 0)) { WodParserCache.getModelGroupCache().clearCacheForProject(file.getProject()); } } else if (file.getParent() != null && file.getParent().getName().endsWith(".wo")) { if (delta.getKind() == IResourceDelta.ADDED) { String newComponent = file.getParent().getFullPath().removeFileExtension().lastSegment(); final IFile oldFile = file; final IPath newPath = file.getParent().getFullPath().append(newComponent).addFileExtension(file.getFileExtension()); if (file.getFileExtension().matches("(xml|html|xhtml|wod|woo)") && !file.getFullPath().equals(newPath) && !newPath.toFile().exists()) { Display.getDefault().asyncExec(new Runnable() { public void run() { try { // one last check before it throws an exception ... if (!newPath.toFile().exists()) { oldFile.move(newPath, false, null); } } catch (CoreException e) { e.printStackTrace(); } } }); } WodParserCache.invalidateResource(file.getParent()); } else if (delta.getKind() == IResourceDelta.REMOVED) { WodParserCache.invalidateResource(file.getParent()); } else if (delta.getKind() == IResourceDelta.CHANGED && ((delta.getFlags() & IResourceDelta.ENCODING) != 0)) { WodParserCache.invalidateResource(file.getParent()); } } } return true; } }