This is an automated email from the ASF dual-hosted git repository. dblevins pushed a commit to branch master in repository https://gitbox.apache.org/repos/asf/tomee-jakarta.git
commit e56ec49370e22257a8f5d8420ece459035fcbde7 Author: David Blevins <[email protected]> AuthorDate: Sun May 2 21:35:35 2021 -0700 cxf-rt-frontend-jaxrs changes since 3.4.3 --- tomee/tomee-plume-webapp/pom.xml | 7 ++ .../cxf/jaxrs/provider/AbstractJAXBProvider.java | 14 +--- .../apache/cxf/jaxrs/provider/ProviderFactory.java | 98 ++-------------------- .../org/apache/cxf/jaxrs/utils/InjectionUtils.java | 50 +++++------ .../org/apache/cxf/jaxrs/utils/JAXRSUtils.java | 18 +--- 5 files changed, 46 insertions(+), 141 deletions(-) diff --git a/tomee/tomee-plume-webapp/pom.xml b/tomee/tomee-plume-webapp/pom.xml index c62d43c..2e727e5 100644 --- a/tomee/tomee-plume-webapp/pom.xml +++ b/tomee/tomee-plume-webapp/pom.xml @@ -550,6 +550,13 @@ </add> <source>1.8</source> <target>1.8</target> + <dependencies> + <dependency>org.apache.tomcat:tomcat-servlet-api:jar:10.0.4</dependency> + <dependency>org.springframework:spring-core:jar:5.3.6</dependency> + <dependency>org.springframework:spring-context:jar:5.3.6</dependency> + <dependency>org.springframework:spring-beans:jar:5.3.6</dependency> + <dependency>org.springframework:spring-webmvc:jar:5.3.6</dependency> + </dependencies> </configuration> <executions> <execution> diff --git a/transform/src/patch/java/org/apache/cxf/jaxrs/provider/AbstractJAXBProvider.java b/transform/src/patch/java/org/apache/cxf/jaxrs/provider/AbstractJAXBProvider.java index b94760a..f2bee17 100644 --- a/transform/src/patch/java/org/apache/cxf/jaxrs/provider/AbstractJAXBProvider.java +++ b/transform/src/patch/java/org/apache/cxf/jaxrs/provider/AbstractJAXBProvider.java @@ -42,7 +42,6 @@ import java.util.concurrent.ConcurrentHashMap; import javax.ws.rs.WebApplicationException; import javax.ws.rs.core.MediaType; import javax.ws.rs.core.MultivaluedMap; -import javax.ws.rs.core.NoContentException; import javax.ws.rs.core.Response; import javax.ws.rs.core.StreamingOutput; import javax.ws.rs.ext.ContextResolver; @@ -69,8 +68,6 @@ import org.w3c.dom.Element; import org.xml.sax.helpers.DefaultHandler; -import com.ctc.wstx.exc.WstxEOFException; - import org.apache.cxf.annotations.SchemaValidation; import org.apache.cxf.common.jaxb.JAXBUtils; import org.apache.cxf.common.util.PackageUtils; @@ -722,12 +719,7 @@ public abstract class AbstractJAXBProvider<T> extends AbstractConfigurableProvid return sb; } - protected static void handleExceptionEnd(Throwable t, String message, boolean read) throws NoContentException { - if (t instanceof WstxEOFException && t.getMessage().startsWith("Unexpected EOF in prolog")){ - String noContent = new org.apache.cxf.common.i18n.Message("EMPTY_BODY", BUNDLE).toString(); - LOG.warning(noContent); - throw new NoContentException(noContent); - } + protected static void handleExceptionEnd(Throwable t, String message, boolean read) { Response.Status status = read ? Response.Status.BAD_REQUEST : Response.Status.INTERNAL_SERVER_ERROR; Response r = JAXRSUtils.toResponseBuilder(status) @@ -736,7 +728,7 @@ public abstract class AbstractJAXBProvider<T> extends AbstractConfigurableProvid : ExceptionUtils.toInternalServerErrorException(t, r); } - protected void handleJAXBException(JAXBException e, boolean read) throws NoContentException { + protected void handleJAXBException(JAXBException e, boolean read) { StringBuilder sb = handleExceptionStart(e); Throwable linked = e.getLinkedException(); if (linked != null && linked.getMessage() != null) { @@ -761,7 +753,7 @@ public abstract class AbstractJAXBProvider<T> extends AbstractConfigurableProvid handleExceptionEnd(t, message, read); } - protected void handleXMLStreamException(XMLStreamException e, boolean read) throws NoContentException { + protected void handleXMLStreamException(XMLStreamException e, boolean read) { StringBuilder sb = handleExceptionStart(e); handleExceptionEnd(e, sb.toString(), read); } diff --git a/transform/src/patch/java/org/apache/cxf/jaxrs/provider/ProviderFactory.java b/transform/src/patch/java/org/apache/cxf/jaxrs/provider/ProviderFactory.java index 65c417c..c8a0aff 100644 --- a/transform/src/patch/java/org/apache/cxf/jaxrs/provider/ProviderFactory.java +++ b/transform/src/patch/java/org/apache/cxf/jaxrs/provider/ProviderFactory.java @@ -39,7 +39,6 @@ import java.util.Set; import java.util.TreeMap; import java.util.logging.Logger; -import javax.annotation.Priority; import javax.ws.rs.Produces; import javax.ws.rs.core.Application; import javax.ws.rs.core.Configuration; @@ -78,8 +77,6 @@ import org.apache.cxf.jaxrs.utils.ResourceUtils; import org.apache.cxf.message.Message; import org.apache.cxf.message.MessageUtils; -import static javax.ws.rs.Priorities.USER; - public abstract class ProviderFactory { public static final String DEFAULT_FILTER_NAME_BINDING = "org.apache.cxf.filter.binding"; public static final String PROVIDER_SELECTION_PROPERTY_CHANGED = "provider.selection.property.changed"; @@ -665,7 +662,6 @@ public abstract class ProviderFactory { sortReaders(); sortWriters(); sortContextResolvers(); - sortParamConverters(); mapInterceptorFilters(readerInterceptors, readInts, ReaderInterceptor.class, true); mapInterceptorFilters(writerInterceptors, writeInts, WriterInterceptor.class, true); @@ -787,9 +783,7 @@ public abstract class ProviderFactory { contextResolvers.sort(new ContextResolverComparator()); } - private void sortParamConverters() { - paramConverters.sort(new ParamConverterComparator()); - } + @@ -859,12 +853,9 @@ public abstract class ProviderFactory { setProviders(true, false, userProviders.toArray()); } - static class MessageBodyReaderComparator + private static class MessageBodyReaderComparator implements Comparator<ProviderInfo<MessageBodyReader<?>>> { - private final GenericArgumentComparator classComparator = - new GenericArgumentComparator(MessageBodyReader.class); - public int compare(ProviderInfo<MessageBodyReader<?>> p1, ProviderInfo<MessageBodyReader<?>> p2) { MessageBodyReader<?> e1 = p1.getProvider(); @@ -879,10 +870,7 @@ public abstract class ProviderFactory { if (result != 0) { return result; } - - final Class<?> class1 = ClassHelper.getRealClass(e1); - final Class<?> class2 = ClassHelper.getRealClass(e2); - result = classComparator.compare(class1, class2); + result = compareClasses(e1, e2); if (result != 0) { return result; } @@ -890,30 +878,19 @@ public abstract class ProviderFactory { if (result != 0) { return result; } - - result = comparePriorityStatus(p1.getProvider().getClass(), p2.getProvider().getClass()); - if (result != 0) { - return result; - } - - return p1.getProvider().getClass().getName().compareTo(p2.getProvider().getClass().getName()); + return comparePriorityStatus(p1.getProvider().getClass(), p2.getProvider().getClass()); } } - static class MessageBodyWriterComparator + private static class MessageBodyWriterComparator implements Comparator<ProviderInfo<MessageBodyWriter<?>>> { - private final GenericArgumentComparator classComparator = - new GenericArgumentComparator(MessageBodyWriter.class); - public int compare(ProviderInfo<MessageBodyWriter<?>> p1, ProviderInfo<MessageBodyWriter<?>> p2) { MessageBodyWriter<?> e1 = p1.getProvider(); MessageBodyWriter<?> e2 = p2.getProvider(); - final Class<?> class1 = ClassHelper.getRealClass(e1); - final Class<?> class2 = ClassHelper.getRealClass(e2); - int result = classComparator.compare(class1, class2); + int result = compareClasses(e1, e2); if (result != 0) { return result; } @@ -926,18 +903,13 @@ public abstract class ProviderFactory { if (result != 0) { return result; } - + result = compareCustomStatus(p1, p2); if (result != 0) { return result; } - result = comparePriorityStatus(p1.getProvider().getClass(), p2.getProvider().getClass()); - if (result != 0) { - return result; - } - - return p1.getProvider().getClass().getName().compareTo(p2.getProvider().getClass().getName()); + return comparePriorityStatus(p1.getProvider().getClass(), p2.getProvider().getClass()); } } @@ -1164,7 +1136,7 @@ public abstract class ProviderFactory { // superclass should go last return -1; } - + // there is no relation between the types returned by the providers return 0; } @@ -1523,56 +1495,4 @@ public abstract class ProviderFactory { writerInterceptors = sortedWriterInterceptors; } - protected static class ParamConverterComparator implements Comparator<ProviderInfo<ParamConverterProvider>> { - - @Override - public int compare(final ProviderInfo<ParamConverterProvider> a, - final ProviderInfo<ParamConverterProvider> b) { - - /* - * Primary sort. Also takes care of sorting custom - * converters from system converters due to priority - * defaults - */ - int result = sortByPriority(a, b); - - /* - * Secondary sort as this list *will* change order - * once in a while between jvm restarts, which can - * have frustrating consequences for users who are - * expecting no change in behavior as they aren't - * changing their code. - */ - if (result == 0) { - result = sortByClassName(a, b); - } - - return result; - } - - public int sortByPriority(final ProviderInfo<ParamConverterProvider> a, - final ProviderInfo<ParamConverterProvider> b) { - final int aPriority = getPriority(a); - final int bPriority = getPriority(b); - - // Sort ascending as the priority with the lowest number wins - return Integer.compare(aPriority, bPriority); - } - - public int sortByClassName(final ProviderInfo<ParamConverterProvider> a, - final ProviderInfo<ParamConverterProvider> b) { - - // Sort ascending as the priority with the lowest number wins - return a.getProvider().getClass().getName().compareTo(b.getProvider().getClass().getName()); - } - - private int getPriority(final ProviderInfo<ParamConverterProvider> providerInfo) { - final Priority priority = providerInfo.getProvider().getClass().getAnnotation(Priority.class); - if (priority!=null) { - return priority.value(); - } - return providerInfo.isCustom() ? USER : USER + 1000; - } - } - } diff --git a/transform/src/patch/java/org/apache/cxf/jaxrs/utils/InjectionUtils.java b/transform/src/patch/java/org/apache/cxf/jaxrs/utils/InjectionUtils.java index dca074a..5543093 100644 --- a/transform/src/patch/java/org/apache/cxf/jaxrs/utils/InjectionUtils.java +++ b/transform/src/patch/java/org/apache/cxf/jaxrs/utils/InjectionUtils.java @@ -53,20 +53,20 @@ import java.util.TreeSet; import java.util.logging.Level; import java.util.logging.Logger; -import jakarta.ws.rs.WebApplicationException; -import jakarta.ws.rs.core.Application; -import jakarta.ws.rs.core.GenericEntity; -import jakarta.ws.rs.core.HttpHeaders; -import jakarta.ws.rs.core.MediaType; -import jakarta.ws.rs.core.MultivaluedMap; -import jakarta.ws.rs.core.PathSegment; -import jakarta.ws.rs.core.Request; -import jakarta.ws.rs.core.Response; -import jakarta.ws.rs.core.SecurityContext; -import jakarta.ws.rs.core.UriInfo; -import jakarta.ws.rs.ext.ContextResolver; -import jakarta.ws.rs.ext.ParamConverter; -import jakarta.ws.rs.ext.Providers; +import javax.ws.rs.WebApplicationException; +import javax.ws.rs.core.Application; +import javax.ws.rs.core.GenericEntity; +import javax.ws.rs.core.HttpHeaders; +import javax.ws.rs.core.MediaType; +import javax.ws.rs.core.MultivaluedMap; +import javax.ws.rs.core.PathSegment; +import javax.ws.rs.core.Request; +import javax.ws.rs.core.Response; +import javax.ws.rs.core.SecurityContext; +import javax.ws.rs.core.UriInfo; +import javax.ws.rs.ext.ContextResolver; +import javax.ws.rs.ext.ParamConverter; +import javax.ws.rs.ext.Providers; import org.apache.cxf.common.classloader.ClassLoaderUtils; import org.apache.cxf.common.i18n.BundleUtils; @@ -537,19 +537,15 @@ public final class InjectionUtils { } private static RuntimeException createParamConversionException(ParameterType pType, Exception ex) { - /* - * Loosely related to the following section of the Jakarta REST specification: - * - * At least one of the acceptable response entity body media types is a supported output data - * format (see Section 3.5). If no methods support one of the acceptable response entity body - * media types an implementation MUST generate a NotAcceptableException (406 status) - * and no entity. - * - * Tested by: - * com.sun.ts.tests.jaxrs.ee.rs.ext.paramconverter.JAXRSClient - * atomicIntegerIsLazyDeployableAndThrowsErrorTest_from_standalone - */ - return ExceptionUtils.toNotAcceptableException(ex, null); + // + // For path, query & matrix parameters this is 404, + // for others 400... + // + if (pType == ParameterType.PATH || pType == ParameterType.QUERY + || pType == ParameterType.MATRIX) { + return ExceptionUtils.toNotFoundException(ex, null); + } + return ExceptionUtils.toBadRequestException(ex, null); } public static <T> Optional<ParamConverter<T>> getParamConverter(Class<T> pClass, diff --git a/transform/src/patch/java/org/apache/cxf/jaxrs/utils/JAXRSUtils.java b/transform/src/patch/java/org/apache/cxf/jaxrs/utils/JAXRSUtils.java index 3f0073a..f264b48 100644 --- a/transform/src/patch/java/org/apache/cxf/jaxrs/utils/JAXRSUtils.java +++ b/transform/src/patch/java/org/apache/cxf/jaxrs/utils/JAXRSUtils.java @@ -47,7 +47,6 @@ import java.util.logging.Level; import java.util.logging.Logger; import java.util.stream.Collectors; -import javax.activation.DataSource; import javax.ws.rs.ClientErrorException; import javax.ws.rs.Consumes; import javax.ws.rs.HttpMethod; @@ -66,7 +65,6 @@ import javax.ws.rs.core.Cookie; import javax.ws.rs.core.HttpHeaders; import javax.ws.rs.core.MediaType; import javax.ws.rs.core.MultivaluedMap; -import javax.ws.rs.core.NoContentException; import javax.ws.rs.core.PathSegment; import javax.ws.rs.core.Request; import javax.ws.rs.core.Response; @@ -166,11 +164,11 @@ public final class JAXRSUtils { private static final ResourceBundle BUNDLE = BundleUtils.getBundle(JAXRSUtils.class); private static final String PATH_SEGMENT_SEP = "/"; private static final String REPORT_FAULT_MESSAGE_PROPERTY = "org.apache.cxf.jaxrs.report-fault-message"; - private static final String NO_CONTENT_EXCEPTION = NoContentException.class.getName(); + private static final String NO_CONTENT_EXCEPTION = "javax.ws.rs.core.NoContentException"; private static final String HTTP_CHARSET_PARAM = "charset"; private static final Annotation[] EMPTY_ANNOTATIONS = new Annotation[0]; private static final Set<Class<?>> STREAMING_OUT_TYPES = new HashSet<>( - Arrays.asList(InputStream.class, Reader.class, StreamingOutput.class, DataSource.class)); + Arrays.asList(InputStream.class, Reader.class, StreamingOutput.class)); private JAXRSUtils() { } @@ -396,8 +394,6 @@ public final class JAXRSUtils { int methodMatched = 0; int consumeMatched = 0; - boolean resourceMethodsAdded = false; - boolean generateOptionsResponse = false; List<OperationResourceInfo> finalPathSubresources = null; for (Map.Entry<ClassResourceInfo, MultivaluedMap<String, String>> rEntry : matchedResources.entrySet()) { ClassResourceInfo resource = rEntry.getKey(); @@ -437,21 +433,18 @@ public final class JAXRSUtils { if (matchProduceTypes(acceptType, ori)) { candidateList.put(ori, map); added = true; - resourceMethodsAdded = true; break; } } } //CHECKSTYLE:ON - } else if ("OPTIONS".equalsIgnoreCase(httpMethod)) { - generateOptionsResponse = true; } } } LOG.fine(matchMessageLogSupplier(ori, path, httpMethod, requestType, acceptContentTypes, added)); } } - if (finalPathSubresources != null && (resourceMethodsAdded || generateOptionsResponse) + if (finalPathSubresources != null && pathMatched > 0 && !MessageUtils.getContextualBoolean(message, KEEP_SUBRESOURCE_CANDIDATES, false)) { for (OperationResourceInfo key : finalPathSubresources) { candidateList.remove(key); @@ -1191,10 +1184,7 @@ public final class JAXRSUtils { } else if (ResourceInfo.class.isAssignableFrom(clazz)) { o = new ResourceInfoImpl(contextMessage); } else if (ResourceContext.class.isAssignableFrom(clazz)) { - OperationResourceInfo operationResourceInfo = contextMessage.getExchange().get(OperationResourceInfo.class); - if (operationResourceInfo != null) { - o = new ResourceContextImpl(contextMessage, operationResourceInfo); - } + o = new ResourceContextImpl(contextMessage, contextMessage.getExchange().get(OperationResourceInfo.class)); } else if (Request.class.isAssignableFrom(clazz)) { o = new RequestImpl(contextMessage); } else if (Providers.class.isAssignableFrom(clazz)) {
