You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@cxf.apache.org by se...@apache.org on 2015/08/05 13:17:12 UTC
cxf git commit: [CXF-6515] Better support for custom mbr/mbw
comparators
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 <sb...@gmail.com>
Authored: Wed Aug 5 12:16:53 2015 +0100
Committer: Sergey Beryozkin <sb...@gmail.com>
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>();