Skip to content

Commit

Permalink
JBIDE-21977 - Unexpected JAX-RS validation error for client filters
Browse files Browse the repository at this point in the history
Added support for classes that implement the 'javax.ws.rs.container.DynamicFeature'
interface.
  • Loading branch information
xcoulon committed Mar 29, 2016
1 parent cd8be80 commit c9c1e7e
Show file tree
Hide file tree
Showing 5 changed files with 53 additions and 4 deletions.
Original file line number Diff line number Diff line change
Expand Up @@ -54,12 +54,13 @@
import static org.jboss.tools.ws.jaxrs.core.utils.JaxrsClassnames.EXCEPTION_MAPPER;
import static org.jboss.tools.ws.jaxrs.core.utils.JaxrsClassnames.MESSAGE_BODY_READER;
import static org.jboss.tools.ws.jaxrs.core.utils.JaxrsClassnames.MESSAGE_BODY_WRITER;
import static org.jboss.tools.ws.jaxrs.core.utils.JaxrsClassnames.DYNAMIC_FEATURE;
import static org.jboss.tools.ws.jaxrs.core.utils.JaxrsClassnames.PRODUCES;
import static org.jboss.tools.ws.jaxrs.core.utils.JaxrsClassnames.PROVIDER;

/**
* <p>
* JAX-RS Providers fall into 5 categories:
* JAX-RS Providers fall into the following categories:
* <ul>
* <li>Entity Providers: the class must implement
* <code>javax.ws.rs.ext.MessageBodyReader</code> and/or
Expand All @@ -72,6 +73,7 @@
* <code>javax.ws.rs.ext.ExceptionMapper</code></li>
* <li>Request/Response Filters: the class must implement <code>javax.ws.rs.container.ContainerRequestFilter</code>, <code>javax.ws.rs.container.ContainerResponseFilter</code>, <code>javax.ws.rs.client.ClientRequestFilter</code>, <code>javax.ws.rs.client.ClientResponseFilter</code></li>
* <li>Entity Interceptor: the class must implement <code>javax.ws.rs.ext.ReaderInterceptor</code> and/or <code>javax.ws.rs.ext.WriterInterceptor</code></li>
* <li>Dynamic feature: the class must implement the <code>javax.ws.rs.container.DynamicFeature</code> interface.</li>
* </ul>
* </p>
* <p>
Expand Down Expand Up @@ -101,8 +103,9 @@ public static Builder from(final IJavaElement javaElement) throws JavaModelExcep
return new Builder(((ICompilationUnit) javaElement).findPrimaryType(), ast);
case IJavaElement.TYPE:
return new Builder((IType) javaElement, ast);
default:
return null;
}
return null;
}

/**
Expand All @@ -122,8 +125,9 @@ public static Builder from(final IJavaElement javaElement, final CompilationUnit
return new Builder(((ICompilationUnit) javaElement).findPrimaryType(), ast);
case IJavaElement.TYPE:
return new Builder((IType) javaElement, ast);
default:
return null;
}
return null;
}

/**
Expand Down Expand Up @@ -152,7 +156,7 @@ public Builder withMetamodel(final JaxrsMetamodel metamodel) {

/**
* Creates a <strong>transient</strong> JAX-RS Provider from the given
* SourceType. A valid Provider must be annotated with
* SourceType. A valid Provider must be implement one of the following interfaces:
* <ul>
* <li><code>javax.ws.rs.ext.MessageBodyReader</code></li>
* <li><code>javax.ws.rs.ext.MessageBodyWriter</code></li>
Expand All @@ -163,6 +167,7 @@ public Builder withMetamodel(final JaxrsMetamodel metamodel) {
* <li><code>javax.ws.rs.client.ClientResponseFilter</code></li>
* <li><code>javax.ws.rs.ext.ReaderInterceptor</code></li>
* <li><code>javax.ws.rs.ext.WriterInterceptor</code></li>
* <li><code>javax.ws.rs.container.DynamicFeature</code></li>
* </ul>
*
* @param javaType
Expand Down Expand Up @@ -247,6 +252,7 @@ private static Map<EnumElementKind, IType> getProvidedKinds(final IType provider
providerInterfaces.put(CLIENT_RESPONSE_FILTER, EnumElementKind.CLIENT_RESPONSE_FILTER);
providerInterfaces.put(ENTITY_READER_INTERCEPTOR, EnumElementKind.ENTITY_READER_INTERCEPTOR);
providerInterfaces.put(ENTITY_WRITER_INTERCEPTOR, EnumElementKind.ENTITY_WRITER_INTERCEPTOR);
providerInterfaces.put(DYNAMIC_FEATURE, EnumElementKind.DYNAMIC_FEATURE);

final List<IType> providerTypeSuperInterfaces = Arrays.asList(providerTypeHierarchy.getAllSuperInterfaces(providerType));
for (Entry<String, EnumElementKind> entry : providerInterfaces.entrySet()) {
Expand Down Expand Up @@ -337,6 +343,7 @@ public EnumElementKind getElementKind() {
final boolean isContainerResponseFilter = providedTypes.containsKey(EnumElementKind.CONTAINER_RESPONSE_FILTER);
final boolean isEntityReaderInterceptor = providedTypes.containsKey(EnumElementKind.ENTITY_READER_INTERCEPTOR);
final boolean isEntityWriterInterceptor = providedTypes.containsKey(EnumElementKind.ENTITY_WRITER_INTERCEPTOR);
final boolean isDynamicFeature = providedTypes.containsKey(EnumElementKind.DYNAMIC_FEATURE);
if (isMessageBodyReader && isMessageBodyWriter) {
return EnumElementKind.ENTITY_MAPPER;
} else if (isMessageBodyReader) {
Expand All @@ -359,6 +366,8 @@ public EnumElementKind getElementKind() {
return EnumElementKind.ENTITY_READER_INTERCEPTOR;
} else if (isEntityWriterInterceptor) {
return EnumElementKind.ENTITY_WRITER_INTERCEPTOR;
} else if (isDynamicFeature) {
return EnumElementKind.DYNAMIC_FEATURE;
}
return EnumElementKind.UNDEFINED_PROVIDER;
}
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -50,6 +50,8 @@ public enum EnumElementKind {
ENTITY_WRITER_INTERCEPTOR(EnumElementCategory.PROVIDER),
/** An Entity Interceptor (ie, both EntityReaderInterceptor and EntityWriterInterceptor).*/
ENTITY_INTERCEPTOR(EnumElementCategory.PROVIDER),
/** An Dynamic binding feature.*/
DYNAMIC_FEATURE(EnumElementCategory.PROVIDER),
/** An Interceptor/Filter Name Binding Annotation.*/
NAME_BINDING(EnumElementCategory.NAME_BINDING),
/** Undefined Provider. */
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -61,6 +61,8 @@ public interface JaxrsClassnames {

public static final String ENTITY_WRITER_INTERCEPTOR = "javax.ws.rs.ext.WriterInterceptor";

public static final String DYNAMIC_FEATURE = "javax.ws.rs.container.DynamicFeature";

public static final String NAME_BINDING = "javax.ws.rs.NameBinding";

public static final String PRE_MATCHING = "javax.ws.rs.container.PreMatching";
Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1,15 @@
package org.jboss.tools.ws.jaxrs.sample.services.interceptors;

import javax.ws.rs.container.DynamicFeature;
import javax.ws.rs.container.ResourceInfo;
import javax.ws.rs.core.FeatureContext;
import javax.ws.rs.ext.Provider;

@Provider
public class CustomDynamicFeature implements DynamicFeature {

@Override
public void configure(ResourceInfo info, FeatureContext context) {

}
}
Original file line number Diff line number Diff line change
Expand Up @@ -377,5 +377,26 @@ public void shouldNotReportProblemOnClientResponseFilter() throws ValidationExce
}
assertThat(markers.length, equalTo(0));
}

@Test
// @see https://issues.jboss.org/browse/JBIDE-21977
public void shouldNotReportProblemOnDynamicFeature() throws ValidationException, CoreException {
final ICompilationUnit clientFilterCompilationUnit = metamodelMonitor.createCompilationUnit("CustomDynamicFeature.txt",
"org.jboss.tools.ws.jaxrs.sample.services.interceptors", "CustomDynamicFeature.java");
metamodelMonitor.createElements("org.jboss.tools.ws.jaxrs.sample.services.interceptors.CustomDynamicFeature");
final IJaxrsProvider clientFilter = metamodel.findProvider(clientFilterCompilationUnit.findPrimaryType());
metamodelMonitor.resetElementChangesNotifications();

// operation: validate
new JaxrsMetamodelValidator().validate(toSet(clientFilter.getResource()), project, validationHelper, context,
validatorManager, reporter);

// verifications
final IMarker[] markers = findJaxrsMarkers(clientFilter);
for(IMarker marker : markers) {
TestLogger.debug(" Unexpected marker: {}", marker.getAttribute(IMarker.MESSAGE));
}
assertThat(markers.length, equalTo(0));
}

}

0 comments on commit c9c1e7e

Please sign in to comment.