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 2012/10/10 17:05:58 UTC
svn commit: r1396630 -
/cxf/trunk/rt/rs/extensions/providers/src/main/java/org/apache/cxf/jaxrs/provider/atom/AtomPojoProvider.java
Author: sergeyb
Date: Wed Oct 10 15:05:58 2012
New Revision: 1396630
URL: http://svn.apache.org/viewvc?rev=1396630&view=rev
Log:
Updating AtomPojoProvider to cope with the side-effect of object class possibly not matching the configured names
Modified:
cxf/trunk/rt/rs/extensions/providers/src/main/java/org/apache/cxf/jaxrs/provider/atom/AtomPojoProvider.java
Modified: cxf/trunk/rt/rs/extensions/providers/src/main/java/org/apache/cxf/jaxrs/provider/atom/AtomPojoProvider.java
URL: http://svn.apache.org/viewvc/cxf/trunk/rt/rs/extensions/providers/src/main/java/org/apache/cxf/jaxrs/provider/atom/AtomPojoProvider.java?rev=1396630&r1=1396629&r2=1396630&view=diff
==============================================================================
--- cxf/trunk/rt/rs/extensions/providers/src/main/java/org/apache/cxf/jaxrs/provider/atom/AtomPojoProvider.java (original)
+++ cxf/trunk/rt/rs/extensions/providers/src/main/java/org/apache/cxf/jaxrs/provider/atom/AtomPojoProvider.java Wed Oct 10 15:05:58 2012
@@ -160,13 +160,14 @@ public class AtomPojoProvider extends Ab
} else if (!isFeed && isCollection) {
reportError("Atom entry can only be created from a single object", null);
}
+ Factory factory = Abdera.getNewFactory();
Element atomElement = null;
try {
if (isFeed && !isCollection) {
- atomElement = createFeedFromCollectionWrapper(o, cls);
+ atomElement = createFeedFromCollectionWrapper(factory, o, cls);
} else if (!isFeed && !isCollection) {
- atomElement = createEntryFromObject(o, cls);
+ atomElement = createEntryFromObject(factory, o, cls);
}
} catch (Exception ex) {
throw new WebApplicationException(ex);
@@ -196,9 +197,9 @@ public class AtomPojoProvider extends Ab
this.formattedOutput = formattedOutput;
}
- protected Feed createFeedFromCollectionWrapper(Object o, Class<?> pojoClass) throws Exception {
+ protected Feed createFeedFromCollectionWrapper(Factory factory, Object o, Class<?> pojoClass)
+ throws Exception {
- Factory factory = Abdera.getNewFactory();
Feed feed = factory.newFeed();
boolean writerUsed = buildFeed(feed, o, pojoClass);
@@ -224,7 +225,7 @@ public class AtomPojoProvider extends Ab
private String getCollectionMethod(Class<?> cls, boolean getter) {
Map<String, String> map = getter ? collectionGetters : collectionSetters;
- String methodName = map.get(cls.getName());
+ String methodName = getCollectionMethod(map, cls);
if (methodName == null) {
try {
methodName = (getter ? "get" : "set") + cls.getSimpleName();
@@ -239,6 +240,18 @@ public class AtomPojoProvider extends Ab
return methodName;
}
+ private String getCollectionMethod(Map<String, String> map, Class<?> pojoClass) {
+ if (pojoClass == Object.class) {
+ return null;
+ }
+ String method = map.get(pojoClass.getName());
+ if (method != null) {
+ return method;
+ } else {
+ return getCollectionMethod(map, pojoClass.getSuperclass());
+ }
+ }
+
@SuppressWarnings("unchecked")
protected <X> boolean buildFeed(Feed feed, X o, Class<?> pojoClass) {
AtomElementWriter<?, ?> builder = getAtomWriter(pojoClass);
@@ -250,13 +263,50 @@ public class AtomPojoProvider extends Ab
}
protected AtomElementWriter<?, ?> getAtomWriter(Class<?> pojoClass) {
- AtomElementWriter<?, ?> writer = atomClassWriters.get(pojoClass);
- return writer == null ? atomWriters.get(pojoClass.getName()) : writer;
+ AtomElementWriter<?, ?> writer = getAtomClassElementHandler(atomClassWriters, pojoClass);
+ return writer == null && atomWriters != null
+ ? getAtomElementHandler(atomWriters, pojoClass) : writer;
}
protected AtomElementReader<?, ?> getAtomReader(Class<?> pojoClass) {
- AtomElementReader<?, ?> reader = atomClassReaders.get(pojoClass);
- return reader == null ? atomReaders.get(pojoClass.getName()) : reader;
+ AtomElementReader<?, ?> reader = getAtomClassElementHandler(atomClassReaders, pojoClass);
+ return reader == null && atomReaders != null
+ ? getAtomElementHandler(atomReaders, pojoClass) : reader;
+ }
+
+ private <T> T getAtomClassElementHandler(Map<Class<?>, T> handlers, Class<?> pojoClass) {
+ for (Map.Entry<Class<?>, T> entry : handlers.entrySet()) {
+ if (entry.getKey().isAssignableFrom(pojoClass)) {
+ return entry.getValue();
+ }
+ }
+ return null;
+ }
+
+ private <T> T getAtomElementHandler(Map<String, T> handlers, Class<?> pojoClass) {
+ T handler = getAtomElementHandlerSuperClass(handlers, pojoClass);
+ if (handler == null) {
+ Class<?>[] interfaces = pojoClass.getInterfaces();
+ for (Class<?> inter : interfaces) {
+ handler = handlers.get(inter.getName());
+ if (handler != null) {
+ break;
+ }
+ }
+ }
+ return handler;
+ }
+
+ private <T> T getAtomElementHandlerSuperClass(Map<String, T> handlers, Class<?> pojoClass) {
+ if (pojoClass == Object.class) {
+ return null;
+ }
+ T handler = handlers.get(pojoClass.getName());
+ if (handler != null) {
+ return handler;
+ } else {
+ return getAtomElementHandlerSuperClass(handlers, pojoClass.getSuperclass());
+ }
}
//CHECKSTYLE:OFF
@@ -273,7 +323,7 @@ public class AtomPojoProvider extends Ab
Class<?> memberClass = InjectionUtils.getActualType(collectionType);
for (Object o : arr) {
- Entry entry = createEntryFromObject(o, memberClass);
+ Entry entry = createEntryFromObject(factory, o, memberClass);
feed.addEntry(entry);
}
if (!writerUsed) {
@@ -282,8 +332,9 @@ public class AtomPojoProvider extends Ab
}
protected AbstractAtomElementBuilder<?> getAtomBuilder(Class<?> pojoClass) {
- AbstractAtomElementBuilder<?> builder = atomClassBuilders.get(pojoClass);
- return builder == null ? atomBuilders.get(pojoClass.getName()) : builder;
+ AbstractAtomElementBuilder<?> builder = getAtomClassElementHandler(atomClassBuilders, pojoClass);
+ return builder == null && atomBuilders != null
+ ? getAtomElementHandler(atomBuilders, pojoClass) : builder;
}
@SuppressWarnings("unchecked")
@@ -364,9 +415,7 @@ public class AtomPojoProvider extends Ab
- protected Entry createEntryFromObject(Object o, Class<?> cls) throws Exception {
-
- Factory factory = Abdera.getNewFactory();
+ protected Entry createEntryFromObject(Factory factory, Object o, Class<?> cls) throws Exception {
Entry entry = factory.getAbdera().newEntry();
if (!buildEntry(entry, o, cls)) {
@@ -375,7 +424,7 @@ public class AtomPojoProvider extends Ab
if (entry.getContentElement() == null
&& entry.getExtensions().size() == 0) {
- createEntryContent(entry, o, cls);
+ createEntryContent(factory, entry, o, cls);
}
return entry;
@@ -391,7 +440,7 @@ public class AtomPojoProvider extends Ab
return false;
}
- protected void createEntryContent(Entry e, Object o, Class<?> cls) throws Exception {
+ protected void createEntryContent(Factory factory, Entry e, Object o, Class<?> cls) throws Exception {
String content = null;
@@ -405,12 +454,11 @@ public class AtomPojoProvider extends Ab
content = (String)m.invoke(o, new Object[]{});
}
- setEntryContent(e, content);
+ setEntryContent(factory, e, content);
}
- protected void setEntryContent(Entry e, String content) {
- Factory factory = Abdera.getNewFactory();
+ protected void setEntryContent(Factory factory, Entry e, String content) {
e.setContentElement(factory.newContent());
e.getContentElement().setContentType(Content.Type.XML);
e.getContentElement().setValue(content);
@@ -482,7 +530,7 @@ public class AtomPojoProvider extends Ab
String content = theBuilder.getContent(o);
if (content != null) {
- setEntryContent(entry, content);
+ setEntryContent(factory, entry, content);
}
}