MP rest client review comments implemented Signed-off-by: David Kral <david.k.kral@oracle.com>
diff --git a/bom/pom.xml b/bom/pom.xml index f8ed3cc..5b02437 100644 --- a/bom/pom.xml +++ b/bom/pom.xml
@@ -249,7 +249,7 @@ <version>${project.version}</version> </dependency> <dependency> - <groupId>org.glassfish.jersey.ext</groupId> + <groupId>org.glassfish.jersey.ext.microprofile</groupId> <artifactId>jersey-mp-rest-client</artifactId> <version>${project.version}</version> </dependency>
diff --git a/core-client/src/main/java/org/glassfish/jersey/client/JerseyWebTarget.java b/core-client/src/main/java/org/glassfish/jersey/client/JerseyWebTarget.java index 26df84f..c7d54be 100644 --- a/core-client/src/main/java/org/glassfish/jersey/client/JerseyWebTarget.java +++ b/core-client/src/main/java/org/glassfish/jersey/client/JerseyWebTarget.java
@@ -1,5 +1,5 @@ /* - * Copyright (c) 2012, 2019 Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2012, 2018 Oracle and/or its affiliates. All rights reserved. * * This program and the accompanying materials are made available under the * terms of the Eclipse Public License v. 2.0, which is available at @@ -26,7 +26,6 @@ import javax.ws.rs.core.UriBuilder; import org.glassfish.jersey.internal.guava.Preconditions; -import org.glassfish.jersey.internal.inject.InjectionManager; /** * Jersey implementation of {@link javax.ws.rs.client.WebTarget JAX-RS client target}
diff --git a/ext/microprofile/mp-rest-client/pom.xml b/ext/microprofile/mp-rest-client/pom.xml index dc47382..2fc179e 100644 --- a/ext/microprofile/mp-rest-client/pom.xml +++ b/ext/microprofile/mp-rest-client/pom.xml
@@ -20,8 +20,8 @@ xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd"> <parent> - <artifactId>jersey-microprofile</artifactId> - <groupId>org.glassfish.jersey.ext</groupId> + <artifactId>project</artifactId> + <groupId>org.glassfish.jersey.ext.microprofile</groupId> <version>2.29-SNAPSHOT</version> </parent> <modelVersion>4.0.0</modelVersion> @@ -60,9 +60,14 @@ <version>${project.version}</version> </dependency> <dependency> + <groupId>org.glassfish.jersey.ext.cdi</groupId> + <artifactId>jersey-cdi1x</artifactId> + <version>${project.version}</version> + </dependency> + <dependency> <groupId>jakarta.json</groupId> <artifactId>jakarta.json-api</artifactId> - <version>1.1.5</version> + <version>${jsonp.ri.version}</version> </dependency> <dependency> <groupId>javax.enterprise</groupId> @@ -73,107 +78,10 @@ <groupId>org.glassfish</groupId> <artifactId>jsonp-jaxrs</artifactId> </dependency> - <dependency> - <groupId>org.jboss.weld.se</groupId> - <artifactId>weld-se-core</artifactId> - <version>3.0.3.Final</version> - <scope>test</scope> - </dependency> - <dependency> - <groupId>org.glassfish.jersey.test-framework</groupId> - <artifactId>jersey-test-framework-core</artifactId> - <version>${project.version}</version> - <scope>test</scope> - </dependency> - <dependency> - <groupId>org.glassfish.jersey.test-framework.providers</groupId> - <artifactId>jersey-test-framework-provider-bundle</artifactId> - <version>${project.version}</version> - <type>pom</type> - <scope>test</scope> - </dependency> - <dependency> - <groupId>io.smallrye</groupId> - <artifactId>smallrye-config</artifactId> - <version>1.3.6</version> - <scope>test</scope> - </dependency> - <dependency> - <groupId>org.eclipse.microprofile.rest.client</groupId> - <artifactId>microprofile-rest-client-tck</artifactId> - <version>1.2.1</version> - <scope>test</scope> - </dependency> - <dependency> - <groupId>org.testng</groupId> - <artifactId>testng</artifactId> - <scope>test</scope> - </dependency> - <dependency> - <groupId>com.github.tomakehurst</groupId> - <artifactId>wiremock</artifactId> - <version>2.21.0</version> - <scope>test</scope> - </dependency> - <dependency> - <groupId>org.jboss.arquillian.testng</groupId> - <artifactId>arquillian-testng-container</artifactId> - <version>1.4.1.Final</version> - <scope>test</scope> - </dependency> - <dependency> - <groupId>org.jboss.arquillian.container</groupId> - <artifactId>arquillian-container-test-spi</artifactId> - <version>1.4.1.Final</version> - <scope>test</scope> - </dependency> - <dependency> - <groupId>org.jboss.arquillian.container</groupId> - <artifactId>arquillian-weld-embedded</artifactId> - <version>2.0.1.Final</version> - <scope>test</scope> - </dependency> - <dependency> - <groupId>io.opentracing</groupId> - <artifactId>opentracing-noop</artifactId> - <version>0.30.0</version> - <scope>test</scope> - </dependency> </dependencies> <build> - <plugins> - <plugin> - <groupId>org.apache.maven.plugins</groupId> - <artifactId>maven-surefire-plugin</artifactId> - <configuration> - <!--<parallel>classes</parallel> - <perCoreThreadCount>true</perCoreThreadCount> - <threadCount>1</threadCount> - <forkCount>1C</forkCount> - <reuseForks>true</reuseForks>--> - <suiteXmlFiles> - <suiteXmlFile>tck-suite.xml</suiteXmlFile> - </suiteXmlFiles> - </configuration> - </plugin> - <plugin> - <groupId>uk.co.deliverymind</groupId> - <artifactId>wiremock-maven-plugin</artifactId> - <version>2.7.0</version> - <executions> - <execution> - <phase>test-compile</phase> - <goals> - <goal>run</goal> - </goals> - <configuration> - <dir>target/classes</dir> - <params>--port=8765 --verbose</params> - </configuration> - </execution> - </executions> - </plugin> + <plugins> <plugin> <groupId>org.apache.felix</groupId> <artifactId>maven-bundle-plugin</artifactId> @@ -194,9 +102,4 @@ </plugins> </build> -<!-- <properties>--> -<!-- <surefire.security.argline>-Djava.security.manager -Djava.security.policy=${project.build.directory}/test-classes/server.policy</surefire.security.argline>--> -<!-- </properties>--> - - </project> \ No newline at end of file
diff --git a/ext/microprofile/mp-rest-client/src/main/java/org/glassfish/jersey/microprofile/restclient/BeanClassModel.java b/ext/microprofile/mp-rest-client/src/main/java/org/glassfish/jersey/microprofile/restclient/BeanClassModel.java index d5c4d74..a074469 100644 --- a/ext/microprofile/mp-rest-client/src/main/java/org/glassfish/jersey/microprofile/restclient/BeanClassModel.java +++ b/ext/microprofile/mp-rest-client/src/main/java/org/glassfish/jersey/microprofile/restclient/BeanClassModel.java
@@ -52,16 +52,11 @@ * Create new instance of bean annotated parameter. * * @param interfaceModel rest client interface model - * @param beanClass bean annotated parameter class + * @param beanClass bean annotated parameter class * @return new instance */ static BeanClassModel fromClass(InterfaceModel interfaceModel, Class<?> beanClass) { return new Builder(interfaceModel, beanClass) - .processPathFields() - .processHeaderFields() - .processCookieFields() - .processQueryFields() - .processMatrixFields() .build(); } @@ -83,7 +78,7 @@ * Resolves bean path parameters. * * @param webTarget web target path - * @param instance actual method parameter value + * @param instance actual method parameter value * @return updated web target path */ @SuppressWarnings("unchecked") @@ -103,7 +98,7 @@ /** * Resolves bean header parameters. * - * @param headers headers + * @param headers headers * @param instance actual method parameter value * @return updated headers */ @@ -124,7 +119,7 @@ /** * Resolves bean cookie parameters. * - * @param cookies cookies + * @param cookies cookies * @param instance actual method parameter value * @return updated cookies */ @@ -145,13 +140,13 @@ /** * Resolves bean query parameters. * - * @param query queries + * @param query queries * @param instance actual method parameter value * @return updated queries */ @SuppressWarnings("unchecked") Map<String, Object[]> resolveQuery(Map<String, Object[]> query, - Object instance) { + Object instance) { parameterModels.stream() .filter(paramModel -> paramModel.handles(QueryParam.class)) .forEach(parameterModel -> { @@ -167,12 +162,12 @@ * Resolves bean matrix parameters. * * @param webTarget web target path - * @param instance actual method parameter value + * @param instance actual method parameter value * @return updated web target path */ @SuppressWarnings("unchecked") WebTarget resolveMatrix(WebTarget webTarget, - Object instance) { + Object instance) { AtomicReference<WebTarget> toReturn = new AtomicReference<>(webTarget); parameterModels.stream() .filter(paramModel -> paramModel.handles(MatrixParam.class)) @@ -185,17 +180,16 @@ return toReturn.get(); } - /** * Resolves bean form parameters. * - * @param form web form + * @param form web form * @param instance actual method parameter value * @return updated web form */ @SuppressWarnings("unchecked") Form resolveForm(Form form, - Object instance) { + Object instance) { parameterModels.stream() .filter(paramModel -> paramModel.handles(FormParam.class)) .forEach(parameterModel -> { @@ -235,52 +229,27 @@ this.beanClass = beanClass; } - /** - * Parses all {@link PathParam} annotated fields from bean class. - * - * @return updated builder instance - */ - Builder processPathFields() { - return processFieldsByParameterClass(PathParam.class); + private void processPathFields() { + processFieldsByParameterClass(PathParam.class); } - /** - * Parses all {@link HeaderParam} annotated fields from bean class. - * - * @return updated builder instance - */ - Builder processHeaderFields() { - return processFieldsByParameterClass(HeaderParam.class); + private void processHeaderFields() { + processFieldsByParameterClass(HeaderParam.class); } - /** - * Parses all {@link CookieParam} annotated fields from bean class. - * - * @return updated builder instance - */ - Builder processCookieFields() { - return processFieldsByParameterClass(CookieParam.class); + private void processCookieFields() { + processFieldsByParameterClass(CookieParam.class); } - /** - * Parses all {@link QueryParam} annotated fields from bean class. - * - * @return updated builder instance - */ - Builder processQueryFields() { - return processFieldsByParameterClass(QueryParam.class); + private void processQueryFields() { + processFieldsByParameterClass(QueryParam.class); } - /** - * Parses all {@link MatrixParam} annotated fields from bean class. - * - * @return updated builder instance - */ - Builder processMatrixFields() { - return processFieldsByParameterClass(MatrixParam.class); + private void processMatrixFields() { + processFieldsByParameterClass(MatrixParam.class); } - private Builder processFieldsByParameterClass(Class<? extends Annotation> parameterClass) { + private void processFieldsByParameterClass(Class<? extends Annotation> parameterClass) { for (Field field : beanClass.getDeclaredFields()) { if (field.isAnnotationPresent(parameterClass)) { Parameter parameter = Parameter.create(parameterClass, parameterClass, false, @@ -290,7 +259,6 @@ parameter, -1)); } } - return this; } /** @@ -299,6 +267,11 @@ * @return new instance */ BeanClassModel build() { + processPathFields(); + processHeaderFields(); + processCookieFields(); + processQueryFields(); + processMatrixFields(); return new BeanClassModel(this); } }
diff --git a/ext/microprofile/mp-rest-client/src/main/java/org/glassfish/jersey/microprofile/restclient/BeanParamModel.java b/ext/microprofile/mp-rest-client/src/main/java/org/glassfish/jersey/microprofile/restclient/BeanParamModel.java index 348382e..edd8253 100644 --- a/ext/microprofile/mp-rest-client/src/main/java/org/glassfish/jersey/microprofile/restclient/BeanParamModel.java +++ b/ext/microprofile/mp-rest-client/src/main/java/org/glassfish/jersey/microprofile/restclient/BeanParamModel.java
@@ -17,6 +17,7 @@ package org.glassfish.jersey.microprofile.restclient; import java.lang.annotation.Annotation; +import java.util.IdentityHashMap; import java.util.List; import java.util.Map; import java.util.stream.Collectors; @@ -39,6 +40,26 @@ */ class BeanParamModel extends ParamModel<Object> { + private static final Map<Class<?>, ParamHandler> PARAM_HANDLERS = new IdentityHashMap<>(); + + static { + PARAM_HANDLERS.put(PathParam.class, + (model, requestPart, instance) -> model.resolvePath((WebTarget) requestPart, instance)); + PARAM_HANDLERS.put(HeaderParam.class, + (model, requestPart, instance) -> model.resolveHeaders((MultivaluedMap<String, Object>) requestPart, + instance)); + PARAM_HANDLERS.put(CookieParam.class, + (model, requestPart, instance) -> model.resolveCookies((Map<String, String>) requestPart, instance)); + PARAM_HANDLERS.put(QueryParam.class, + (model, requestPart, instance) -> model.resolveQuery((Map<String, Object[]>) requestPart, + instance)); + PARAM_HANDLERS.put(MatrixParam.class, + (model, requestPart, instance) -> model.resolveMatrix((WebTarget) requestPart, instance)); + PARAM_HANDLERS.put(FormParam.class, + (model, requestPart, instance) -> model.resolveForm((Form) requestPart, + instance)); + } + private BeanClassModel beanClassModel; BeanParamModel(Builder builder) { @@ -48,30 +69,18 @@ @Override public Object handleParameter(Object requestPart, Class<?> annotationClass, Object instance) { - if (PathParam.class.equals(annotationClass)) { - return beanClassModel.resolvePath((WebTarget) requestPart, instance); - } else if (HeaderParam.class.equals(annotationClass)) { - return beanClassModel.resolveHeaders((MultivaluedMap<String, Object>) requestPart, instance); - } else if (CookieParam.class.equals(annotationClass)) { - return beanClassModel.resolveCookies((Map<String, String>) requestPart, instance); - } else if (QueryParam.class.equals(annotationClass)) { - return beanClassModel.resolveQuery((Map<String, Object[]>) requestPart, instance); - } else if (MatrixParam.class.equals(annotationClass)) { - return beanClassModel.resolveMatrix((WebTarget) requestPart, instance); - } else if (FormParam.class.equals(annotationClass)) { - return beanClassModel.resolveForm((Form) requestPart, instance); + ParamHandler handler = PARAM_HANDLERS.get(annotationClass); + + if (null == handler) { + throw new UnsupportedOperationException(annotationClass.getName() + " is not supported!"); } - throw new UnsupportedOperationException(annotationClass.getName() + " is not supported!"); + + return handler.handle(beanClassModel, requestPart, instance); } @Override public boolean handles(Class<Annotation> annotation) { - return PathParam.class.equals(annotation) - || HeaderParam.class.equals(annotation) - || CookieParam.class.equals(annotation) - || QueryParam.class.equals(annotation) - || MatrixParam.class.equals(annotation) - || FormParam.class.equals(annotation); + return PARAM_HANDLERS.containsKey(annotation); } /**
diff --git a/ext/microprofile/mp-rest-client/src/main/java/org/glassfish/jersey/microprofile/restclient/ConfigWrapper.java b/ext/microprofile/mp-rest-client/src/main/java/org/glassfish/jersey/microprofile/restclient/ConfigWrapper.java index 466ab38..fec7869 100644 --- a/ext/microprofile/mp-rest-client/src/main/java/org/glassfish/jersey/microprofile/restclient/ConfigWrapper.java +++ b/ext/microprofile/mp-rest-client/src/main/java/org/glassfish/jersey/microprofile/restclient/ConfigWrapper.java
@@ -1,3 +1,19 @@ +/* + * Copyright (c) 2019 Oracle and/or its affiliates. All rights reserved. + * + * This program and the accompanying materials are made available under the + * terms of the Eclipse Public License v. 2.0, which is available at + * http://www.eclipse.org/legal/epl-2.0. + * + * This Source Code may also be made available under the following Secondary + * Licenses when the conditions for such availability set forth in the + * Eclipse Public License v. 2.0 are satisfied: GNU General Public License, + * version 2 with the GNU Classpath Exception, which is available at + * https://www.gnu.org/software/classpath/license.html. + * + * SPDX-License-Identifier: EPL-2.0 OR GPL-2.0 WITH Classpath-exception-2.0 + */ + package org.glassfish.jersey.microprofile.restclient; import java.util.Collection; @@ -75,7 +91,9 @@ @Override public Map<Class<?>, Integer> getContracts(Class<?> componentClass) { Map<Class<?>, Integer> map = new HashMap<>(jerseyBuilderConfig.getContracts(componentClass)); - if (customProviders.containsKey(componentClass)) map.putAll(customProviders.get(componentClass)); + if (customProviders.containsKey(componentClass)) { + map.putAll(customProviders.get(componentClass)); + } return map; }
diff --git a/ext/microprofile/mp-rest-client/src/main/java/org/glassfish/jersey/microprofile/restclient/CookieParamModel.java b/ext/microprofile/mp-rest-client/src/main/java/org/glassfish/jersey/microprofile/restclient/CookieParamModel.java index 9477c34..7daf367 100644 --- a/ext/microprofile/mp-rest-client/src/main/java/org/glassfish/jersey/microprofile/restclient/CookieParamModel.java +++ b/ext/microprofile/mp-rest-client/src/main/java/org/glassfish/jersey/microprofile/restclient/CookieParamModel.java
@@ -30,10 +30,10 @@ private final String cookieParamName; - CookieParamModel(Builder builder) { + CookieParamModel(Builder builder, CookieParam annotation) { super(builder); - cookieParamName = builder.cookieParamName(); - } + cookieParamName = annotation.value(); +} @Override Map<String, String> handleParameter(Map<String, String> requestPart, Class<?> annotationClass, Object instance) {
diff --git a/ext/microprofile/mp-rest-client/src/main/java/org/glassfish/jersey/microprofile/restclient/DefaultResponseExceptionMapper.java b/ext/microprofile/mp-rest-client/src/main/java/org/glassfish/jersey/microprofile/restclient/DefaultResponseExceptionMapper.java index b699182..1099040 100644 --- a/ext/microprofile/mp-rest-client/src/main/java/org/glassfish/jersey/microprofile/restclient/DefaultResponseExceptionMapper.java +++ b/ext/microprofile/mp-rest-client/src/main/java/org/glassfish/jersey/microprofile/restclient/DefaultResponseExceptionMapper.java
@@ -26,7 +26,7 @@ * * @author David Kral */ -public class DefaultResponseExceptionMapper implements ResponseExceptionMapper { +class DefaultResponseExceptionMapper implements ResponseExceptionMapper { @Override public Throwable toThrowable(Response response) { return new WebApplicationException("Unknown error, status code " + response.getStatus(), response);
diff --git a/ext/microprofile/mp-rest-client/src/main/java/org/glassfish/jersey/microprofile/restclient/ExecutorServiceWrapper.java b/ext/microprofile/mp-rest-client/src/main/java/org/glassfish/jersey/microprofile/restclient/ExecutorServiceWrapper.java index c3a8dd6..54599e8 100644 --- a/ext/microprofile/mp-rest-client/src/main/java/org/glassfish/jersey/microprofile/restclient/ExecutorServiceWrapper.java +++ b/ext/microprofile/mp-rest-client/src/main/java/org/glassfish/jersey/microprofile/restclient/ExecutorServiceWrapper.java
@@ -1,3 +1,19 @@ +/* + * Copyright (c) 2019 Oracle and/or its affiliates. All rights reserved. + * + * This program and the accompanying materials are made available under the + * terms of the Eclipse Public License v. 2.0, which is available at + * http://www.eclipse.org/legal/epl-2.0. + * + * This Source Code may also be made available under the following Secondary + * Licenses when the conditions for such availability set forth in the + * Eclipse Public License v. 2.0 are satisfied: GNU General Public License, + * version 2 with the GNU Classpath Exception, which is available at + * https://www.gnu.org/software/classpath/license.html. + * + * SPDX-License-Identifier: EPL-2.0 OR GPL-2.0 WITH Classpath-exception-2.0 + */ + package org.glassfish.jersey.microprofile.restclient; import java.util.Collection;
diff --git a/ext/microprofile/mp-rest-client/src/main/java/org/glassfish/jersey/microprofile/restclient/FormParamModel.java b/ext/microprofile/mp-rest-client/src/main/java/org/glassfish/jersey/microprofile/restclient/FormParamModel.java index 7a8f738..46ed76e 100644 --- a/ext/microprofile/mp-rest-client/src/main/java/org/glassfish/jersey/microprofile/restclient/FormParamModel.java +++ b/ext/microprofile/mp-rest-client/src/main/java/org/glassfish/jersey/microprofile/restclient/FormParamModel.java
@@ -31,9 +31,9 @@ private final String formParamName; - FormParamModel(Builder builder) { + FormParamModel(Builder builder, FormParam annotation) { super(builder); - formParamName = builder.formParamName(); + formParamName = annotation.value(); } @Override
diff --git a/ext/microprofile/mp-rest-client/src/main/java/org/glassfish/jersey/microprofile/restclient/HeaderParamModel.java b/ext/microprofile/mp-rest-client/src/main/java/org/glassfish/jersey/microprofile/restclient/HeaderParamModel.java index 3417ada..17d53c4 100644 --- a/ext/microprofile/mp-rest-client/src/main/java/org/glassfish/jersey/microprofile/restclient/HeaderParamModel.java +++ b/ext/microprofile/mp-rest-client/src/main/java/org/glassfish/jersey/microprofile/restclient/HeaderParamModel.java
@@ -31,9 +31,9 @@ private String headerParamName; - HeaderParamModel(Builder builder) { + HeaderParamModel(Builder builder, HeaderParam annotation) { super(builder); - this.headerParamName = builder.headerParamName(); + this.headerParamName = annotation.value(); } @Override
diff --git a/ext/microprofile/mp-rest-client/src/main/java/org/glassfish/jersey/microprofile/restclient/HeadersContext.java b/ext/microprofile/mp-rest-client/src/main/java/org/glassfish/jersey/microprofile/restclient/HeadersContext.java index 77bcffe..8de244e 100644 --- a/ext/microprofile/mp-rest-client/src/main/java/org/glassfish/jersey/microprofile/restclient/HeadersContext.java +++ b/ext/microprofile/mp-rest-client/src/main/java/org/glassfish/jersey/microprofile/restclient/HeadersContext.java
@@ -25,7 +25,7 @@ * * @author David Kral */ -public final class HeadersContext { +final class HeadersContext { /** * Headers context thread local, used by internal implementations of header filters. @@ -38,7 +38,7 @@ * The instance associated with the current thread. * @return context for current thread or {@code empty} if none associated */ - public static Optional<HeadersContext> get() { + static Optional<HeadersContext> get() { return Optional.ofNullable(HEADERS_CONTEXT.get()); } @@ -49,7 +49,7 @@ * @param contextSupplier supplier for header context to be associated with the thread if none is * @return an instance associated with the current context, either from other provider, or from contextSupplier */ - public static HeadersContext compute(Supplier<HeadersContext> contextSupplier) { + static HeadersContext compute(Supplier<HeadersContext> contextSupplier) { HeadersContext headersContext = HEADERS_CONTEXT.get(); if (null == headersContext) { set(contextSupplier.get()); @@ -63,14 +63,14 @@ * * @param context context to associate */ - public static void set(HeadersContext context) { + static void set(HeadersContext context) { HEADERS_CONTEXT.set(context); } /** * Remove the header context associated with current thread. */ - public static void remove() { + static void remove() { HEADERS_CONTEXT.remove(); } @@ -81,11 +81,11 @@ * @return a new header context (not associated with current thread) * @see #set(HeadersContext) */ - public static HeadersContext create(MultivaluedMap<String, String> inboundHeaders) { + static HeadersContext create(MultivaluedMap<String, String> inboundHeaders) { return new HeadersContext(inboundHeaders); } - public HeadersContext(MultivaluedMap<String, String> inboundHeaders) { + private HeadersContext(MultivaluedMap<String, String> inboundHeaders) { this.inboundHeaders = inboundHeaders; } @@ -95,7 +95,7 @@ * * @return map of inbound headers */ - public MultivaluedMap<String, String> inboundHeaders() { + MultivaluedMap<String, String> inboundHeaders() { return inboundHeaders; }
diff --git a/ext/microprofile/mp-rest-client/src/main/java/org/glassfish/jersey/microprofile/restclient/HeadersRequestFilter.java b/ext/microprofile/mp-rest-client/src/main/java/org/glassfish/jersey/microprofile/restclient/HeadersRequestFilter.java index 64ece19..28e284a 100644 --- a/ext/microprofile/mp-rest-client/src/main/java/org/glassfish/jersey/microprofile/restclient/HeadersRequestFilter.java +++ b/ext/microprofile/mp-rest-client/src/main/java/org/glassfish/jersey/microprofile/restclient/HeadersRequestFilter.java
@@ -16,10 +16,14 @@ package org.glassfish.jersey.microprofile.restclient; +import java.io.IOException; + import javax.ws.rs.ConstrainedTo; import javax.ws.rs.RuntimeType; import javax.ws.rs.container.ContainerRequestContext; import javax.ws.rs.container.ContainerRequestFilter; +import javax.ws.rs.container.ContainerResponseContext; +import javax.ws.rs.container.ContainerResponseFilter; /** * Server side request filter used for propagation of request headers to server client request. @@ -27,11 +31,15 @@ * @author David Kral */ @ConstrainedTo(RuntimeType.SERVER) -public class HeadersRequestFilter implements ContainerRequestFilter { +public class HeadersRequestFilter implements ContainerRequestFilter, ContainerResponseFilter { @Override public void filter(ContainerRequestContext requestContext) { HeadersContext.compute(() -> HeadersContext.create(requestContext.getHeaders())); } + @Override + public void filter(ContainerRequestContext requestContext, ContainerResponseContext responseContext) throws IOException { + HeadersContext.remove(); + } }
diff --git a/ext/microprofile/mp-rest-client/src/main/java/org/glassfish/jersey/microprofile/restclient/InterfaceModel.java b/ext/microprofile/mp-rest-client/src/main/java/org/glassfish/jersey/microprofile/restclient/InterfaceModel.java index 35a19f5..259110c 100644 --- a/ext/microprofile/mp-rest-client/src/main/java/org/glassfish/jersey/microprofile/restclient/InterfaceModel.java +++ b/ext/microprofile/mp-rest-client/src/main/java/org/glassfish/jersey/microprofile/restclient/InterfaceModel.java
@@ -73,10 +73,10 @@ /** * Creates new model based on interface class. Interface is parsed according to specific annotations. * - * @param restClientClass interface class + * @param restClientClass interface class * @param responseExceptionMappers registered exception mappers - * @param paramConverterProviders registered parameter providers - * @param asyncInterceptors async interceptors + * @param paramConverterProviders registered parameter providers + * @param asyncInterceptors async interceptors * @param injectionManager * @return new model instance */ @@ -91,13 +91,7 @@ paramConverterProviders, asyncInterceptors, injectionManager, - beanManager) - .pathValue(restClientClass.getAnnotation(Path.class)) - .produces(restClientClass.getAnnotation(Produces.class)) - .consumes(restClientClass.getAnnotation(Consumes.class)) - .clientHeaders(restClientClass.getAnnotationsByType(ClientHeaderParam.class)) - .clientHeadersFactory(restClientClass.getAnnotation(RegisterClientHeaders.class)) - .build(); + beanManager).build(); } private InterfaceModel(Builder builder) { @@ -216,8 +210,6 @@ } /** - * - * * @return */ public InjectionManager getInjectionManager() { @@ -355,6 +347,11 @@ * @return new instance */ InterfaceModel build() { + pathValue(restClientClass.getAnnotation(Path.class)); + produces(restClientClass.getAnnotation(Produces.class)); + consumes(restClientClass.getAnnotation(Consumes.class)); + clientHeaders(restClientClass.getAnnotationsByType(ClientHeaderParam.class)); + clientHeadersFactory(restClientClass.getAnnotation(RegisterClientHeaders.class)); validateHeaderDuplicityNames(); return new InterfaceModel(this); }
diff --git a/ext/microprofile/mp-rest-client/src/main/java/org/glassfish/jersey/microprofile/restclient/MatrixParamModel.java b/ext/microprofile/mp-rest-client/src/main/java/org/glassfish/jersey/microprofile/restclient/MatrixParamModel.java index 440a414..1788d31 100644 --- a/ext/microprofile/mp-rest-client/src/main/java/org/glassfish/jersey/microprofile/restclient/MatrixParamModel.java +++ b/ext/microprofile/mp-rest-client/src/main/java/org/glassfish/jersey/microprofile/restclient/MatrixParamModel.java
@@ -35,10 +35,11 @@ * Creates new matrix model. * * @param builder + * @param annotation */ - MatrixParamModel(Builder builder) { + MatrixParamModel(Builder builder, MatrixParam annotation) { super(builder); - matrixParamName = builder.matrixParamName(); + matrixParamName = annotation.value(); } @Override
diff --git a/ext/microprofile/mp-rest-client/src/main/java/org/glassfish/jersey/microprofile/restclient/MethodModel.java b/ext/microprofile/mp-rest-client/src/main/java/org/glassfish/jersey/microprofile/restclient/MethodModel.java index e7a2925..c70f7e4 100644 --- a/ext/microprofile/mp-rest-client/src/main/java/org/glassfish/jersey/microprofile/restclient/MethodModel.java +++ b/ext/microprofile/mp-rest-client/src/main/java/org/glassfish/jersey/microprofile/restclient/MethodModel.java
@@ -46,6 +46,7 @@ import javax.ws.rs.Consumes; import javax.ws.rs.CookieParam; import javax.ws.rs.DELETE; +import javax.ws.rs.FormParam; import javax.ws.rs.GET; import javax.ws.rs.HeaderParam; import javax.ws.rs.MatrixParam; @@ -57,6 +58,7 @@ import javax.ws.rs.client.Entity; import javax.ws.rs.client.Invocation; import javax.ws.rs.client.WebTarget; +import javax.ws.rs.core.Form; import javax.ws.rs.core.GenericType; import javax.ws.rs.core.HttpHeaders; import javax.ws.rs.core.MediaType; @@ -83,7 +85,7 @@ private final InterfaceModel interfaceModel; private final Method method; - private final Class<?> returnType; + private final GenericType<?> returnType; private final String httpMethod; private final String path; private final String[] produces; @@ -101,15 +103,7 @@ * @return */ static MethodModel from(InterfaceModel interfaceModel, Method method) { - return new Builder(interfaceModel, method) - .returnType(method.getGenericReturnType()) - .httpMethod(parseHttpMethod(interfaceModel, method)) - .pathValue(method.getAnnotation(Path.class)) - .produces(method.getAnnotation(Produces.class)) - .consumes(method.getAnnotation(Consumes.class)) - .parameters(parameterModels(interfaceModel, method)) - .clientHeaders(method.getAnnotationsByType(ClientHeaderParam.class)) - .build(); + return new Builder(interfaceModel, method).build(); } private MethodModel(Builder builder) { @@ -124,7 +118,7 @@ this.clientHeaders = builder.clientHeaders; this.invocationInterceptors = builder.invocationInterceptors; if (httpMethod.isEmpty()) { - subResourceModel = RestClientModel.from(returnType, + subResourceModel = RestClientModel.from(returnType.getRawType(), interfaceModel.getResponseExceptionMappers(), interfaceModel.getParamConverterProviders(), interfaceModel.getAsyncInterceptors(), @@ -174,10 +168,12 @@ .findFirst() .ifPresent(parameterModel -> entity.set(args[parameterModel.getParamPosition()])); + Form form = handleForm(args); + WebTarget webTarget = webTargetAtomicReference.get(); if (httpMethod.isEmpty()) { //sub resource method - return subResourceProxy(webTarget, returnType); + return subResourceProxy(webTarget, returnType.getRawType()); } webTarget = addQueryParams(webTarget, args); webTarget = addMatrixParams(webTarget, args); @@ -188,16 +184,32 @@ .headers(addCustomHeaders(args)); builder = addCookies(builder, args); + Object entityToUse = entity.get(); + if (entityToUse == null && !form.asMap().isEmpty()) { + entityToUse = form; + } + Object response; if (CompletionStage.class.isAssignableFrom(method.getReturnType())) { - response = asynchronousCall(builder, entity.get(), method); + response = asynchronousCall(builder, entityToUse, method); } else { - response = synchronousCall(builder, entity.get(), method); + response = synchronousCall(builder, entityToUse, method); } return response; } + @SuppressWarnings("unchecked") + private Form handleForm(Object[] args) { + final Form form = new Form(); + parameterModels.stream() + .filter(parameterModel -> parameterModel.handles(FormParam.class)) + .forEach(parameterModel -> parameterModel.handleParameter(form, + FormParam.class, + args[parameterModel.getParamPosition()])); + return form; + } + private Object synchronousCall(Invocation.Builder builder, Object entity, Method method) { Response response; @@ -211,17 +223,15 @@ evaluateResponse(response, method); - if (returnType.equals(Void.class)) { + if (returnType.getType().equals(Void.class)) { return null; - } else if (returnType.equals(Response.class)) { + } else if (returnType.getType().equals(Response.class)) { return response; } return response.readEntity(returnType); } private CompletableFuture asynchronousCall(Invocation.Builder builder, Object entity, Method method) { - ParameterizedType type = (ParameterizedType) method.getGenericReturnType(); - Type actualTypeArgument = type.getActualTypeArguments()[0]; //completionStage<actualTypeArgument> CompletableFuture<Object> result = new CompletableFuture<>(); Future<Response> theFuture; if (entity != null @@ -237,12 +247,12 @@ interfaceModel.getAsyncInterceptors().forEach(AsyncInvocationInterceptor::removeContext); try { evaluateResponse(response, method); - if (returnType.equals(Void.class)) { + if (returnType.getType().equals(Void.class)) { result.complete(null); - } else if (returnType.equals(Response.class)) { + } else if (returnType.getType().equals(Response.class)) { result.complete(response); } else { - result.complete(response.readEntity(new GenericType<>(actualTypeArgument))); + result.complete(response.readEntity(returnType)); } } catch (Exception e) { result.completeExceptionally(e); @@ -398,9 +408,9 @@ * Evaluation of {@link Response} if it is applicable for any of the registered {@link ResponseExceptionMapper} providers. * * @param response obtained response - * @param method called method + * @param method called method */ - void evaluateResponse(Response response, Method method) { + private void evaluateResponse(Response response, Method method) { ResponseExceptionMapper lowestMapper = null; Throwable throwable = null; for (ResponseExceptionMapper responseExceptionMapper : interfaceModel.getResponseExceptionMappers()) { @@ -460,7 +470,7 @@ private final InterfaceModel interfaceModel; private final Method method; - private Class<?> returnType; + private GenericType<?> returnType; private String httpMethod; private String pathValue; private String[] produces; @@ -499,7 +509,7 @@ interfaceModel.getCreationalContext()); invocationInterceptors.add(new InterceptorInvocationContext .InvocationInterceptor(interceptorInstance, - interceptor)); + interceptor)); } } } @@ -509,39 +519,34 @@ * Return type of the method. * * @param returnType Method return type - * @return updated Builder instance */ - Builder returnType(Type returnType) { - if (returnType instanceof ParameterizedType) { - this.returnType = (Class<?>) ((ParameterizedType) returnType).getActualTypeArguments()[0]; + private void returnType(Type returnType) { + if (returnType instanceof ParameterizedType + && CompletionStage.class.isAssignableFrom((Class<?>) ((ParameterizedType) returnType).getRawType())) { + this.returnType = new GenericType<>(((ParameterizedType) returnType).getActualTypeArguments()[0]); } else { - this.returnType = (Class<?>) returnType; + this.returnType = new GenericType<>(returnType); } - return this; } /** * HTTP method of the method. * * @param httpMethod HTTP method of the method - * @return updated Builder instance */ - Builder httpMethod(String httpMethod) { + private void httpMethod(String httpMethod) { this.httpMethod = httpMethod; - return this; } /** * Path value from {@link Path} annotation. If annotation is null, empty String is set as path. * * @param path {@link Path} annotation - * @return updated Builder instance */ - Builder pathValue(Path path) { + private void pathValue(Path path) { this.pathValue = path != null ? path.value() : ""; //if only / is added to path like this "localhost:80/test" it makes invalid path "localhost:80/test/" this.pathValue = pathValue.equals("/") ? "" : pathValue; - return this; } /** @@ -549,11 +554,9 @@ * If annotation is null, value from {@link InterfaceModel} is set. * * @param produces {@link Produces} annotation - * @return updated Builder instance */ - Builder produces(Produces produces) { + private void produces(Produces produces) { this.produces = produces == null ? interfaceModel.getProduces() : produces.value(); - return this; } /** @@ -561,35 +564,29 @@ * If annotation is null, value from {@link InterfaceModel} is set. * * @param consumes {@link Consumes} annotation - * @return updated Builder instance */ - Builder consumes(Consumes consumes) { + private void consumes(Consumes consumes) { this.consumes = consumes == null ? interfaceModel.getConsumes() : consumes.value(); - return this; } /** * {@link List} of transformed method parameters. * * @param parameterModels {@link List} of parameters - * @return updated Builder instance */ - Builder parameters(List<ParamModel> parameterModels) { + private void parameters(List<ParamModel> parameterModels) { this.parameterModels = parameterModels; - return this; } /** * Process data from {@link ClientHeaderParam} annotation to extract methods and values. * * @param clientHeaderParams {@link ClientHeaderParam} annotations - * @return updated Builder instance */ - Builder clientHeaders(ClientHeaderParam[] clientHeaderParams) { + private void clientHeaders(ClientHeaderParam[] clientHeaderParams) { clientHeaders = Arrays.stream(clientHeaderParams) .map(clientHeaderParam -> new ClientHeaderParamModel(interfaceModel.getRestClientClass(), clientHeaderParam)) .collect(Collectors.toList()); - return this; } /** @@ -598,12 +595,20 @@ * @return new instance */ MethodModel build() { + returnType(method.getGenericReturnType()); + httpMethod(parseHttpMethod(interfaceModel, method)); + pathValue(method.getAnnotation(Path.class)); + produces(method.getAnnotation(Produces.class)); + consumes(method.getAnnotation(Consumes.class)); + parameters(parameterModels(interfaceModel, method)); + clientHeaders(method.getAnnotationsByType(ClientHeaderParam.class)); + validateParameters(); validateHeaderDuplicityNames(); Optional<ParamModel> entity = parameterModels.stream() .filter(ParamModel::isEntity) .findFirst(); - if (JsonValue.class.isAssignableFrom(returnType) + if (returnType.getType() instanceof Class && JsonValue.class.isAssignableFrom((Class<?>) returnType.getType()) || ( entity.isPresent() && entity.get().getType() instanceof Class && JsonValue.class.isAssignableFrom((Class<?>) entity.get().getType()))) {
diff --git a/ext/microprofile/mp-rest-client/src/test/java/org/glassfish/jersey/microprofile/restclient/InterfaceValidationTest.java b/ext/microprofile/mp-rest-client/src/main/java/org/glassfish/jersey/microprofile/restclient/ParamHandler.java similarity index 64% rename from ext/microprofile/mp-rest-client/src/test/java/org/glassfish/jersey/microprofile/restclient/InterfaceValidationTest.java rename to ext/microprofile/mp-rest-client/src/main/java/org/glassfish/jersey/microprofile/restclient/ParamHandler.java index 2f1b4fd..c268918 100644 --- a/ext/microprofile/mp-rest-client/src/test/java/org/glassfish/jersey/microprofile/restclient/InterfaceValidationTest.java +++ b/ext/microprofile/mp-rest-client/src/main/java/org/glassfish/jersey/microprofile/restclient/ParamHandler.java
@@ -1,6 +1,5 @@ /* * Copyright (c) 2019 Oracle and/or its affiliates. All rights reserved. - * Copyright (c) 2019 Payara Foundation and/or its affiliates. All rights reserved. * * This program and the accompanying materials are made available under the * terms of the Eclipse Public License v. 2.0, which is available at @@ -17,20 +16,22 @@ package org.glassfish.jersey.microprofile.restclient; -import java.util.ArrayList; -import java.util.HashSet; - -import org.junit.Test; - /** + * Handles behavior for each JAX-RS annotated element. + * * @author David Kral */ -public class InterfaceValidationTest { +@FunctionalInterface +interface ParamHandler { - @Test - public void testValidInterface() { - RestClientModel.from(CorrectInterface.class, new HashSet<>(), new HashSet<>(), new ArrayList<>(), - null, null); - } + /** + * Handles behavior for specific annotated element. + * + * @param beanClassModel bean class model + * @param requestPart part of the request + * @param instance actual value + * @return updated request part + */ + Object handle(BeanClassModel beanClassModel, Object requestPart, Object instance); -} \ No newline at end of file +}
diff --git a/ext/microprofile/mp-rest-client/src/main/java/org/glassfish/jersey/microprofile/restclient/ParamModel.java b/ext/microprofile/mp-rest-client/src/main/java/org/glassfish/jersey/microprofile/restclient/ParamModel.java index 800005d..02afd7d 100644 --- a/ext/microprofile/mp-rest-client/src/main/java/org/glassfish/jersey/microprofile/restclient/ParamModel.java +++ b/ext/microprofile/mp-rest-client/src/main/java/org/glassfish/jersey/microprofile/restclient/ParamModel.java
@@ -19,6 +19,9 @@ import java.lang.annotation.Annotation; import java.lang.reflect.AnnotatedElement; import java.lang.reflect.Type; +import java.util.HashMap; +import java.util.Map; +import java.util.function.BiFunction; import javax.ws.rs.BeanParam; import javax.ws.rs.CookieParam; @@ -37,6 +40,26 @@ */ abstract class ParamModel<T> { + public static final Map<Class<? extends Annotation>, + BiFunction<Builder, Annotation, ParamModel<?>>> PARAM_ANNOTATIONS = new HashMap<>(); + + static { + PARAM_ANNOTATIONS.put(PathParam.class, + (builder, annotation) -> new PathParamModel(builder, (PathParam) annotation)); + PARAM_ANNOTATIONS.put(HeaderParam.class, + (builder, annotation) -> new HeaderParamModel(builder, (HeaderParam) annotation)); + PARAM_ANNOTATIONS.put(CookieParam.class, + (builder, annotation) -> new CookieParamModel(builder, (CookieParam) annotation)); + PARAM_ANNOTATIONS.put(QueryParam.class, + (builder, annotation) -> new QueryParamModel(builder, (QueryParam) annotation)); + PARAM_ANNOTATIONS.put(MatrixParam.class, + (builder, annotation) -> new MatrixParamModel(builder, (MatrixParam) annotation)); + PARAM_ANNOTATIONS.put(FormParam.class, + (builder, annotation) -> new FormParamModel(builder, (FormParam) annotation)); + PARAM_ANNOTATIONS.put(BeanParam.class, + (builder, annotation) -> new BeanParamModel(builder)); + } + protected final InterfaceModel interfaceModel; protected final Parameter parameter; private final Type type; @@ -47,24 +70,15 @@ /** * Processes parameter annotations and creates new instance of the model corresponding model. * - * @param interfaceModel model of the interface - * @param type annotated element type + * @param interfaceModel model of the interface + * @param type annotated element type * @param annotatedElement annotated element - * @param position position in method params + * @param position position in method params * @return new parameter instance */ static ParamModel from(InterfaceModel interfaceModel, Type type, AnnotatedElement annotatedElement, Parameter parameter, int position) { - return new Builder(interfaceModel, type, annotatedElement, parameter) - .pathParamName(annotatedElement.getAnnotation(PathParam.class)) - .headerParamName(annotatedElement.getAnnotation(HeaderParam.class)) - .beanParam(annotatedElement.getAnnotation(BeanParam.class)) - .cookieParam(annotatedElement.getAnnotation(CookieParam.class)) - .queryParam(annotatedElement.getAnnotation(QueryParam.class)) - .matrixParam(annotatedElement.getAnnotation(MatrixParam.class)) - .formParam(annotatedElement.getAnnotation(FormParam.class)) - .paramPosition(position) - .build(); + return new Builder(interfaceModel, type, annotatedElement, parameter, position).build(); } ParamModel(Builder builder) { @@ -110,9 +124,9 @@ /** * Transforms parameter to be part of the request. * - * @param requestPart part of a request + * @param requestPart part of a request * @param annotationClass annotation type - * @param instance actual method parameter value + * @param instance actual method parameter value * @return updated request part */ abstract T handleParameter(T requestPart, Class<?> annotationClass, Object instance); @@ -131,143 +145,19 @@ private Type type; private AnnotatedElement annotatedElement; private Parameter parameter; - private String pathParamName; - private String headerParamName; - private String cookieParamName; - private String queryParamName; - private String matrixParamName; - private String formParamName; - private boolean beanParam; private boolean entity; private int paramPosition; - private Builder(InterfaceModel interfaceModel, Type type, AnnotatedElement annotatedElement, Parameter parameter) { + private Builder(InterfaceModel interfaceModel, + Type type, + AnnotatedElement annotatedElement, + Parameter parameter, + int position) { this.interfaceModel = interfaceModel; this.type = type; this.annotatedElement = annotatedElement; this.parameter = parameter; - } - - /** - * Path parameter name. - * - * @param pathParam {@link PathParam} annotation - * @return updated Builder instance - */ - Builder pathParamName(PathParam pathParam) { - this.pathParamName = pathParam == null ? null : pathParam.value(); - return this; - } - - /** - * Header parameter name. - * - * @param headerParam {@link HeaderParam} annotation - * @return updated Builder instance - */ - Builder headerParamName(HeaderParam headerParam) { - this.headerParamName = headerParam == null ? null : headerParam.value(); - return this; - } - - /** - * Bean parameter identifier. - * - * @param beanParam {@link BeanParam} annotation - * @return updated Builder instance - */ - Builder beanParam(BeanParam beanParam) { - this.beanParam = beanParam != null; - return this; - } - - /** - * Cookie parameter. - * - * @param cookieParam {@link CookieParam} annotation - * @return updated Builder instance - */ - Builder cookieParam(CookieParam cookieParam) { - this.cookieParamName = cookieParam == null ? null : cookieParam.value(); - return this; - } - - /** - * Query parameter. - * - * @param queryParam {@link QueryParam} annotation - * @return updated Builder instance - */ - Builder queryParam(QueryParam queryParam) { - this.queryParamName = queryParam == null ? null : queryParam.value(); - return this; - } - - /** - * Matrix parameter. - * - * @param matrixParam {@link MatrixParam} annotation - * @return updated Builder instance - */ - Builder matrixParam(MatrixParam matrixParam) { - this.matrixParamName = matrixParam == null ? null : matrixParam.value(); - return this; - } - - /** - * Form parameter. - * - * @param formParam {@link FormParam} annotation - * @return updated Builder instance - */ - Builder formParam(FormParam formParam) { - this.formParamName = formParam == null ? null : formParam.value(); - return this; - } - - /** - * Position of parameter in method parameters - * - * @param paramPosition Parameter position - * @return updated Builder instance - */ - Builder paramPosition(int paramPosition) { - this.paramPosition = paramPosition; - return this; - } - - /** - * Returns path param name; - * - * @return path param name - */ - String pathParamName() { - return pathParamName; - } - - /** - * Returns header param name; - * - * @return header param name - */ - String headerParamName() { - return headerParamName; - } - - String cookieParamName() { - return cookieParamName; - } - - String queryParamName() { - return queryParamName; - } - - String matrixParamName() { - return matrixParamName; - } - - String formParamName() { - return matrixParamName; + this.paramPosition = position; } /** @@ -276,21 +166,13 @@ * @return new instance */ ParamModel build() { - if (pathParamName != null) { - return new PathParamModel(this); - } else if (headerParamName != null) { - return new HeaderParamModel(this); - } else if (beanParam) { - return new BeanParamModel(this); - } else if (cookieParamName != null) { - return new CookieParamModel(this); - } else if (queryParamName != null) { - return new QueryParamModel(this); - } else if (matrixParamName != null) { - return new MatrixParamModel(this); - } else if (formParamName != null) { - return new FormParamModel(this); + for (Class<? extends Annotation> paramAnnotation : PARAM_ANNOTATIONS.keySet()) { + Annotation annot = annotatedElement.getAnnotation(paramAnnotation); + if (annot != null) { + return PARAM_ANNOTATIONS.get(paramAnnotation).apply(this, annot); + } } + entity = true; return new ParamModel(this) { @Override
diff --git a/ext/microprofile/mp-rest-client/src/main/java/org/glassfish/jersey/microprofile/restclient/PathParamModel.java b/ext/microprofile/mp-rest-client/src/main/java/org/glassfish/jersey/microprofile/restclient/PathParamModel.java index 4c8768c..6c8cd5f 100644 --- a/ext/microprofile/mp-rest-client/src/main/java/org/glassfish/jersey/microprofile/restclient/PathParamModel.java +++ b/ext/microprofile/mp-rest-client/src/main/java/org/glassfish/jersey/microprofile/restclient/PathParamModel.java
@@ -30,9 +30,9 @@ private final String pathParamName; - PathParamModel(Builder builder) { + PathParamModel(Builder builder, PathParam annotation) { super(builder); - pathParamName = builder.pathParamName(); + pathParamName = annotation.value(); } public String getPathParamName() {
diff --git a/ext/microprofile/mp-rest-client/src/main/java/org/glassfish/jersey/microprofile/restclient/QueryParamModel.java b/ext/microprofile/mp-rest-client/src/main/java/org/glassfish/jersey/microprofile/restclient/QueryParamModel.java index ce96099..1f6fcfe 100644 --- a/ext/microprofile/mp-rest-client/src/main/java/org/glassfish/jersey/microprofile/restclient/QueryParamModel.java +++ b/ext/microprofile/mp-rest-client/src/main/java/org/glassfish/jersey/microprofile/restclient/QueryParamModel.java
@@ -30,9 +30,9 @@ private final String queryParamName; - QueryParamModel(Builder builder) { + QueryParamModel(Builder builder, QueryParam annotation) { super(builder); - queryParamName = builder.queryParamName(); + queryParamName = annotation.value(); } @Override
diff --git a/ext/microprofile/mp-rest-client/src/main/java/org/glassfish/jersey/microprofile/restclient/RequestHeaderAutoDiscoverable.java b/ext/microprofile/mp-rest-client/src/main/java/org/glassfish/jersey/microprofile/restclient/RequestHeaderAutoDiscoverable.java index bcda814..05b2155 100644 --- a/ext/microprofile/mp-rest-client/src/main/java/org/glassfish/jersey/microprofile/restclient/RequestHeaderAutoDiscoverable.java +++ b/ext/microprofile/mp-rest-client/src/main/java/org/glassfish/jersey/microprofile/restclient/RequestHeaderAutoDiscoverable.java
@@ -20,13 +20,13 @@ import javax.ws.rs.RuntimeType; import javax.ws.rs.core.FeatureContext; -import org.glassfish.jersey.internal.spi.AutoDiscoverable; +import org.glassfish.jersey.internal.spi.ForcedAutoDiscoverable; /** * Auto discoverable feature to bind into jersey runtime. */ @ConstrainedTo(RuntimeType.SERVER) -public class RequestHeaderAutoDiscoverable implements AutoDiscoverable { +public class RequestHeaderAutoDiscoverable implements ForcedAutoDiscoverable { @Override public void configure(FeatureContext context) { if (!context.getConfiguration().isRegistered(HeadersRequestFilter.class)) {
diff --git a/ext/microprofile/mp-rest-client/src/main/java/org/glassfish/jersey/microprofile/restclient/RestClientBuilderImpl.java b/ext/microprofile/mp-rest-client/src/main/java/org/glassfish/jersey/microprofile/restclient/RestClientBuilderImpl.java index 1d96c4b..00116a7 100644 --- a/ext/microprofile/mp-rest-client/src/main/java/org/glassfish/jersey/microprofile/restclient/RestClientBuilderImpl.java +++ b/ext/microprofile/mp-rest-client/src/main/java/org/glassfish/jersey/microprofile/restclient/RestClientBuilderImpl.java
@@ -37,11 +37,6 @@ import java.util.stream.Collectors; import javax.annotation.Priority; -import javax.enterprise.inject.spi.BeanManager; -import javax.enterprise.inject.spi.CDI; -import javax.naming.Context; -import javax.naming.InitialContext; -import javax.naming.NamingException; import javax.ws.rs.Priorities; import javax.ws.rs.client.Client; import javax.ws.rs.client.ClientBuilder; @@ -61,6 +56,7 @@ import org.eclipse.microprofile.rest.client.ext.ResponseExceptionMapper; import org.eclipse.microprofile.rest.client.spi.RestClientListener; import org.glassfish.jersey.client.Initializable; +import org.glassfish.jersey.ext.cdi1x.internal.CdiUtil; import org.glassfish.jersey.internal.inject.InjectionManager; import org.glassfish.jersey.internal.inject.InjectionManagerSupplier; import org.glassfish.jersey.internal.util.ReflectionHelper; @@ -71,7 +67,7 @@ * @author David Kral * @author Patrik Dudits */ -public class RestClientBuilderImpl implements RestClientBuilder { +class RestClientBuilderImpl implements RestClientBuilder { private static final String CONFIG_DISABLE_DEFAULT_MAPPER = "microprofile.rest.client.disable.default.mapper"; private static final String CONFIG_PROVIDERS = "/mp-rest/providers"; @@ -137,21 +133,7 @@ } //Provider registration part - Object providersFromJerseyConfig = clientBuilder.getConfiguration() - .getProperty(interfaceClass.getName() + CONFIG_PROVIDERS); - if (providersFromJerseyConfig instanceof String && !((String) providersFromJerseyConfig).isEmpty()) { - String[] providerArray = ((String) providersFromJerseyConfig).split(PROVIDER_SEPARATOR); - processConfigProviders(interfaceClass, providerArray); - } - Optional<String> providersFromConfig = config.getOptionalValue(interfaceClass.getName() + CONFIG_PROVIDERS, String.class); - if (providersFromConfig.isPresent() && !providersFromConfig.get().isEmpty()) { - String[] providerArray = providersFromConfig.get().split(PROVIDER_SEPARATOR); - processConfigProviders(interfaceClass, providerArray); - } - RegisterProvider[] registerProviders = interfaceClass.getAnnotationsByType(RegisterProvider.class); - for (RegisterProvider registerProvider : registerProviders) { - register(registerProvider.value(), registerProvider.priority() < 0 ? Priorities.USER : registerProvider.priority()); - } + processProviders(interfaceClass); InjectionManagerExposer injectionManagerExposer = new InjectionManagerExposer(); register(injectionManagerExposer); @@ -160,16 +142,7 @@ } //We need to check first if default exception mapper was not disabled by property on builder. - Object disableDefaultMapperJersey = clientBuilder.getConfiguration().getProperty(CONFIG_DISABLE_DEFAULT_MAPPER); - if (disableDefaultMapperJersey != null && disableDefaultMapperJersey.equals(Boolean.FALSE)) { - register(new DefaultResponseExceptionMapper()); - } else if (disableDefaultMapperJersey == null) { - //If property was not set on Jersey ClientBuilder, we need to check config. - Optional<Boolean> disableDefaultMapperConfig = config.getOptionalValue(CONFIG_DISABLE_DEFAULT_MAPPER, boolean.class); - if (!disableDefaultMapperConfig.isPresent() || !disableDefaultMapperConfig.get()) { - register(new DefaultResponseExceptionMapper()); - } - } + registerExceptionMapper(); //AsyncInterceptors initialization List<AsyncInvocationInterceptor> asyncInterceptors = asyncInterceptorFactories.stream() @@ -190,8 +163,7 @@ paramConverterProviders, asyncInterceptors, injectionManagerExposer.injectionManager, - lookupBeanManager()); - + CdiUtil.getBeanManager()); return (T) Proxy.newProxyInstance(interfaceClass.getClassLoader(), new Class[] {interfaceClass}, @@ -199,29 +171,37 @@ ); } - private BeanManager lookupBeanManager() { - Context initialContext = null; - try { - initialContext = new InitialContext(); - return (BeanManager) initialContext.lookup("java:comp/BeanManager"); - } catch (NamingException e) { - // no bean manager in JNDI - } finally { - if (initialContext != null) { - try { - initialContext.close(); - } catch (NamingException e) { - } + private void registerExceptionMapper() { + Object disableDefaultMapperJersey = clientBuilder.getConfiguration().getProperty(CONFIG_DISABLE_DEFAULT_MAPPER); + if (disableDefaultMapperJersey != null && disableDefaultMapperJersey.equals(Boolean.FALSE)) { + register(new DefaultResponseExceptionMapper()); + } else if (disableDefaultMapperJersey == null) { + //If property was not set on Jersey ClientBuilder, we need to check config. + Optional<Boolean> disableDefaultMapperConfig = config.getOptionalValue(CONFIG_DISABLE_DEFAULT_MAPPER, boolean.class); + if (!disableDefaultMapperConfig.isPresent() || !disableDefaultMapperConfig.get()) { + register(new DefaultResponseExceptionMapper()); } } - try { - if (CDI.current() != null) { - return CDI.current().getBeanManager(); - } - } catch (IllegalStateException e) { - // CDI unavailable + } + + private <T> void processProviders(Class<T> interfaceClass) { + Object providersFromJerseyConfig = clientBuilder.getConfiguration() + .getProperty(interfaceClass.getName() + CONFIG_PROVIDERS); + if (providersFromJerseyConfig instanceof String && !((String) providersFromJerseyConfig).isEmpty()) { + String[] providerArray = ((String) providersFromJerseyConfig).split(PROVIDER_SEPARATOR); + processConfigProviders(interfaceClass, providerArray); } - return null; + Optional<String> providersFromConfig = config.getOptionalValue(interfaceClass.getName() + CONFIG_PROVIDERS, String.class); + providersFromConfig.ifPresent(providers -> { + if (!providers.isEmpty()) { + String[] providerArray = providersFromConfig.get().split(PROVIDER_SEPARATOR); + processConfigProviders(interfaceClass, providerArray); + } + }); + RegisterProvider[] registerProviders = interfaceClass.getAnnotationsByType(RegisterProvider.class); + for (RegisterProvider registerProvider : registerProviders) { + register(registerProvider.value(), registerProvider.priority() < 0 ? Priorities.USER : registerProvider.priority()); + } } private void processConfigProviders(Class<?> restClientInterface, String[] providerArray) { @@ -264,86 +244,86 @@ } @Override - public RestClientBuilder register(Class<?> aClass) { - if (isSupportedCustomProvider(aClass)) { - register(ReflectionUtil.createInstance(aClass)); + public RestClientBuilder register(Class<?> componentClass) { + if (isSupportedCustomProvider(componentClass)) { + register(ReflectionUtil.createInstance(componentClass)); } else { - clientBuilder.register(aClass); + clientBuilder.register(componentClass); } return this; } @Override - public RestClientBuilder register(Class<?> aClass, int i) { - if (isSupportedCustomProvider(aClass)) { - register(ReflectionUtil.createInstance(aClass), i); + public RestClientBuilder register(Class<?> componentClass, int priority) { + if (isSupportedCustomProvider(componentClass)) { + register(ReflectionUtil.createInstance(componentClass), priority); } else { - clientBuilder.register(aClass, i); + clientBuilder.register(componentClass, priority); } return this; } @Override - public RestClientBuilder register(Class<?> aClass, Class<?>... classes) { - if (isSupportedCustomProvider(aClass)) { - register(ReflectionUtil.createInstance(aClass), classes); + public RestClientBuilder register(Class<?> componentClass, Class<?>... contracts) { + if (isSupportedCustomProvider(componentClass)) { + register(ReflectionUtil.createInstance(componentClass), contracts); } else { - clientBuilder.register(aClass, classes); + clientBuilder.register(componentClass, contracts); } return this; } @Override - public RestClientBuilder register(Class<?> aClass, Map<Class<?>, Integer> map) { - if (isSupportedCustomProvider(aClass)) { - register(ReflectionUtil.createInstance(aClass), map); + public RestClientBuilder register(Class<?> componentClass, Map<Class<?>, Integer> contracts) { + if (isSupportedCustomProvider(componentClass)) { + register(ReflectionUtil.createInstance(componentClass), contracts); } else { - clientBuilder.register(aClass, map); + clientBuilder.register(componentClass, contracts); } return this; } @Override - public RestClientBuilder register(Object o) { - if (o instanceof ResponseExceptionMapper) { - ResponseExceptionMapper mapper = (ResponseExceptionMapper) o; - registerCustomProvider(o, -1); + public RestClientBuilder register(Object component) { + if (component instanceof ResponseExceptionMapper) { + ResponseExceptionMapper mapper = (ResponseExceptionMapper) component; + registerCustomProvider(component, -1); clientBuilder.register(mapper, mapper.getPriority()); } else { - clientBuilder.register(o); - registerCustomProvider(o, -1); + clientBuilder.register(component); + registerCustomProvider(component, -1); } return this; } @Override - public RestClientBuilder register(Object o, int i) { - clientBuilder.register(o, i); - registerCustomProvider(o, i); + public RestClientBuilder register(Object component, int priority) { + clientBuilder.register(component, priority); + registerCustomProvider(component, priority); return this; } @Override - public RestClientBuilder register(Object o, Class<?>... classes) { - for (Class<?> clazz : classes) { - if (isSupportedCustomProvider(clazz)) { - register(o); + public RestClientBuilder register(Object component, Class<?>... contracts) { + for (Class<?> contract : contracts) { + if (isSupportedCustomProvider(contract)) { + register(component); } } - clientBuilder.register(o, classes); + clientBuilder.register(component, contracts); return this; } @Override - public RestClientBuilder register(Object o, Map<Class<?>, Integer> map) { - if (isSupportedCustomProvider(o.getClass())) { - if (o instanceof ResponseExceptionMapper) { - registerCustomProvider(o, map.get(ResponseExceptionMapper.class)); - } else if (o instanceof ParamConverterProvider) { - registerCustomProvider(o, map.get(ParamConverterProvider.class)); + public RestClientBuilder register(Object component, Map<Class<?>, Integer> contracts) { + if (isSupportedCustomProvider(component.getClass())) { + if (component instanceof ResponseExceptionMapper) { + registerCustomProvider(component, contracts.get(ResponseExceptionMapper.class)); + } else if (component instanceof ParamConverterProvider) { + registerCustomProvider(component, contracts.get(ParamConverterProvider.class)); } } - clientBuilder.register(o, map); + clientBuilder.register(component, contracts); return this; }
diff --git a/ext/microprofile/mp-rest-client/src/main/resources/META-INF/beans.xml b/ext/microprofile/mp-rest-client/src/main/resources/META-INF/beans.xml deleted file mode 100644 index f472ff4..0000000 --- a/ext/microprofile/mp-rest-client/src/main/resources/META-INF/beans.xml +++ /dev/null
@@ -1,26 +0,0 @@ -<?xml version="1.0" encoding="UTF-8"?> -<!-- - - Copyright (c) 2019 Oracle and/or its affiliates. All rights reserved. - - This program and the accompanying materials are made available under the - terms of the Eclipse Public License v. 2.0, which is available at - http://www.eclipse.org/legal/epl-2.0. - - This Source Code may also be made available under the following Secondary - Licenses when the conditions for such availability set forth in the - Eclipse Public License v. 2.0 are satisfied: GNU General Public License, - version 2 with the GNU Classpath Exception, which is available at - https://www.gnu.org/software/classpath/license.html. - - SPDX-License-Identifier: EPL-2.0 OR GPL-2.0 WITH Classpath-exception-2.0 - ---> - -<beans xmlns="http://xmlns.jcp.org/xml/ns/javaee" - xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" - xsi:schemaLocation="http://xmlns.jcp.org/xml/ns/javaee - http://xmlns.jcp.org/xml/ns/javaee/beans_2_0.xsd" - version="2.0" - bean-discovery-mode="none"> -</beans>
diff --git a/ext/microprofile/mp-rest-client/src/main/resources/META-INF/services/org.glassfish.jersey.internal.spi.AutoDiscoverable b/ext/microprofile/mp-rest-client/src/main/resources/META-INF/services/org.glassfish.jersey.internal.spi.ForcedAutoDiscoverable similarity index 100% rename from ext/microprofile/mp-rest-client/src/main/resources/META-INF/services/org.glassfish.jersey.internal.spi.AutoDiscoverable rename to ext/microprofile/mp-rest-client/src/main/resources/META-INF/services/org.glassfish.jersey.internal.spi.ForcedAutoDiscoverable
diff --git a/ext/microprofile/mp-rest-client/src/test/resources/server.policy b/ext/microprofile/mp-rest-client/src/test/resources/server.policy deleted file mode 100644 index edff3db..0000000 --- a/ext/microprofile/mp-rest-client/src/test/resources/server.policy +++ /dev/null
@@ -1,78 +0,0 @@ -/* - * Copyright (c) 2019 Oracle and/or its affiliates. All rights reserved. - * - * This program and the accompanying materials are made available under the - * terms of the Eclipse Public License v. 2.0, which is available at - * http://www.eclipse.org/legal/epl-2.0. - * - * This Source Code may also be made available under the following Secondary - * Licenses when the conditions for such availability set forth in the - * Eclipse Public License v. 2.0 are satisfied: GNU General Public License, - * version 2 with the GNU Classpath Exception, which is available at - * https://www.gnu.org/software/classpath/license.html. - * - * SPDX-License-Identifier: EPL-2.0 OR GPL-2.0 WITH Classpath-exception-2.0 - */ - -grant { - permission java.util.PropertyPermission "idea.launcher.bin.path", "read"; - permission java.lang.RuntimePermission "loadLibrary.C:\\Program Files\\JetBrains\\IntelliJ IDEA 2019.1\\bin\\breakgen64.dll"; - permission java.lang.RuntimePermission "accessDeclaredMembers"; - permission java.lang.RuntimePermission "getClassLoader"; - permission java.lang.RuntimePermission "createClassLoader"; - permission java.lang.RuntimePermission "setContextClassLoader"; - permission java.lang.RuntimePermission "getProtectionDomain"; - permission java.lang.RuntimePermission "getenv.*"; - permission java.lang.RuntimePermission "setIO"; - permission java.io.FilePermission "C:\\Program Files\\JetBrains\\IntelliJ IDEA 2019.1\\bin\\breakgen64.dll", "read"; - permission java.util.PropertyPermission "idea.launcher.port", "read"; - permission java.util.PropertyPermission "idea.launcher.bin.path", "read"; - permission java.util.PropertyPermission "jcommander.debug", "read"; - permission java.util.PropertyPermission "user.dir", "read"; - permission java.util.PropertyPermission "debug", "read"; - permission java.util.PropertyPermission "arquillian.debug", "read"; - permission java.util.PropertyPermission "trace", "read"; - permission java.util.PropertyPermission "testng.test.classpath", "read"; - permission java.util.PropertyPermission "localscoping", "read"; - permission java.util.PropertyPermission "outfile", "read"; - permission java.util.PropertyPermission "org.eclipse.microprofile.*", "read"; - permission java.util.PropertyPermission "arquillian.xml", "read"; - permission java.util.PropertyPermission "*", "read,write"; - permission java.net.SocketPermission "127.0.0.1:*", "connect,resolve"; - permission java.net.SocketPermission "*", "connect,resolve"; - permission java.io.FilePermission "<<ALL FILES>>", "read,write,delete"; - permission java.lang.reflect.ReflectPermission "suppressAccessChecks"; - permission java.net.NetPermission "getProxySelector"; - permission java.net.NetPermission "specifyStreamHandler"; - permission java.lang.management.ManagementPermission "monitor"; -}; - -grant codebase "file:${java.home}/-" { - permission java.security.AllPermission; -}; - -grant codebase "file:${settings.localRepository}/-" { - permission java.security.AllPermission; -}; - -grant codebase "file:${project.build.directory}/test-classes/-" { - permission java.util.PropertyPermission "idea.launcher.bin.path", "read"; - permission java.lang.RuntimePermission "loadLibrary.C:\\Program Files\\JetBrains\\IntelliJ IDEA 2019.1\\bin\\breakgen64.dll"; - permission java.io.FilePermission "C:\\Program Files\\JetBrains\\IntelliJ IDEA 2019.1\\bin\\breakgen64.dll", "read"; - permission java.util.PropertyPermission "idea.launcher.port", "read"; - permission java.util.PropertyPermission "idea.launcher.bin.path", "read"; - - permission java.io.FilePermission "<<ALL FILES>>", "read,write,delete"; - permission java.net.SocketPermission "*", "connect,resolve"; -}; - -grant codebase "file:${project.build.directory}/classes/-" { - permission java.util.PropertyPermission "idea.launcher.bin.path", "read"; - permission java.lang.RuntimePermission "loadLibrary.C:\\Program Files\\JetBrains\\IntelliJ IDEA 2019.1\\bin\\breakgen64.dll"; - permission java.io.FilePermission "C:\\Program Files\\JetBrains\\IntelliJ IDEA 2019.1\\bin\\breakgen64.dll", "read"; - permission java.util.PropertyPermission "idea.launcher.port", "read"; - permission java.util.PropertyPermission "idea.launcher.bin.path", "read"; - - permission java.io.FilePermission "<<ALL FILES>>", "read,write,delete"; - permission java.net.SocketPermission "*", "connect,resolve"; -};
diff --git a/ext/microprofile/pom.xml b/ext/microprofile/pom.xml index 7a50ddf..3cac0c8 100644 --- a/ext/microprofile/pom.xml +++ b/ext/microprofile/pom.xml
@@ -9,7 +9,8 @@ </parent> <modelVersion>4.0.0</modelVersion> - <artifactId>jersey-microprofile</artifactId> + <groupId>org.glassfish.jersey.ext.microprofile</groupId> + <artifactId>project</artifactId> <packaging>pom</packaging> <modules>
diff --git a/tests/integration/microprofile/rest-client/pom.xml b/tests/integration/microprofile/rest-client/pom.xml new file mode 100644 index 0000000..43ec537 --- /dev/null +++ b/tests/integration/microprofile/rest-client/pom.xml
@@ -0,0 +1,123 @@ +<?xml version="1.0" encoding="UTF-8"?> +<project xmlns="http://maven.apache.org/POM/4.0.0" + xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" + xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd"> + <parent> + <artifactId>project</artifactId> + <groupId>org.glassfish.jersey.tests.integration</groupId> + <version>2.29-SNAPSHOT</version> + <relativePath>../../pom.xml</relativePath> + </parent> + <modelVersion>4.0.0</modelVersion> + + <artifactId>jersey-rest-client-tck</artifactId> + + <dependencies> + <dependency> + <groupId>org.glassfish.jersey.ext.microprofile</groupId> + <artifactId>jersey-mp-rest-client</artifactId> + <scope>test</scope> + </dependency> + <!-- Overrides CDI from parent pom --> + <dependency> + <groupId>javax.enterprise</groupId> + <artifactId>cdi-api</artifactId> + <version>2.0</version> + </dependency> + <dependency> + <groupId>org.jboss.weld.se</groupId> + <artifactId>weld-se-core</artifactId> + <version>3.0.3.Final</version> + <scope>test</scope> + </dependency> + <dependency> + <groupId>io.smallrye</groupId> + <artifactId>smallrye-config</artifactId> + <version>1.3.6</version> + <scope>test</scope> + </dependency> + <dependency> + <groupId>org.eclipse.microprofile.rest.client</groupId> + <artifactId>microprofile-rest-client-tck</artifactId> + <version>1.2.1</version> + <scope>test</scope> + </dependency> + <dependency> + <groupId>org.testng</groupId> + <artifactId>testng</artifactId> + <scope>test</scope> + </dependency> + <dependency> + <groupId>com.github.tomakehurst</groupId> + <artifactId>wiremock</artifactId> + <version>2.21.0</version> + <scope>test</scope> + </dependency> +<!-- <dependency>--> +<!-- <groupId>org.jboss.arquillian.testng</groupId>--> +<!-- <artifactId>arquillian-testng-container</artifactId>--> +<!-- <version>1.4.1.Final</version>--> +<!-- <scope>test</scope>--> +<!-- </dependency>--> +<!-- <dependency>--> +<!-- <groupId>org.jboss.arquillian.container</groupId>--> +<!-- <artifactId>arquillian-container-test-spi</artifactId>--> +<!-- <version>1.4.1.Final</version>--> +<!-- <scope>test</scope>--> +<!-- </dependency>--> +<!-- <dependency>--> +<!-- <groupId>org.jboss.arquillian.container</groupId>--> +<!-- <artifactId>arquillian-weld-embedded</artifactId>--> +<!-- <version>2.0.1.Final</version>--> +<!-- <scope>test</scope>--> +<!-- </dependency>--> + <dependency> + <groupId>org.glassfish.jersey.test-framework</groupId> + <artifactId>jersey-test-framework-core</artifactId> + <scope>test</scope> + </dependency> + <dependency> + <groupId>org.glassfish.jersey.test-framework.providers</groupId> + <artifactId>jersey-test-framework-provider-bundle</artifactId> + <type>pom</type> + <scope>test</scope> + </dependency> + </dependencies> + + <build> + <plugins> + <plugin> + <groupId>org.apache.maven.plugins</groupId> + <artifactId>maven-surefire-plugin</artifactId> + <configuration> + <suiteXmlFiles> + <suiteXmlFile>tck-suite.xml</suiteXmlFile> + </suiteXmlFiles> + </configuration> + </plugin> + <plugin> + <groupId>uk.co.deliverymind</groupId> + <artifactId>wiremock-maven-plugin</artifactId> + <version>2.7.0</version> + <executions> + <execution> + <phase>test-compile</phase> + <goals> + <goal>run</goal> + </goals> + <configuration> + <dir>target/classes</dir> + <params>--port=8765 --verbose</params> + </configuration> + </execution> + </executions> + </plugin> + </plugins> + </build> + + <properties> + <surefire.security.argline>-Djava.security.manager -Djava.security.policy=${project.build.directory}/test-classes/server.policy</surefire.security.argline> + </properties> + + +</project> \ No newline at end of file
diff --git a/ext/microprofile/mp-rest-client/src/test/java/org/glassfish/jersey/message/internal/StringMessageProvider.java b/tests/integration/microprofile/rest-client/src/test/java/org/glassfish/jersey/message/internal/StringMessageProvider.java similarity index 100% rename from ext/microprofile/mp-rest-client/src/test/java/org/glassfish/jersey/message/internal/StringMessageProvider.java rename to tests/integration/microprofile/rest-client/src/test/java/org/glassfish/jersey/message/internal/StringMessageProvider.java
diff --git a/ext/microprofile/mp-rest-client/src/test/java/org/glassfish/jersey/microprofile/restclient/ApplicationResource.java b/tests/integration/microprofile/rest-client/src/test/java/org/glassfish/jersey/restclient/ApplicationResource.java similarity index 84% rename from ext/microprofile/mp-rest-client/src/test/java/org/glassfish/jersey/microprofile/restclient/ApplicationResource.java rename to tests/integration/microprofile/rest-client/src/test/java/org/glassfish/jersey/restclient/ApplicationResource.java index caf3bb6..0f6f8f6 100644 --- a/ext/microprofile/mp-rest-client/src/test/java/org/glassfish/jersey/microprofile/restclient/ApplicationResource.java +++ b/tests/integration/microprofile/rest-client/src/test/java/org/glassfish/jersey/restclient/ApplicationResource.java
@@ -14,7 +14,10 @@ * SPDX-License-Identifier: EPL-2.0 OR GPL-2.0 WITH Classpath-exception-2.0 */ -package org.glassfish.jersey.microprofile.restclient; +package org.glassfish.jersey.restclient; + +import java.util.List; +import java.util.Map; import javax.ws.rs.GET; import javax.ws.rs.POST; @@ -28,7 +31,12 @@ public interface ApplicationResource { @GET - String getValue(); + List<String> getValue(); + + + @GET + @Path("map") + Map<String, String> getTestMap(); @POST String postAppendValue(String value);
diff --git a/ext/microprofile/mp-rest-client/src/test/java/org/glassfish/jersey/microprofile/restclient/ApplicationResourceImpl.java b/tests/integration/microprofile/rest-client/src/test/java/org/glassfish/jersey/restclient/ApplicationResourceImpl.java similarity index 65% copy from ext/microprofile/mp-rest-client/src/test/java/org/glassfish/jersey/microprofile/restclient/ApplicationResourceImpl.java copy to tests/integration/microprofile/rest-client/src/test/java/org/glassfish/jersey/restclient/ApplicationResourceImpl.java index 4194b40..10c1a45 100644 --- a/ext/microprofile/mp-rest-client/src/test/java/org/glassfish/jersey/microprofile/restclient/ApplicationResourceImpl.java +++ b/tests/integration/microprofile/rest-client/src/test/java/org/glassfish/jersey/restclient/ApplicationResourceImpl.java
@@ -14,19 +14,33 @@ * SPDX-License-Identifier: EPL-2.0 OR GPL-2.0 WITH Classpath-exception-2.0 */ -package org.glassfish.jersey.microprofile.restclient; +package org.glassfish.jersey.restclient; + +import java.util.Arrays; +import java.util.HashMap; +import java.util.List; +import java.util.Map; /** * Created by David Kral. */ public class ApplicationResourceImpl implements ApplicationResource { @Override - public String getValue() { - return "This is default value!"; + public List<String> getValue() { + return Arrays.asList("This is default value!", "Test"); + } + + @Override + public Map<String, String> getTestMap() { + Map<String, String> testMap = new HashMap<>(); + testMap.put("firstKey", "firstValue"); + testMap.put("secondKey", "secondValue"); + return testMap; } @Override public String postAppendValue(String value) { return null; } + }
diff --git a/ext/microprofile/mp-rest-client/src/test/java/org/glassfish/jersey/microprofile/restclient/CorrectInterface.java b/tests/integration/microprofile/rest-client/src/test/java/org/glassfish/jersey/restclient/CorrectInterface.java similarity index 89% rename from ext/microprofile/mp-rest-client/src/test/java/org/glassfish/jersey/microprofile/restclient/CorrectInterface.java rename to tests/integration/microprofile/rest-client/src/test/java/org/glassfish/jersey/restclient/CorrectInterface.java index efe6c15..8a15121 100644 --- a/ext/microprofile/mp-rest-client/src/test/java/org/glassfish/jersey/microprofile/restclient/CorrectInterface.java +++ b/tests/integration/microprofile/rest-client/src/test/java/org/glassfish/jersey/restclient/CorrectInterface.java
@@ -14,7 +14,7 @@ * SPDX-License-Identifier: EPL-2.0 OR GPL-2.0 WITH Classpath-exception-2.0 */ -package org.glassfish.jersey.microprofile.restclient; +package org.glassfish.jersey.restclient; import javax.ws.rs.BeanParam; import javax.ws.rs.GET; @@ -43,7 +43,8 @@ void secondMethod(@PathParam("first") String first, String second); @POST - @ClientHeaderParam(name = "test", value = "org.glassfish.jersey.restclient.CustomHeaderGenerator.customHeader") + @ClientHeaderParam(name = "test", + value = "org.glassfish.jersey.org.glassfish.jersey.restclient.CustomHeaderGenerator.customHeader") void thirdMethod(@PathParam("first") String first); @GET
diff --git a/ext/microprofile/mp-rest-client/src/test/java/org/glassfish/jersey/microprofile/restclient/RestClientModelTest.java b/tests/integration/microprofile/rest-client/src/test/java/org/glassfish/jersey/restclient/RestClientModelTest.java similarity index 75% rename from ext/microprofile/mp-rest-client/src/test/java/org/glassfish/jersey/microprofile/restclient/RestClientModelTest.java rename to tests/integration/microprofile/rest-client/src/test/java/org/glassfish/jersey/restclient/RestClientModelTest.java index 046f528..186b3c6 100644 --- a/ext/microprofile/mp-rest-client/src/test/java/org/glassfish/jersey/microprofile/restclient/RestClientModelTest.java +++ b/tests/integration/microprofile/rest-client/src/test/java/org/glassfish/jersey/restclient/RestClientModelTest.java
@@ -14,10 +14,12 @@ * SPDX-License-Identifier: EPL-2.0 OR GPL-2.0 WITH Classpath-exception-2.0 */ -package org.glassfish.jersey.microprofile.restclient; +package org.glassfish.jersey.restclient; import java.net.URI; import java.net.URISyntaxException; +import java.util.List; +import java.util.Map; import org.eclipse.microprofile.rest.client.RestClientBuilder; import org.glassfish.jersey.server.ResourceConfig; @@ -42,7 +44,16 @@ ApplicationResource app = RestClientBuilder.newBuilder() .baseUri(new URI("http://localhost:9998")) .build(ApplicationResource.class); - assertEquals("This is default value!", app.getValue()); + List<String> collection = app.getValue(); + assertEquals(2, collection.size()); + assertEquals("This is default value!", collection.get(0)); + assertEquals("Test", collection.get(1)); + + Map<String, String> map = app.getTestMap(); + assertEquals(2, map.size()); + assertEquals("firstValue", map.get("firstKey")); + assertEquals("secondValue", map.get("secondKey")); + assertEquals("Hi", app.sayHi()); } }
diff --git a/ext/microprofile/mp-rest-client/src/test/resources/arquillian.xml b/tests/integration/microprofile/rest-client/src/test/resources/arquillian.xml similarity index 100% rename from ext/microprofile/mp-rest-client/src/test/resources/arquillian.xml rename to tests/integration/microprofile/rest-client/src/test/resources/arquillian.xml
diff --git a/ext/microprofile/mp-rest-client/src/test/java/org/glassfish/jersey/microprofile/restclient/ApplicationResourceImpl.java b/tests/integration/microprofile/rest-client/src/test/resources/server.policy similarity index 66% rename from ext/microprofile/mp-rest-client/src/test/java/org/glassfish/jersey/microprofile/restclient/ApplicationResourceImpl.java rename to tests/integration/microprofile/rest-client/src/test/resources/server.policy index 4194b40..0a3ee57 100644 --- a/ext/microprofile/mp-rest-client/src/test/java/org/glassfish/jersey/microprofile/restclient/ApplicationResourceImpl.java +++ b/tests/integration/microprofile/rest-client/src/test/resources/server.policy
@@ -14,19 +14,6 @@ * SPDX-License-Identifier: EPL-2.0 OR GPL-2.0 WITH Classpath-exception-2.0 */ -package org.glassfish.jersey.microprofile.restclient; - -/** - * Created by David Kral. - */ -public class ApplicationResourceImpl implements ApplicationResource { - @Override - public String getValue() { - return "This is default value!"; - } - - @Override - public String postAppendValue(String value) { - return null; - } -} +grant { + permission java.security.AllPermission; +};
diff --git a/ext/microprofile/mp-rest-client/tck-suite.xml b/tests/integration/microprofile/rest-client/tck-suite.xml similarity index 100% rename from ext/microprofile/mp-rest-client/tck-suite.xml rename to tests/integration/microprofile/rest-client/tck-suite.xml
diff --git a/tests/integration/pom.xml b/tests/integration/pom.xml index da87c12..8f6c1fc 100644 --- a/tests/integration/pom.xml +++ b/tests/integration/pom.xml
@@ -136,6 +136,7 @@ <module>tracing-support</module> <module>microprofile/config/helidon</module> <module>microprofile/config/webapp</module> +<!-- <module>microprofile/rest-client</module>--> </modules> <profiles>