Repository: cxf Updated Branches: refs/heads/master 6f2a98efa -> 829feade0
[CXF-6515] Better support for custom mbr/mbw comparators Project: http://git-wip-us.apache.org/repos/asf/cxf/repo Commit: http://git-wip-us.apache.org/repos/asf/cxf/commit/829feade Tree: http://git-wip-us.apache.org/repos/asf/cxf/tree/829feade Diff: http://git-wip-us.apache.org/repos/asf/cxf/diff/829feade Branch: refs/heads/master Commit: 829feade0823a5d5a9c7b5b5136ca882bf2536e4 Parents: 6f2a98e Author: Sergey Beryozkin <[email protected]> Authored: Wed Aug 5 12:16:53 2015 +0100 Committer: Sergey Beryozkin <[email protected]> Committed: Wed Aug 5 12:16:53 2015 +0100 ---------------------------------------------------------------------- .../cxf/jaxrs/AbstractJAXRSFactoryBean.java | 17 +++++++--- .../cxf/jaxrs/provider/ProviderFactory.java | 28 ++++++++-------- .../cxf/jaxrs/provider/ProviderFactoryTest.java | 34 ++++++++++++++++++++ 3 files changed, 61 insertions(+), 18 deletions(-) ---------------------------------------------------------------------- http://git-wip-us.apache.org/repos/asf/cxf/blob/829feade/rt/frontend/jaxrs/src/main/java/org/apache/cxf/jaxrs/AbstractJAXRSFactoryBean.java ---------------------------------------------------------------------- diff --git a/rt/frontend/jaxrs/src/main/java/org/apache/cxf/jaxrs/AbstractJAXRSFactoryBean.java b/rt/frontend/jaxrs/src/main/java/org/apache/cxf/jaxrs/AbstractJAXRSFactoryBean.java index b9dfbbf..d467689 100644 --- a/rt/frontend/jaxrs/src/main/java/org/apache/cxf/jaxrs/AbstractJAXRSFactoryBean.java +++ b/rt/frontend/jaxrs/src/main/java/org/apache/cxf/jaxrs/AbstractJAXRSFactoryBean.java @@ -71,7 +71,8 @@ public class AbstractJAXRSFactoryBean extends AbstractEndpointFactory { protected List<String> schemaLocations; protected JAXRSServiceFactoryBean serviceFactory; protected List<Object> entityProviders = new LinkedList<Object>(); - private Comparator<?> providerComparator; + private Comparator<?> messageReaderComparator; + private Comparator<?> messageWriterComparator; protected AbstractJAXRSFactoryBean(JAXRSServiceFactoryBean serviceFactory) { this.serviceFactory = serviceFactory; @@ -325,8 +326,11 @@ public class AbstractJAXRSFactoryBean extends AbstractEndpointFactory { } protected void setupFactory(ProviderFactory factory, Endpoint ep) { - if (providerComparator != null) { - factory.setProviderComparator(providerComparator); + if (messageReaderComparator != null) { + factory.setMessageReaderComparator(messageReaderComparator); + } + if (messageWriterComparator != null) { + factory.setMessageWriterComparator(messageWriterComparator); } if (entityProviders != null) { factory.setUserProviders(entityProviders); @@ -432,8 +436,11 @@ public class AbstractJAXRSFactoryBean extends AbstractEndpointFactory { } } - public void setProviderComparator(Comparator<?> providerComparator) { - this.providerComparator = providerComparator; + public void setMessageWriterComparator(Comparator<?> messageWriterComparator) { + this.messageWriterComparator = messageWriterComparator; + } + public void setMessageReaderComparator(Comparator<?> messageReaderComparator) { + this.messageReaderComparator = messageReaderComparator; } http://git-wip-us.apache.org/repos/asf/cxf/blob/829feade/rt/frontend/jaxrs/src/main/java/org/apache/cxf/jaxrs/provider/ProviderFactory.java ---------------------------------------------------------------------- diff --git a/rt/frontend/jaxrs/src/main/java/org/apache/cxf/jaxrs/provider/ProviderFactory.java b/rt/frontend/jaxrs/src/main/java/org/apache/cxf/jaxrs/provider/ProviderFactory.java index c042093..830036b 100644 --- a/rt/frontend/jaxrs/src/main/java/org/apache/cxf/jaxrs/provider/ProviderFactory.java +++ b/rt/frontend/jaxrs/src/main/java/org/apache/cxf/jaxrs/provider/ProviderFactory.java @@ -114,7 +114,8 @@ public abstract class ProviderFactory { private Bus bus; - private Comparator<?> providerComparator; + private Comparator<?> messageWriterComparator; + private Comparator<?> messageReaderComparator; protected ProviderFactory(Bus bus) { this.bus = bus; @@ -562,25 +563,25 @@ public abstract class ProviderFactory { * x/y;q=1.0 < x/y;q=0.7. */ private void sortReaders() { - if (providerComparator == null) { + if (messageReaderComparator == null) { Collections.sort(messageReaders, new MessageBodyReaderComparator()); } else { - doCustomSort(messageReaders); + doCustomSort(messageReaderComparator, messageReaders); } } private <T> void sortWriters() { - if (providerComparator == null) { + if (messageWriterComparator == null) { Collections.sort(messageWriters, new MessageBodyWriterComparator()); } else { - doCustomSort(messageWriters); + doCustomSort(messageWriterComparator, messageWriters); } } - private <T> void doCustomSort(List<?> listOfProviders) { + private static <T> void doCustomSort(Comparator<?> comparator, List<?> listOfProviders) { @SuppressWarnings("unchecked") - List<T> theProviders = (List<T>)messageReaders; + List<T> theProviders = (List<T>)listOfProviders; @SuppressWarnings("unchecked") - Comparator<? super T> theComparator = (Comparator<? super T>)providerComparator; + Comparator<? super T> theComparator = (Comparator<? super T>)comparator; Collections.sort((List<T>)theProviders, theComparator); } @@ -1174,11 +1175,12 @@ public abstract class ProviderFactory { return null; } - public Comparator<?> getProviderComparator() { - return providerComparator; + public void setMessageWriterComparator(Comparator<?> messageWriterComparator) { + this.messageWriterComparator = messageWriterComparator; + sortWriters(); } - - public void setProviderComparator(Comparator<?> providerComparator) { - this.providerComparator = providerComparator; + public void setMessageReaderComparator(Comparator<?> messageReaderComparator) { + this.messageReaderComparator = messageReaderComparator; + sortReaders(); } } http://git-wip-us.apache.org/repos/asf/cxf/blob/829feade/rt/frontend/jaxrs/src/test/java/org/apache/cxf/jaxrs/provider/ProviderFactoryTest.java ---------------------------------------------------------------------- diff --git a/rt/frontend/jaxrs/src/test/java/org/apache/cxf/jaxrs/provider/ProviderFactoryTest.java b/rt/frontend/jaxrs/src/test/java/org/apache/cxf/jaxrs/provider/ProviderFactoryTest.java index 2d1e74c..535b463 100644 --- a/rt/frontend/jaxrs/src/test/java/org/apache/cxf/jaxrs/provider/ProviderFactoryTest.java +++ b/rt/frontend/jaxrs/src/test/java/org/apache/cxf/jaxrs/provider/ProviderFactoryTest.java @@ -27,6 +27,7 @@ import java.lang.annotation.Annotation; import java.lang.reflect.Type; import java.util.ArrayList; import java.util.Collections; +import java.util.Comparator; import java.util.List; import java.util.Map; @@ -99,6 +100,39 @@ public class ProviderFactoryTest extends Assert { } @Test + public void testCustomProviderSorting() { + ProviderFactory pf = ServerProviderFactory.getInstance(); + Comparator<?> comp = new Comparator<ProviderInfo<?>>() { + + @Override + public int compare(ProviderInfo<?> o1, ProviderInfo<?> o2) { + Object provider1 = o1.getProvider(); + Object provider2 = o2.getProvider(); + if (provider1 instanceof StringTextProvider) { + return 1; + } else if (provider2 instanceof StringTextProvider) { + return -1; + } else { + return 0; + } + } + + }; + // writers + pf.setMessageWriterComparator(comp); + List<ProviderInfo<MessageBodyWriter<?>>> writers = pf.getMessageWriters(); + assertEquals(8, writers.size()); + Object lastWriter = writers.get(7).getProvider(); + assertTrue(lastWriter instanceof StringTextProvider); + //readers + pf.setMessageReaderComparator(comp); + List<ProviderInfo<MessageBodyReader<?>>> readers = pf.getMessageReaders(); + assertEquals(8, readers.size()); + Object lastReader = readers.get(7).getProvider(); + assertTrue(lastReader instanceof StringTextProvider); + } + + @Test public void testCustomJaxbProvider() { ProviderFactory pf = ServerProviderFactory.getInstance(); JAXBElementProvider<Book> provider = new JAXBElementProvider<Book>();
