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 7d50e1dc650abc2dc0fbc66fda193a6dcfa68afe Author: David Blevins <[email protected]> AuthorDate: Fri Apr 30 01:46:28 2021 -0700 TOMEE-3164 jaxrs.jaxrs21.ee.priority paramConverterPriorityTest --- .../apache/cxf/jaxrs/provider/ProviderFactory.java | 86 ++++++++++++++++++---- 1 file changed, 72 insertions(+), 14 deletions(-) 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 43f36ec..65c417c 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,19 +39,20 @@ import java.util.Set; import java.util.TreeMap; import java.util.logging.Logger; -import jakarta.ws.rs.Produces; -import jakarta.ws.rs.core.Application; -import jakarta.ws.rs.core.Configuration; -import jakarta.ws.rs.core.MediaType; -import jakarta.ws.rs.core.MultivaluedMap; -import jakarta.ws.rs.ext.ContextResolver; -import jakarta.ws.rs.ext.ExceptionMapper; -import jakarta.ws.rs.ext.MessageBodyReader; -import jakarta.ws.rs.ext.MessageBodyWriter; -import jakarta.ws.rs.ext.ParamConverter; -import jakarta.ws.rs.ext.ParamConverterProvider; -import jakarta.ws.rs.ext.ReaderInterceptor; -import jakarta.ws.rs.ext.WriterInterceptor; +import javax.annotation.Priority; +import javax.ws.rs.Produces; +import javax.ws.rs.core.Application; +import javax.ws.rs.core.Configuration; +import javax.ws.rs.core.MediaType; +import javax.ws.rs.core.MultivaluedMap; +import javax.ws.rs.ext.ContextResolver; +import javax.ws.rs.ext.ExceptionMapper; +import javax.ws.rs.ext.MessageBodyReader; +import javax.ws.rs.ext.MessageBodyWriter; +import javax.ws.rs.ext.ParamConverter; +import javax.ws.rs.ext.ParamConverterProvider; +import javax.ws.rs.ext.ReaderInterceptor; +import javax.ws.rs.ext.WriterInterceptor; import org.apache.cxf.Bus; import org.apache.cxf.common.classloader.ClassLoaderUtils; @@ -77,6 +78,8 @@ 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"; @@ -662,6 +665,7 @@ public abstract class ProviderFactory { sortReaders(); sortWriters(); sortContextResolvers(); + sortParamConverters(); mapInterceptorFilters(readerInterceptors, readInts, ReaderInterceptor.class, true); mapInterceptorFilters(writerInterceptors, writeInts, WriterInterceptor.class, true); @@ -783,7 +787,9 @@ public abstract class ProviderFactory { contextResolvers.sort(new ContextResolverComparator()); } - + private void sortParamConverters() { + paramConverters.sort(new ParamConverterComparator()); + } @@ -1517,4 +1523,56 @@ 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; + } + } + }
