Index: src/org/jboss/tools/ws/jaxrs/core/internal/metamodel/builder/JavaElementDeltaFilter.java =================================================================== --- src/org/jboss/tools/ws/jaxrs/core/internal/metamodel/builder/JavaElementDeltaFilter.java (revision 42677) +++ src/org/jboss/tools/ws/jaxrs/core/internal/metamodel/builder/JavaElementDeltaFilter.java (working copy) @@ -37,6 +37,7 @@ import java.util.Iterator; import java.util.List; +import org.eclipse.core.resources.IResource; import org.eclipse.jdt.core.ElementChangedEvent; import org.eclipse.jdt.core.IJavaElement; import org.eclipse.jdt.core.IJavaElementDelta; @@ -122,7 +123,8 @@ int deltaKind = event.getDeltaKind(); IJavaElement element = event.getElement(); // prevent processing java elements in a closed java project - if (element.getJavaProject() != null && !element.getJavaProject().getProject().isOpen()) { + // prevent processing of any file named 'package-info.java' + if (isProjectClosed(element) || isPackageInfoFile(element)) { return false; } int flags = event.getFlags(); @@ -139,6 +141,24 @@ return match; } + /** + * Returns true if the element resource is a file named 'package-info.java' (whatever the containing folder) + * @param element + * @return + */ + private boolean isPackageInfoFile(IJavaElement element) { + return element.getResource() != null && element.getResource().getType() == IResource.FILE && element.getResource().getName().equals("package-info.java"); + } + + /** + * Returns true if the enclosing project is closed + * @param element + * @return + */ + private boolean isProjectClosed(IJavaElement element) { + return element.getJavaProject() != null && !element.getJavaProject().getProject().isOpen(); + } + protected boolean apply(int elementKind, int deltaKind, int eventType, int flags, boolean workingCopy) { Rule matcher = new Rule(elementKind, deltaKind, eventType, workingCopy ? WORKING_COPY : PRIMARY_COPY, flags); for (Iterator iterator = rules.iterator(); iterator.hasNext();) { Index: projects/org.jboss.tools.ws.jaxrs.tests.sampleproject/src/main/java/org/jboss/tools/ws/jaxrs/sample/domain/package-info.java =================================================================== --- projects/org.jboss.tools.ws.jaxrs.tests.sampleproject/src/main/java/org/jboss/tools/ws/jaxrs/sample/domain/package-info.java (revision 0) +++ projects/org.jboss.tools.ws.jaxrs.tests.sampleproject/src/main/java/org/jboss/tools/ws/jaxrs/sample/domain/package-info.java (revision 0) @@ -0,0 +1 @@ +package org.jboss.tools.ws.jaxrs.sample.domain; \ No newline at end of file Index: src/org/jboss/tools/ws/jaxrs/core/internal/metamodel/builder/JavaElementDeltaFilterTestCase.java =================================================================== --- src/org/jboss/tools/ws/jaxrs/core/internal/metamodel/builder/JavaElementDeltaFilterTestCase.java (revision 42824) +++ src/org/jboss/tools/ws/jaxrs/core/internal/metamodel/builder/JavaElementDeltaFilterTestCase.java (working copy) @@ -26,6 +26,7 @@ import static org.mockito.Mockito.mock; import static org.mockito.Mockito.when; +import org.eclipse.core.resources.IResource; import org.eclipse.jdt.core.ICompilationUnit; import org.eclipse.jdt.core.IJavaElement; import org.eclipse.jdt.core.IMethod; @@ -100,5 +101,20 @@ IJavaElement element = createMock(IMethod.class, METHOD); assertFalse("Wrong result", filter.apply(createEvent(element, CHANGED, POST_RECONCILE, NO_FLAG))); } + + @Test + public void shouldNotAcceptChangesInPackageInfoFile() { + IJavaElement element = createMock(IType.class, ANNOTATION, workingCopy); + IResource resource = mock(IResource.class); + when(element.getResource()).thenReturn(resource); + when(resource.getType()).thenReturn(IResource.FILE); + when(resource.getName()).thenReturn("package-info.java"); + assertFalse("Wrong result", filter.apply(createEvent(element, ADDED, POST_RECONCILE, NO_FLAG))); + assertFalse("Wrong result", filter.apply(createEvent(element, ADDED, POST_CHANGE, NO_FLAG))); + assertFalse("Wrong result", filter.apply(createEvent(element, CHANGED, POST_RECONCILE, NO_FLAG))); + assertFalse("Wrong result", filter.apply(createEvent(element, CHANGED, POST_CHANGE, NO_FLAG))); + assertFalse("Wrong result", filter.apply(createEvent(element, REMOVED, POST_RECONCILE, NO_FLAG))); + assertFalse("Wrong result", filter.apply(createEvent(element, REMOVED, POST_CHANGE, NO_FLAG))); + } }