Index: src/org/jboss/tools/ws/jaxrs/core/internal/metamodel/validation/JaxrsHttpMethodValidatorTestCase.java =================================================================== --- src/org/jboss/tools/ws/jaxrs/core/internal/metamodel/validation/JaxrsHttpMethodValidatorTestCase.java (revision 44469) +++ src/org/jboss/tools/ws/jaxrs/core/internal/metamodel/validation/JaxrsHttpMethodValidatorTestCase.java (working copy) @@ -42,8 +42,10 @@ import org.jboss.tools.ws.jaxrs.core.WorkbenchUtils; import org.jboss.tools.ws.jaxrs.core.builder.AbstractMetamodelBuilderTestCase; import org.jboss.tools.ws.jaxrs.core.internal.metamodel.domain.JaxrsBaseElement; +import org.jboss.tools.ws.jaxrs.core.internal.metamodel.domain.JaxrsElementFactory; import org.jboss.tools.ws.jaxrs.core.internal.metamodel.domain.JaxrsHttpMethod; import org.jboss.tools.ws.jaxrs.core.jdt.Annotation; +import org.jboss.tools.ws.jaxrs.core.jdt.JdtUtils; import org.junit.Test; /** @@ -79,6 +81,21 @@ } @Test + public void shouldSkipValidationOnBinaryHttpMethod() throws CoreException, ValidationException { + // preconditions: create an HttpMethod from the binary annotation, then try to validate + final IType getType = WorkbenchUtils.getType("javax.ws.rs.GET", javaProject); + final JaxrsHttpMethod httpMethod = new JaxrsElementFactory().createHttpMethod(getType, JdtUtils.parse(getType, null), metamodel); + metamodel.add(httpMethod); + assertThat(findJaxrsMarkers(httpMethod).length, equalTo(0)); + deleteJaxrsMarkers(httpMethod); + // operation + new JaxrsMetamodelValidator().validate(toSet(httpMethod.getResource()), project, validationHelper, context, + validatorManager, reporter); + // validation + assertThat(findJaxrsMarkers(httpMethod).length, equalTo(0)); + } + + @Test public void shouldReportProblemWhenHttpMethodVerbIsEmpty() throws CoreException, ValidationException { // preconditions final IType fooType = WorkbenchUtils.getType("org.jboss.tools.ws.jaxrs.sample.services.FOO", javaProject); Index: src/org/jboss/tools/ws/jaxrs/core/internal/metamodel/validation/JaxrsApplicationValidatorTestCase.java =================================================================== --- src/org/jboss/tools/ws/jaxrs/core/internal/metamodel/validation/JaxrsApplicationValidatorTestCase.java (revision 44332) +++ src/org/jboss/tools/ws/jaxrs/core/internal/metamodel/validation/JaxrsApplicationValidatorTestCase.java (working copy) @@ -12,6 +12,13 @@ import static org.hamcrest.Matchers.equalTo; import static org.hamcrest.Matchers.hasSize; +import static org.jboss.tools.ws.jaxrs.core.internal.metamodel.validation.MarkerUtils.deleteJaxrsMarkers; +import static org.jboss.tools.ws.jaxrs.core.internal.metamodel.validation.MarkerUtils.findJaxrsMarkers; +import static org.jboss.tools.ws.jaxrs.core.internal.metamodel.validation.MarkerUtils.hasPreferenceKey; +import static org.jboss.tools.ws.jaxrs.core.preferences.JaxrsPreferences.APPLICATION_NO_OCCURRENCE_FOUND; +import static org.jboss.tools.ws.jaxrs.core.preferences.JaxrsPreferences.APPLICATION_TOO_MANY_OCCURRENCES; +import static org.jboss.tools.ws.jaxrs.core.preferences.JaxrsPreferences.JAVA_APPLICATION_INVALID_TYPE_HIERARCHY; +import static org.jboss.tools.ws.jaxrs.core.preferences.JaxrsPreferences.JAVA_APPLICATION_MISSING_APPLICATION_PATH_ANNOTATION; import static org.junit.Assert.assertThat; import java.util.List; @@ -40,11 +47,8 @@ import org.jboss.tools.ws.jaxrs.core.jdt.JdtUtils; import org.jboss.tools.ws.jaxrs.core.metamodel.EnumElementKind; import org.jboss.tools.ws.jaxrs.core.metamodel.IJaxrsApplication; -import static org.jboss.tools.ws.jaxrs.core.preferences.JaxrsPreferences.*; import org.junit.Test; -import static org.jboss.tools.ws.jaxrs.core.internal.metamodel.validation.MarkerUtils.*; - /** * @author Xi * @@ -88,7 +92,7 @@ final IMarker[] markers = findJaxrsMarkers(project); assertThat(markers.length, equalTo(0)); } - + @Test public void shouldNotReportProblemIfOneWebxmlApplicationExists() throws CoreException, ValidationException { // preconditions 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 44558) +++ src/org/jboss/tools/ws/jaxrs/core/internal/metamodel/builder/JavaElementDeltaFilterTestCase.java (working copy) @@ -125,6 +125,7 @@ when(element.getResource()).thenReturn(resource); when(element.isArchive()).thenReturn(true); when(resource.getType()).thenReturn(IResource.FILE); + when(resource.getName()).thenReturn("somearchive.jar"); 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))); Index: src/org/jboss/tools/ws/jaxrs/core/metamodel/IJaxrsElement.java =================================================================== --- src/org/jboss/tools/ws/jaxrs/core/metamodel/IJaxrsElement.java (revision 44332) +++ src/org/jboss/tools/ws/jaxrs/core/metamodel/IJaxrsElement.java (working copy) @@ -28,6 +28,8 @@ public abstract IResource getResource(); public abstract String getName(); + + public abstract boolean isBinary(); } Index: src/org/jboss/tools/ws/jaxrs/core/internal/metamodel/validation/JaxrsJavaApplicationValidatorDelegate.java =================================================================== --- src/org/jboss/tools/ws/jaxrs/core/internal/metamodel/validation/JaxrsJavaApplicationValidatorDelegate.java (revision 44482) +++ src/org/jboss/tools/ws/jaxrs/core/internal/metamodel/validation/JaxrsJavaApplicationValidatorDelegate.java (working copy) @@ -42,8 +42,11 @@ public void validate() throws CoreException { final JaxrsJavaApplication application = getElement(); JaxrsMetamodelValidator.deleteJaxrsMarkers(application); + if(application.getJavaElement().isBinary()) { + Logger.debug("Skipping validation on binary element {}", getElement()); + return; + } Logger.debug("Validating element {}", getElement()); - final Annotation applicationPathAnnotation = application .getAnnotation(EnumJaxrsClassname.APPLICATION_PATH.qualifiedName); final IType appJavaElement = application.getJavaElement(); Index: src/org/jboss/tools/ws/jaxrs/core/internal/metamodel/validation/JaxrsMetamodelValidator.java =================================================================== --- src/org/jboss/tools/ws/jaxrs/core/internal/metamodel/validation/JaxrsMetamodelValidator.java (revision 44487) +++ src/org/jboss/tools/ws/jaxrs/core/internal/metamodel/validation/JaxrsMetamodelValidator.java (working copy) @@ -113,15 +113,13 @@ Logger.debug("*** Validating project {} after files {} changed... ***", project.getName(), changedFiles.toString()); final JaxrsMetamodel jaxrsMetamodel = JaxrsMetamodelLocator.get(project); - final Set allResources = completeValidationSet(jaxrsMetamodel, changedFiles.toArray(new IFile[changedFiles.size()])); - for (IResource changedResource : allResources) { - validate(reporter, changedResource, jaxrsMetamodel); + if(jaxrsMetamodel != null) { // prevent failure in case validation would be called at workbench startup, even before metamodel is built. + final Set allResources = completeValidationSet(jaxrsMetamodel, changedFiles.toArray(new IFile[changedFiles.size()])); + for (IResource changedResource : allResources) { + validate(reporter, changedResource, jaxrsMetamodel); + } } } - // trigger a full validation instead - else { - //validateAll(project, validationHelper, context, manager, reporter); - } } catch (CoreException e) { Logger.error("Failed to validate changed files " + changedFiles + " in project " + project, e); } finally { @@ -235,6 +233,10 @@ */ @SuppressWarnings("incomplete-switch") private void validate(IJaxrsElement element) throws CoreException { + // skip validation on binary JAX-RS elements (if metamodel contains any) + if(element.isBinary()) { + return; + } switch (element.getElementCategory()) { case METAMODEL: new JaxrsMetamodelValidatorDelegate(this, (JaxrsMetamodel)element).validate(); Index: src/org/jboss/tools/ws/jaxrs/core/internal/metamodel/validation/AbstractJaxrsElementValidatorDelegate.java =================================================================== --- src/org/jboss/tools/ws/jaxrs/core/internal/metamodel/validation/AbstractJaxrsElementValidatorDelegate.java (revision 44332) +++ src/org/jboss/tools/ws/jaxrs/core/internal/metamodel/validation/AbstractJaxrsElementValidatorDelegate.java (working copy) @@ -15,6 +15,7 @@ import org.eclipse.core.runtime.CoreException; import org.jboss.tools.common.validation.TempMarkerManager; import org.jboss.tools.ws.jaxrs.core.internal.utils.Logger; +import org.jboss.tools.ws.jaxrs.core.metamodel.IJaxrsElement; /** * Abstract validator delegate with bits of generics for better readability in subclasses @@ -22,7 +23,7 @@ * @author Xavier Coulon * */ -public abstract class AbstractJaxrsElementValidatorDelegate { +public abstract class AbstractJaxrsElementValidatorDelegate { private final T element; Index: src/org/jboss/tools/ws/jaxrs/core/internal/metamodel/domain/JaxrsMetamodel.java =================================================================== --- src/org/jboss/tools/ws/jaxrs/core/internal/metamodel/domain/JaxrsMetamodel.java (revision 44469) +++ src/org/jboss/tools/ws/jaxrs/core/internal/metamodel/domain/JaxrsMetamodel.java (working copy) @@ -120,6 +120,12 @@ } @Override + public boolean isBinary() { + // Metamodel is never binary + return false; + } + + @Override public EnumElementKind getElementKind() { return EnumElementKind.METAMODEL; } Index: src/org/jboss/tools/ws/jaxrs/core/internal/metamodel/domain/JaxrsJavaElement.java =================================================================== --- src/org/jboss/tools/ws/jaxrs/core/internal/metamodel/domain/JaxrsJavaElement.java (revision 44469) +++ src/org/jboss/tools/ws/jaxrs/core/internal/metamodel/domain/JaxrsJavaElement.java (working copy) @@ -100,6 +100,14 @@ } } + @Override + public boolean isBinary() { + if(this.javaElement == null) { + return true; + } + return this.javaElement.isBinary(); + } + public Annotation getAnnotation(String className) { return annotations.get(className); } Index: src/org/jboss/tools/ws/jaxrs/core/internal/metamodel/domain/JaxrsWebxmlApplication.java =================================================================== --- src/org/jboss/tools/ws/jaxrs/core/internal/metamodel/domain/JaxrsWebxmlApplication.java (revision 44111) +++ src/org/jboss/tools/ws/jaxrs/core/internal/metamodel/domain/JaxrsWebxmlApplication.java (working copy) @@ -3,6 +3,8 @@ import static org.jboss.tools.ws.jaxrs.core.internal.metamodel.builder.JaxrsElementDelta.F_APPLICATION_PATH_VALUE; import org.eclipse.core.resources.IResource; +import org.eclipse.jdt.core.IJavaProject; +import org.eclipse.jdt.core.IPackageFragmentRoot; import org.jboss.tools.ws.jaxrs.core.jdt.EnumJaxrsClassname; import org.jboss.tools.ws.jaxrs.core.metamodel.EnumElementCategory; import org.jboss.tools.ws.jaxrs.core.metamodel.EnumElementKind; @@ -28,6 +30,17 @@ this.javaClassName = applicationClassName; } + + @Override + public boolean isBinary() { + final IJavaProject javaProject = getMetamodel().getJavaProject(); + IPackageFragmentRoot fragment = javaProject.getPackageFragmentRoot(webxmlResource); + if(fragment != null && fragment.exists() && fragment.isArchive()) { + return true; + } + return false; + + } /** * @return true if the applicationClassName given in the constructor matches an existing Java Application in the