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 2009/08/28 15:34:20 UTC
svn commit: r808885 - in /cxf/trunk:
rt/frontend/jaxrs/src/main/java/org/apache/cxf/jaxrs/
rt/frontend/jaxrs/src/main/java/org/apache/cxf/jaxrs/interceptor/
rt/frontend/jaxrs/src/main/java/org/apache/cxf/jaxrs/model/wadl/
rt/frontend/jaxrs/src/main/jav...
Author: sergeyb
Date: Fri Aug 28 13:34:18 2009
New Revision: 808885
URL: http://svn.apache.org/viewvc?rev=808885&view=rev
Log:
JAXRS : minor refactoring of JSON providers, fixing the issue of generated WADL being handled by custom writers
Added:
cxf/trunk/rt/frontend/jaxrs/src/test/resources/resources.xml (with props)
Modified:
cxf/trunk/rt/frontend/jaxrs/src/main/java/org/apache/cxf/jaxrs/AbstractJAXRSFactoryBean.java
cxf/trunk/rt/frontend/jaxrs/src/main/java/org/apache/cxf/jaxrs/JAXRSInvoker.java
cxf/trunk/rt/frontend/jaxrs/src/main/java/org/apache/cxf/jaxrs/JAXRSServiceFactoryBean.java
cxf/trunk/rt/frontend/jaxrs/src/main/java/org/apache/cxf/jaxrs/JAXRSServiceImpl.java
cxf/trunk/rt/frontend/jaxrs/src/main/java/org/apache/cxf/jaxrs/interceptor/JAXRSInInterceptor.java
cxf/trunk/rt/frontend/jaxrs/src/main/java/org/apache/cxf/jaxrs/interceptor/JAXRSOutInterceptor.java
cxf/trunk/rt/frontend/jaxrs/src/main/java/org/apache/cxf/jaxrs/model/wadl/WadlGenerator.java
cxf/trunk/rt/frontend/jaxrs/src/main/java/org/apache/cxf/jaxrs/provider/AegisJSONProvider.java
cxf/trunk/rt/frontend/jaxrs/src/main/java/org/apache/cxf/jaxrs/provider/DataBindingJSONProvider.java
cxf/trunk/rt/frontend/jaxrs/src/main/java/org/apache/cxf/jaxrs/provider/JSONProvider.java
cxf/trunk/rt/frontend/jaxrs/src/main/java/org/apache/cxf/jaxrs/provider/JSONUtils.java
cxf/trunk/rt/frontend/jaxrs/src/main/java/org/apache/cxf/jaxrs/utils/JAXRSUtils.java
cxf/trunk/rt/frontend/jaxrs/src/test/java/org/apache/cxf/jaxrs/provider/DataBindingJSONProviderTest.java
cxf/trunk/rt/frontend/jaxrs/src/test/java/org/apache/cxf/jaxrs/provider/DataBindingProviderTest.java
cxf/trunk/rt/frontend/jaxrs/src/test/java/org/apache/cxf/jaxrs/utils/ResourceUtilsTest.java
cxf/trunk/systests/src/test/resources/jaxrs_non_spring/WEB-INF/resources.xml
Modified: cxf/trunk/rt/frontend/jaxrs/src/main/java/org/apache/cxf/jaxrs/AbstractJAXRSFactoryBean.java
URL: http://svn.apache.org/viewvc/cxf/trunk/rt/frontend/jaxrs/src/main/java/org/apache/cxf/jaxrs/AbstractJAXRSFactoryBean.java?rev=808885&r1=808884&r2=808885&view=diff
==============================================================================
--- cxf/trunk/rt/frontend/jaxrs/src/main/java/org/apache/cxf/jaxrs/AbstractJAXRSFactoryBean.java (original)
+++ cxf/trunk/rt/frontend/jaxrs/src/main/java/org/apache/cxf/jaxrs/AbstractJAXRSFactoryBean.java Fri Aug 28 13:34:18 2009
@@ -258,6 +258,9 @@
props.put(PropertiesAwareDataBinding.TYPES_PROPERTY, allClasses);
((PropertiesAwareDataBinding)db).initialize(props);
} else {
+ if (s instanceof JAXRSServiceImpl) {
+ ((JAXRSServiceImpl)s).setCreateServiceModel(true);
+ }
db.initialize(s);
}
factory.setUserProviders(Collections.singletonList(new DataBindingProvider(db)));
@@ -271,8 +274,8 @@
serviceFactory.setUserResources(resources);
}
- public void setModelBeansWithServiceClass(List<UserResource> resources, Class<?> sClass) {
- serviceFactory.setUserResourcesWithServiceClass(resources, sClass);
+ public void setModelBeansWithServiceClass(List<UserResource> resources, Class<?>... sClasses) {
+ serviceFactory.setUserResourcesWithServiceClass(resources, sClasses);
}
public void setModelRef(String modelRef) {
@@ -282,10 +285,10 @@
}
}
- public void setModelRefWithServiceClass(String modelRef, Class<?> sClass) {
+ public void setModelRefWithServiceClass(String modelRef, Class<?>... sClasses) {
List<UserResource> resources = ResourceUtils.getUserResources(modelRef, getBus());
if (resources != null) {
- serviceFactory.setUserResourcesWithServiceClass(resources, sClass);
+ serviceFactory.setUserResourcesWithServiceClass(resources, sClasses);
}
}
Modified: cxf/trunk/rt/frontend/jaxrs/src/main/java/org/apache/cxf/jaxrs/JAXRSInvoker.java
URL: http://svn.apache.org/viewvc/cxf/trunk/rt/frontend/jaxrs/src/main/java/org/apache/cxf/jaxrs/JAXRSInvoker.java?rev=808885&r1=808884&r2=808885&view=diff
==============================================================================
--- cxf/trunk/rt/frontend/jaxrs/src/main/java/org/apache/cxf/jaxrs/JAXRSInvoker.java (original)
+++ cxf/trunk/rt/frontend/jaxrs/src/main/java/org/apache/cxf/jaxrs/JAXRSInvoker.java Fri Aug 28 13:34:18 2009
@@ -38,7 +38,6 @@
import org.apache.cxf.helpers.CastUtils;
import org.apache.cxf.interceptor.Fault;
import org.apache.cxf.jaxrs.impl.MetadataMap;
-import org.apache.cxf.jaxrs.interceptor.JAXRSInInterceptor;
import org.apache.cxf.jaxrs.model.ClassResourceInfo;
import org.apache.cxf.jaxrs.model.MethodInvocationInfo;
import org.apache.cxf.jaxrs.model.OperationResourceInfo;
@@ -122,7 +121,7 @@
if (excResponse == null) {
ProviderFactory.getInstance(exchange.getInMessage()).clearThreadLocalProxies();
ClassResourceInfo criRoot =
- (ClassResourceInfo)exchange.get(JAXRSInInterceptor.ROOT_RESOURCE_CLASS);
+ (ClassResourceInfo)exchange.get(JAXRSUtils.ROOT_RESOURCE_CLASS);
if (criRoot != null) {
criRoot.clearThreadLocalProxies();
}
@@ -141,7 +140,7 @@
try {
Message msg = exchange.getInMessage();
MultivaluedMap<String, String> values = getTemplateValues(msg);
- String subResourcePath = (String)msg.get(JAXRSInInterceptor.RELATIVE_PATH);
+ String subResourcePath = (String)msg.get(JAXRSUtils.RELATIVE_PATH);
String httpMethod = (String)msg.get(Message.HTTP_REQUEST_METHOD);
String contentType = (String)msg.get(Message.CONTENT_TYPE);
if (contentType == null) {
@@ -173,8 +172,7 @@
exchange.put(OperationResourceInfo.class, subOri);
- msg.put(JAXRSInInterceptor.RELATIVE_PATH,
- values.getFirst(URITemplate.FINAL_MATCH_GROUP));
+ msg.put(JAXRSUtils.RELATIVE_PATH, values.getFirst(URITemplate.FINAL_MATCH_GROUP));
msg.put(URITemplate.TEMPLATE_PARAMETERS, values);
// work out request parameters for the sub-resouce class. Here we
// presume Inputstream has not been consumed yet by the root resource class.
Modified: cxf/trunk/rt/frontend/jaxrs/src/main/java/org/apache/cxf/jaxrs/JAXRSServiceFactoryBean.java
URL: http://svn.apache.org/viewvc/cxf/trunk/rt/frontend/jaxrs/src/main/java/org/apache/cxf/jaxrs/JAXRSServiceFactoryBean.java?rev=808885&r1=808884&r2=808885&view=diff
==============================================================================
--- cxf/trunk/rt/frontend/jaxrs/src/main/java/org/apache/cxf/jaxrs/JAXRSServiceFactoryBean.java (original)
+++ cxf/trunk/rt/frontend/jaxrs/src/main/java/org/apache/cxf/jaxrs/JAXRSServiceFactoryBean.java Fri Aug 28 13:34:18 2009
@@ -153,12 +153,14 @@
}
}
- public void setUserResourcesWithServiceClass(List<UserResource> resources, Class<?> sClass) {
+ public void setUserResourcesWithServiceClass(List<UserResource> resources, Class<?> ...sClasses) {
Map<String, UserResource> map = userResourcesAsMap(resources);
- ClassResourceInfo cri = ResourceUtils.createServiceClassResourceInfo(
- map, map.get(sClass.getName()), sClass, true, enableStatic);
- if (cri != null) {
- classResourceInfos.add(cri);
+ for (Class<?> sClass : sClasses) {
+ ClassResourceInfo cri = ResourceUtils.createServiceClassResourceInfo(
+ map, map.get(sClass.getName()), sClass, true, enableStatic);
+ if (cri != null) {
+ classResourceInfos.add(cri);
+ }
}
}
Modified: cxf/trunk/rt/frontend/jaxrs/src/main/java/org/apache/cxf/jaxrs/JAXRSServiceImpl.java
URL: http://svn.apache.org/viewvc/cxf/trunk/rt/frontend/jaxrs/src/main/java/org/apache/cxf/jaxrs/JAXRSServiceImpl.java?rev=808885&r1=808884&r2=808885&view=diff
==============================================================================
--- cxf/trunk/rt/frontend/jaxrs/src/main/java/org/apache/cxf/jaxrs/JAXRSServiceImpl.java (original)
+++ cxf/trunk/rt/frontend/jaxrs/src/main/java/org/apache/cxf/jaxrs/JAXRSServiceImpl.java Fri Aug 28 13:34:18 2009
@@ -21,6 +21,7 @@
import java.lang.reflect.Method;
import java.util.ArrayList;
+import java.util.Collections;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
@@ -57,6 +58,7 @@
private Invoker invoker;
private Map<QName, Endpoint> endpoints = new HashMap<QName, Endpoint>();
private String address;
+ private boolean createServiceModel;
public JAXRSServiceImpl() {
}
@@ -70,6 +72,15 @@
executor = SynchronousExecutor.getInstance();
}
+ public JAXRSServiceImpl(List<ClassResourceInfo> cri, boolean createModel) {
+ this(cri);
+ this.createServiceModel = createModel;
+ }
+
+ public void setCreateServiceModel(boolean create) {
+ createServiceModel = create;
+ }
+
public String getBeanName() {
return getName().toString();
}
@@ -89,6 +100,9 @@
}
public List<ServiceInfo> getServiceInfos() {
+ if (!createServiceModel) {
+ return Collections.emptyList();
+ }
// try to convert to WSDL-centric model so that CXF DataBindings can get initialized
// might become useful too if we support wsdl2
Modified: cxf/trunk/rt/frontend/jaxrs/src/main/java/org/apache/cxf/jaxrs/interceptor/JAXRSInInterceptor.java
URL: http://svn.apache.org/viewvc/cxf/trunk/rt/frontend/jaxrs/src/main/java/org/apache/cxf/jaxrs/interceptor/JAXRSInInterceptor.java?rev=808885&r1=808884&r2=808885&view=diff
==============================================================================
--- cxf/trunk/rt/frontend/jaxrs/src/main/java/org/apache/cxf/jaxrs/interceptor/JAXRSInInterceptor.java (original)
+++ cxf/trunk/rt/frontend/jaxrs/src/main/java/org/apache/cxf/jaxrs/interceptor/JAXRSInInterceptor.java Fri Aug 28 13:34:18 2009
@@ -49,9 +49,6 @@
public class JAXRSInInterceptor extends AbstractPhaseInterceptor<Message> {
- public static final String RELATIVE_PATH = "relative.path";
- public static final String ROOT_RESOURCE_CLASS = "root.resource.class";
-
private static final Logger LOG = LogUtils.getL7dLogger(JAXRSInInterceptor.class);
private static final ResourceBundle BUNDLE = BundleUtils.getBundle(JAXRSInInterceptor.class);
@@ -125,7 +122,7 @@
throw new WebApplicationException(Response.Status.NOT_FOUND);
}
- message.getExchange().put(ROOT_RESOURCE_CLASS, resource);
+ message.getExchange().put(JAXRSUtils.ROOT_RESOURCE_CLASS, resource);
String httpMethod = (String)message.get(Message.HTTP_REQUEST_METHOD);
OperationResourceInfo ori = null;
@@ -197,7 +194,7 @@
LOG.fine("Found operation: " + ori.getMethodToInvoke().getName());
message.getExchange().put(OperationResourceInfo.class, ori);
- message.put(RELATIVE_PATH, values.getFirst(URITemplate.FINAL_MATCH_GROUP));
+ message.put(JAXRSUtils.RELATIVE_PATH, values.getFirst(URITemplate.FINAL_MATCH_GROUP));
message.put(URITemplate.TEMPLATE_PARAMETERS, values);
//2. Process parameters
Modified: cxf/trunk/rt/frontend/jaxrs/src/main/java/org/apache/cxf/jaxrs/interceptor/JAXRSOutInterceptor.java
URL: http://svn.apache.org/viewvc/cxf/trunk/rt/frontend/jaxrs/src/main/java/org/apache/cxf/jaxrs/interceptor/JAXRSOutInterceptor.java?rev=808885&r1=808884&r2=808885&view=diff
==============================================================================
--- cxf/trunk/rt/frontend/jaxrs/src/main/java/org/apache/cxf/jaxrs/interceptor/JAXRSOutInterceptor.java (original)
+++ cxf/trunk/rt/frontend/jaxrs/src/main/java/org/apache/cxf/jaxrs/interceptor/JAXRSOutInterceptor.java Fri Aug 28 13:34:18 2009
@@ -77,7 +77,7 @@
} finally {
ProviderFactory.getInstance(message).clearThreadLocalProxies();
ClassResourceInfo cri =
- (ClassResourceInfo)message.getExchange().get(JAXRSInInterceptor.ROOT_RESOURCE_CLASS);
+ (ClassResourceInfo)message.getExchange().get(JAXRSUtils.ROOT_RESOURCE_CLASS);
if (cri != null) {
cri.clearThreadLocalProxies();
}
@@ -159,6 +159,14 @@
return;
}
+ Object ignoreWritersProp = message.getExchange().get(JAXRSUtils.IGNORE_MESSAGE_WRITERS);
+ boolean ignoreWriters =
+ ignoreWritersProp == null ? false : Boolean.valueOf(ignoreWritersProp.toString());
+ if (ignoreWriters) {
+ writeResponseToStream(message.getContent(OutputStream.class), responseObj);
+ return;
+ }
+
List<MediaType> availableContentTypes = computeAvailableContentTypes(message, response);
Method invoked = null;
@@ -381,4 +389,13 @@
private boolean isResponseAlreadyCommited(Message m) {
return Boolean.TRUE.equals(m.getExchange().get(AbstractHTTPDestination.RESPONSE_COMMITED));
}
+
+ private void writeResponseToStream(OutputStream os, Object responseObj) {
+ try {
+ byte[] bytes = responseObj.toString().getBytes("UTF-8");
+ os.write(bytes, 0, bytes.length);
+ } catch (Exception ex) {
+ throw new RuntimeException(ex);
+ }
+ }
}
Modified: cxf/trunk/rt/frontend/jaxrs/src/main/java/org/apache/cxf/jaxrs/model/wadl/WadlGenerator.java
URL: http://svn.apache.org/viewvc/cxf/trunk/rt/frontend/jaxrs/src/main/java/org/apache/cxf/jaxrs/model/wadl/WadlGenerator.java?rev=808885&r1=808884&r2=808885&view=diff
==============================================================================
--- cxf/trunk/rt/frontend/jaxrs/src/main/java/org/apache/cxf/jaxrs/model/wadl/WadlGenerator.java (original)
+++ cxf/trunk/rt/frontend/jaxrs/src/main/java/org/apache/cxf/jaxrs/model/wadl/WadlGenerator.java Fri Aug 28 13:34:18 2009
@@ -71,6 +71,7 @@
import org.apache.cxf.jaxrs.model.ParameterType;
import org.apache.cxf.jaxrs.model.URITemplate;
import org.apache.cxf.jaxrs.utils.InjectionUtils;
+import org.apache.cxf.jaxrs.utils.JAXRSUtils;
import org.apache.cxf.jaxrs.utils.ResourceUtils;
import org.apache.cxf.message.Message;
import org.apache.cxf.service.Service;
@@ -87,6 +88,8 @@
private static final String JAXB_DEFAULT_NAMESPACE = "##default";
private static final String JAXB_DEFAULT_NAME = "##default";
+ private boolean ignoreMessageWriters = true;
+
public Response handleRequest(Message m, ClassResourceInfo resource) {
if (!"GET".equals(m.get(Message.HTTP_REQUEST_METHOD))) {
@@ -132,6 +135,8 @@
sbMain.append(sbResources.toString());
sbMain.append("</application>");
+ m.getExchange().put(JAXRSUtils.IGNORE_MESSAGE_WRITERS, ignoreMessageWriters);
+
HttpHeaders headers = new HttpHeadersImpl(m);
MediaType type = headers.getAcceptableMediaTypes().contains(MediaType.APPLICATION_XML_TYPE)
? MediaType.APPLICATION_XML_TYPE : WADL_TYPE;
@@ -595,6 +600,10 @@
String prefix = getPrefix(namespace, clsMap);
return new QName(namespace, name, prefix);
}
-
-
+
+ public void setIgnoreMessageWriters(boolean ignoreMessageWriters) {
+ this.ignoreMessageWriters = ignoreMessageWriters;
+ }
+
+
}
Modified: cxf/trunk/rt/frontend/jaxrs/src/main/java/org/apache/cxf/jaxrs/provider/AegisJSONProvider.java
URL: http://svn.apache.org/viewvc/cxf/trunk/rt/frontend/jaxrs/src/main/java/org/apache/cxf/jaxrs/provider/AegisJSONProvider.java?rev=808885&r1=808884&r2=808885&view=diff
==============================================================================
--- cxf/trunk/rt/frontend/jaxrs/src/main/java/org/apache/cxf/jaxrs/provider/AegisJSONProvider.java (original)
+++ cxf/trunk/rt/frontend/jaxrs/src/main/java/org/apache/cxf/jaxrs/provider/AegisJSONProvider.java Fri Aug 28 13:34:18 2009
@@ -46,11 +46,16 @@
private List<String> arrayKeys;
private boolean serializeAsArray;
+ private boolean dropRootElement;
private ConcurrentHashMap<String, String> namespaceMap = new ConcurrentHashMap<String, String>();
public AegisJSONProvider() {
}
+ public void setDropRootElement(boolean dropRootElement) {
+ this.dropRootElement = dropRootElement;
+ }
+
public void setArrayKeys(List<String> keys) {
this.arrayKeys = keys;
}
@@ -72,7 +77,7 @@
protected XMLStreamWriter createStreamWriter(QName typeQName, OutputStream os) throws Exception {
namespaceMap.putIfAbsent(typeQName.getNamespaceURI(), "ns1");
XMLStreamWriter writer = JSONUtils.createStreamWriter(os, typeQName, writeXsiType, namespaceMap,
- serializeAsArray, arrayKeys);
+ serializeAsArray, arrayKeys, dropRootElement);
return writer;
}
@@ -92,5 +97,6 @@
namespaceMap.putIfAbsent(qname.getNamespaceURI(), "ns1");
return qname;
}
+
}
Modified: cxf/trunk/rt/frontend/jaxrs/src/main/java/org/apache/cxf/jaxrs/provider/DataBindingJSONProvider.java
URL: http://svn.apache.org/viewvc/cxf/trunk/rt/frontend/jaxrs/src/main/java/org/apache/cxf/jaxrs/provider/DataBindingJSONProvider.java?rev=808885&r1=808884&r2=808885&view=diff
==============================================================================
--- cxf/trunk/rt/frontend/jaxrs/src/main/java/org/apache/cxf/jaxrs/provider/DataBindingJSONProvider.java (original)
+++ cxf/trunk/rt/frontend/jaxrs/src/main/java/org/apache/cxf/jaxrs/provider/DataBindingJSONProvider.java Fri Aug 28 13:34:18 2009
@@ -47,6 +47,12 @@
private ConcurrentHashMap<String, String> namespaceMap = new ConcurrentHashMap<String, String>();
private boolean writeXsiType = true;
private boolean readXsiType = true;
+ private boolean dropRootElement;
+ private boolean ignoreMixedContent;
+
+ public void setDropRootElement(boolean dropRootElement) {
+ this.dropRootElement = dropRootElement;
+ }
public void setWriteXsiType(boolean write) {
writeXsiType = write;
@@ -82,8 +88,9 @@
} else {
qname = getQName(InjectionUtils.getActualType(genericType));
}
- return JSONUtils.createStreamWriter(os, qname, writeXsiType, namespaceMap,
- serializeAsArray, arrayKeys);
+ XMLStreamWriter writer = JSONUtils.createStreamWriter(os, qname, writeXsiType, namespaceMap,
+ serializeAsArray, arrayKeys, dropRootElement);
+ return JSONUtils.createIgnoreMixedContentWriterIfNeeded(writer, ignoreMixedContent);
}
@Override
@@ -109,5 +116,9 @@
namespaceMap.putIfAbsent(qname.getNamespaceURI(), "ns1");
return qname;
}
+
+ public void setIgnoreMixedContent(boolean ignoreMixedContent) {
+ this.ignoreMixedContent = ignoreMixedContent;
+ }
}
Modified: cxf/trunk/rt/frontend/jaxrs/src/main/java/org/apache/cxf/jaxrs/provider/JSONProvider.java
URL: http://svn.apache.org/viewvc/cxf/trunk/rt/frontend/jaxrs/src/main/java/org/apache/cxf/jaxrs/provider/JSONProvider.java?rev=808885&r1=808884&r2=808885&view=diff
==============================================================================
--- cxf/trunk/rt/frontend/jaxrs/src/main/java/org/apache/cxf/jaxrs/provider/JSONProvider.java (original)
+++ cxf/trunk/rt/frontend/jaxrs/src/main/java/org/apache/cxf/jaxrs/provider/JSONProvider.java Fri Aug 28 13:34:18 2009
@@ -29,10 +29,9 @@
import java.lang.reflect.Type;
import java.util.Collection;
import java.util.Enumeration;
-import java.util.HashMap;
-import java.util.LinkedList;
import java.util.List;
import java.util.Map;
+import java.util.concurrent.ConcurrentHashMap;
import javax.ws.rs.Consumes;
import javax.ws.rs.Produces;
@@ -51,19 +50,17 @@
import javax.xml.stream.XMLStreamReader;
import javax.xml.stream.XMLStreamWriter;
-import org.apache.cxf.common.util.StringUtils;
import org.apache.cxf.jaxrs.ext.MessageContext;
import org.apache.cxf.jaxrs.utils.InjectionUtils;
import org.apache.cxf.jaxrs.utils.schemas.SchemaHandler;
-import org.apache.cxf.staxutils.DelegatingXMLStreamWriter;
-import org.codehaus.jettison.mapped.MappedXMLInputFactory;
@Produces("application/json")
@Consumes("application/json")
@Provider
public class JSONProvider extends AbstractJAXBProvider {
- private Map<String, String> namespaceMap = new HashMap<String, String>();
+ private ConcurrentHashMap<String, String> namespaceMap =
+ new ConcurrentHashMap<String, String>();
private boolean serializeAsArray;
private List<String> arrayKeys;
private boolean unwrapped;
@@ -72,6 +69,9 @@
private boolean dropRootElement;
private boolean dropCollectionWrapperElement;
private boolean ignoreMixedContent;
+ private boolean writeXsiType = true;
+ private boolean readXsiType = true;
+
@Context
public void setMessageContext(MessageContext mc) {
super.setContext(mc);
@@ -130,7 +130,7 @@
}
public void setNamespaceMap(Map<String, String> namespaceMap) {
- this.namespaceMap = namespaceMap;
+ this.namespaceMap.putAll(namespaceMap);
}
public Object readFrom(Class<Object> type, Type genericType, Annotation[] anns, MediaType mt,
@@ -173,8 +173,7 @@
protected XMLStreamReader createReader(Class<?> type, InputStream is)
throws Exception {
- MappedXMLInputFactory factory = new MappedXMLInputFactory(namespaceMap);
- return factory.createXMLStreamReader(is);
+ return JSONUtils.createStreamReader(is, readXsiType, namespaceMap);
}
protected InputStream getInputStream(Class<Object> cls, Type type, InputStream is) throws Exception {
@@ -299,9 +298,6 @@
XMLStreamWriter writer = createWriter(actualObject, actualClass, genericType, enc,
os, isCollection);
- if (ignoreMixedContent) {
- writer = new IgnoreMixedContentWriter(writer);
- }
ms.marshal(actualObject, writer);
writer.close();
}
@@ -309,10 +305,10 @@
protected XMLStreamWriter createWriter(Object actualObject, Class<?> actualClass,
Type genericType, String enc, OutputStream os, boolean isCollection) throws Exception {
QName qname = getQName(actualClass, genericType, actualObject, true);
- XMLStreamWriter xsw = JSONUtils.createStreamWriter(os, qname, false,
- namespaceMap, serializeAsArray, arrayKeys);
-
- return isCollection || dropRootElement ? new JSONCollectionWriter(xsw, qname) : xsw;
+ XMLStreamWriter writer = JSONUtils.createStreamWriter(os, qname, writeXsiType,
+ namespaceMap, serializeAsArray, arrayKeys,
+ isCollection || dropRootElement);
+ return JSONUtils.createIgnoreMixedContentWriterIfNeeded(writer, ignoreMixedContent);
}
protected void marshal(Object actualObject, Class<?> actualClass,
@@ -350,80 +346,12 @@
return prefix;
}
- protected static class JSONCollectionWriter extends DelegatingXMLStreamWriter {
- private QName ignoredQName;
- public JSONCollectionWriter(XMLStreamWriter writer, QName qname) {
- super(writer);
- ignoredQName = qname;
- }
-
- @Override
- public void writeStartElement(String prefix, String local, String uri) throws XMLStreamException {
- if (ignoredQName.getLocalPart().equals(local)
- && ignoredQName.getNamespaceURI().equals(uri)) {
- return;
- }
- super.writeStartElement(prefix, local, uri);
- }
+ public void setWriteXsiType(boolean writeXsiType) {
+ this.writeXsiType = writeXsiType;
}
- protected static class IgnoreMixedContentWriter extends DelegatingXMLStreamWriter {
- String lastText;
- boolean isMixed;
- List<Boolean> mixed = new LinkedList<Boolean>();
-
- public IgnoreMixedContentWriter(XMLStreamWriter writer) {
- super(writer);
- }
-
- public void writeCharacters(String text) throws XMLStreamException {
- if (StringUtils.isEmpty(text.trim())) {
- lastText = text;
- } else if (lastText != null) {
- lastText += text;
- } else if (!isMixed) {
- super.writeCharacters(text);
- } else {
- lastText = text;
- }
- }
-
- public void writeStartElement(String prefix, String local, String uri) throws XMLStreamException {
- if (lastText != null) {
- isMixed = true;
- }
- mixed.add(0, isMixed);
- lastText = null;
- isMixed = false;
- super.writeStartElement(prefix, local, uri);
- }
- public void writeStartElement(String uri, String local) throws XMLStreamException {
- if (lastText != null) {
- isMixed = true;
- }
- mixed.add(0, isMixed);
- lastText = null;
- isMixed = false;
- super.writeStartElement(uri, local);
- }
- public void writeStartElement(String local) throws XMLStreamException {
- if (lastText != null) {
- isMixed = true;
- }
- mixed.add(0, isMixed);
- lastText = null;
- isMixed = false;
- super.writeStartElement(local);
- }
- public void writeEndElement() throws XMLStreamException {
- if (lastText != null && (!isMixed || !StringUtils.isEmpty(lastText.trim()))) {
- super.writeCharacters(lastText.trim());
- }
- super.writeEndElement();
- isMixed = mixed.get(0);
- mixed.remove(0);
- }
-
-
+ public void setReadXsiType(boolean readXsiType) {
+ this.readXsiType = readXsiType;
}
+
}
Modified: cxf/trunk/rt/frontend/jaxrs/src/main/java/org/apache/cxf/jaxrs/provider/JSONUtils.java
URL: http://svn.apache.org/viewvc/cxf/trunk/rt/frontend/jaxrs/src/main/java/org/apache/cxf/jaxrs/provider/JSONUtils.java?rev=808885&r1=808884&r2=808885&view=diff
==============================================================================
--- cxf/trunk/rt/frontend/jaxrs/src/main/java/org/apache/cxf/jaxrs/provider/JSONUtils.java (original)
+++ cxf/trunk/rt/frontend/jaxrs/src/main/java/org/apache/cxf/jaxrs/provider/JSONUtils.java Fri Aug 28 13:34:18 2009
@@ -24,15 +24,20 @@
import java.nio.charset.Charset;
import java.util.Collections;
import java.util.Iterator;
+import java.util.LinkedList;
import java.util.List;
import java.util.Map;
+import java.util.concurrent.ConcurrentHashMap;
import javax.xml.namespace.NamespaceContext;
import javax.xml.namespace.QName;
+import javax.xml.stream.XMLStreamException;
import javax.xml.stream.XMLStreamReader;
import javax.xml.stream.XMLStreamWriter;
import org.apache.cxf.common.WSDLConstants;
+import org.apache.cxf.common.util.StringUtils;
+import org.apache.cxf.staxutils.DelegatingXMLStreamWriter;
import org.apache.cxf.staxutils.DepthXMLStreamReader;
import org.codehaus.jettison.AbstractXMLStreamWriter;
import org.codehaus.jettison.mapped.Configuration;
@@ -50,12 +55,14 @@
}
public static XMLStreamWriter createStreamWriter(OutputStream os,
- QName qname, boolean writeXsiType,
- Map<String, String> namespaceMap,
+ QName qname,
+ boolean writeXsiType,
+ ConcurrentHashMap<String, String> namespaceMap,
boolean serializeAsArray,
- List<String> arrayKeys) throws Exception {
+ List<String> arrayKeys,
+ boolean dropRootElement) throws Exception {
if (writeXsiType) {
- namespaceMap.put(XSI_URI, XSI_PREFIX);
+ namespaceMap.putIfAbsent(XSI_URI, XSI_PREFIX);
}
Configuration c = new Configuration(namespaceMap);
MappedNamespaceConvention convention = new MappedNamespaceConvention(c);
@@ -72,9 +79,18 @@
xsw.seriliazeAsArray(key);
}
}
- return xsw;
+ XMLStreamWriter writer = !writeXsiType || dropRootElement
+ ? new IgnoreContentJettisonWriter(xsw, writeXsiType,
+ dropRootElement ? qname : null) : xsw;
+
+ return writer;
}
+ public static XMLStreamWriter createIgnoreMixedContentWriterIfNeeded(XMLStreamWriter writer,
+ boolean ignoreMixedContent) {
+ return ignoreMixedContent ? new IgnoreMixedContentWriter(writer) : writer;
+ }
+
private static String getKey(MappedNamespaceConvention convention, QName qname) throws Exception {
return convention.createKey(qname.getPrefix(),
qname.getNamespaceURI(),
@@ -84,9 +100,9 @@
}
public static XMLStreamReader createStreamReader(InputStream is, boolean readXsiType,
- Map<String, String> namespaceMap) throws Exception {
+ ConcurrentHashMap<String, String> namespaceMap) throws Exception {
if (readXsiType) {
- namespaceMap.put(XSI_URI, XSI_PREFIX);
+ namespaceMap.putIfAbsent(XSI_URI, XSI_PREFIX);
}
MappedXMLInputFactory factory = new MappedXMLInputFactory(namespaceMap);
return new JettisonReader(namespaceMap, factory.createXMLStreamReader(is));
@@ -136,4 +152,94 @@
};
}
}
+
+ private static class IgnoreContentJettisonWriter extends DelegatingXMLStreamWriter {
+
+ private boolean writeXsiType;
+ private QName ignoredQName;
+
+ public IgnoreContentJettisonWriter(XMLStreamWriter writer, boolean writeXsiType, QName qname) {
+ super(writer);
+ this.writeXsiType = writeXsiType;
+ ignoredQName = qname;
+ }
+
+ public void writeAttribute(String prefix, String uri,
+ String local, String value) throws XMLStreamException {
+ if (!writeXsiType && "type".equals(local) && "xsi".equals(prefix)) {
+ return;
+ }
+ super.writeAttribute(prefix, uri, local, value);
+
+ }
+
+ @Override
+ public void writeStartElement(String prefix, String local, String uri) throws XMLStreamException {
+ if (ignoredQName != null && ignoredQName.getLocalPart().equals(local)
+ && ignoredQName.getNamespaceURI().equals(uri)) {
+ return;
+ }
+ super.writeStartElement(prefix, local, uri);
+ }
+ }
+
+ private static class IgnoreMixedContentWriter extends DelegatingXMLStreamWriter {
+ String lastText;
+ boolean isMixed;
+ List<Boolean> mixed = new LinkedList<Boolean>();
+
+ public IgnoreMixedContentWriter(XMLStreamWriter writer) {
+ super(writer);
+ }
+
+ public void writeCharacters(String text) throws XMLStreamException {
+ if (StringUtils.isEmpty(text.trim())) {
+ lastText = text;
+ } else if (lastText != null) {
+ lastText += text;
+ } else if (!isMixed) {
+ super.writeCharacters(text);
+ } else {
+ lastText = text;
+ }
+ }
+
+ public void writeStartElement(String prefix, String local, String uri) throws XMLStreamException {
+ if (lastText != null) {
+ isMixed = true;
+ }
+ mixed.add(0, isMixed);
+ lastText = null;
+ isMixed = false;
+ super.writeStartElement(prefix, local, uri);
+ }
+ public void writeStartElement(String uri, String local) throws XMLStreamException {
+ if (lastText != null) {
+ isMixed = true;
+ }
+ mixed.add(0, isMixed);
+ lastText = null;
+ isMixed = false;
+ super.writeStartElement(uri, local);
+ }
+ public void writeStartElement(String local) throws XMLStreamException {
+ if (lastText != null) {
+ isMixed = true;
+ }
+ mixed.add(0, isMixed);
+ lastText = null;
+ isMixed = false;
+ super.writeStartElement(local);
+ }
+ public void writeEndElement() throws XMLStreamException {
+ if (lastText != null && (!isMixed || !StringUtils.isEmpty(lastText.trim()))) {
+ super.writeCharacters(lastText.trim());
+ }
+ super.writeEndElement();
+ isMixed = mixed.get(0);
+ mixed.remove(0);
+ }
+
+
+ }
}
Modified: cxf/trunk/rt/frontend/jaxrs/src/main/java/org/apache/cxf/jaxrs/utils/JAXRSUtils.java
URL: http://svn.apache.org/viewvc/cxf/trunk/rt/frontend/jaxrs/src/main/java/org/apache/cxf/jaxrs/utils/JAXRSUtils.java?rev=808885&r1=808884&r2=808885&view=diff
==============================================================================
--- cxf/trunk/rt/frontend/jaxrs/src/main/java/org/apache/cxf/jaxrs/utils/JAXRSUtils.java (original)
+++ cxf/trunk/rt/frontend/jaxrs/src/main/java/org/apache/cxf/jaxrs/utils/JAXRSUtils.java Fri Aug 28 13:34:18 2009
@@ -97,6 +97,11 @@
public final class JAXRSUtils {
public static final MediaType ALL_TYPES = new MediaType();
+ public static final String RELATIVE_PATH = "relative.path";
+ public static final String ROOT_RESOURCE_CLASS = "root.resource.class";
+ public static final String IGNORE_MESSAGE_WRITERS = "ignore.message.writers";
+
+
private static final Logger LOG = LogUtils.getL7dLogger(JAXRSUtils.class);
private static final ResourceBundle BUNDLE = BundleUtils.getBundle(JAXRSUtils.class);
private static final String PROPOGATE_EXCEPTION = "org.apache.cxf.propogate.exception";
Modified: cxf/trunk/rt/frontend/jaxrs/src/test/java/org/apache/cxf/jaxrs/provider/DataBindingJSONProviderTest.java
URL: http://svn.apache.org/viewvc/cxf/trunk/rt/frontend/jaxrs/src/test/java/org/apache/cxf/jaxrs/provider/DataBindingJSONProviderTest.java?rev=808885&r1=808884&r2=808885&view=diff
==============================================================================
--- cxf/trunk/rt/frontend/jaxrs/src/test/java/org/apache/cxf/jaxrs/provider/DataBindingJSONProviderTest.java (original)
+++ cxf/trunk/rt/frontend/jaxrs/src/test/java/org/apache/cxf/jaxrs/provider/DataBindingJSONProviderTest.java Fri Aug 28 13:34:18 2009
@@ -65,7 +65,7 @@
@SuppressWarnings("unchecked")
@Test
public void testSDOWrite() throws Exception {
- Service s = new JAXRSServiceImpl(Collections.singletonList(c2));
+ Service s = new JAXRSServiceImpl(Collections.singletonList(c2), true);
DataBinding binding = new SDODataBinding();
binding.initialize(s);
DataBindingJSONProvider p = new DataBindingJSONProvider();
@@ -89,7 +89,7 @@
public void testSDORead() throws Exception {
String data = "{\"p0.Structure\":{\"@xsi.type\":\"p0:Structure\",\"p0.text\":\"sdo\",\"p0.int\":3"
+ ",\"p0.dbl\":123.5,\"p0.texts\":\"text1\"}}";
- Service s = new JAXRSServiceImpl(Collections.singletonList(c2));
+ Service s = new JAXRSServiceImpl(Collections.singletonList(c2), true);
DataBinding binding = new SDODataBinding();
binding.initialize(s);
DataBindingJSONProvider p = new DataBindingJSONProvider();
@@ -106,7 +106,7 @@
@Test
public void testJAXBWrite() throws Exception {
- Service s = new JAXRSServiceImpl(Collections.singletonList(c));
+ Service s = new JAXRSServiceImpl(Collections.singletonList(c), true);
DataBinding binding = new JAXBDataBinding();
binding.initialize(s);
DataBindingJSONProvider p = new DataBindingJSONProvider();
@@ -123,7 +123,7 @@
@Test
public void testJAXBRead() throws Exception {
String data = "{\"Book\":{\"id\":127,\"name\":\"CXF\",\"state\":\"\"}}";
- Service s = new JAXRSServiceImpl(Collections.singletonList(c));
+ Service s = new JAXRSServiceImpl(Collections.singletonList(c), true);
DataBinding binding = new JAXBDataBinding();
binding.initialize(s);
DataBindingJSONProvider p = new DataBindingJSONProvider();
@@ -138,7 +138,7 @@
@Test
public void testAegisWrite() throws Exception {
- Service s = new JAXRSServiceImpl(Collections.singletonList(c));
+ Service s = new JAXRSServiceImpl(Collections.singletonList(c), true);
s.put("writeXsiType", true);
AegisDatabinding binding = new AegisDatabinding();
binding.initialize(s);
@@ -154,7 +154,7 @@
@Test
@Ignore
public void testAegisCollectionWrite() throws Exception {
- Service s = new JAXRSServiceImpl(Collections.singletonList(c));
+ Service s = new JAXRSServiceImpl(Collections.singletonList(c), true);
s.put("writeXsiType", true);
AegisDatabinding binding = new AegisDatabinding();
binding.initialize(s);
@@ -180,7 +180,7 @@
@SuppressWarnings("unchecked")
public void doTestAegisRead(String data) throws Exception {
- Service s = new JAXRSServiceImpl(Collections.singletonList(c));
+ Service s = new JAXRSServiceImpl(Collections.singletonList(c), true);
s.put("readXsiType", true);
AegisDatabinding binding = new AegisDatabinding();
binding.initialize(s);
Modified: cxf/trunk/rt/frontend/jaxrs/src/test/java/org/apache/cxf/jaxrs/provider/DataBindingProviderTest.java
URL: http://svn.apache.org/viewvc/cxf/trunk/rt/frontend/jaxrs/src/test/java/org/apache/cxf/jaxrs/provider/DataBindingProviderTest.java?rev=808885&r1=808884&r2=808885&view=diff
==============================================================================
--- cxf/trunk/rt/frontend/jaxrs/src/test/java/org/apache/cxf/jaxrs/provider/DataBindingProviderTest.java (original)
+++ cxf/trunk/rt/frontend/jaxrs/src/test/java/org/apache/cxf/jaxrs/provider/DataBindingProviderTest.java Fri Aug 28 13:34:18 2009
@@ -62,7 +62,7 @@
@Test
public void testAegisWrite() throws Exception {
- Service s = new JAXRSServiceImpl(Collections.singletonList(c));
+ Service s = new JAXRSServiceImpl(Collections.singletonList(c), true);
s.put("writeXsiType", true);
AegisDatabinding binding = new AegisDatabinding();
binding.initialize(s);
@@ -83,7 +83,7 @@
String data = "<ns1:Book xmlns:ns1=\"http://resources.jaxrs.cxf.apache.org\" "
+ "xmlns:ns2=\"http://www.w3.org/2001/XMLSchema-instance\" ns2:type=\"ns1:Book\">"
+ "<ns1:id>127</ns1:id><ns1:name>CXF</ns1:name><ns1:state></ns1:state></ns1:Book>";
- Service s = new JAXRSServiceImpl(Collections.singletonList(c));
+ Service s = new JAXRSServiceImpl(Collections.singletonList(c), true);
s.put("readXsiType", true);
AegisDatabinding binding = new AegisDatabinding();
binding.initialize(s);
@@ -98,7 +98,7 @@
@Test
public void testJAXBWrite() throws Exception {
- Service s = new JAXRSServiceImpl(Collections.singletonList(c));
+ Service s = new JAXRSServiceImpl(Collections.singletonList(c), true);
DataBinding binding = new JAXBDataBinding();
binding.initialize(s);
DataBindingProvider p = new DataBindingProvider(binding);
@@ -114,7 +114,7 @@
@Test
public void testJAXBRead() throws Exception {
String data = "<Book><id>127</id><name>CXF</name><state></state></Book>";
- Service s = new JAXRSServiceImpl(Collections.singletonList(c));
+ Service s = new JAXRSServiceImpl(Collections.singletonList(c), true);
DataBinding binding = new JAXBDataBinding();
binding.initialize(s);
DataBindingProvider p = new DataBindingProvider(binding);
@@ -129,7 +129,7 @@
@SuppressWarnings("unchecked")
@Test
public void testSDOWrite() throws Exception {
- Service s = new JAXRSServiceImpl(Collections.singletonList(c2));
+ Service s = new JAXRSServiceImpl(Collections.singletonList(c2), true);
DataBinding binding = new SDODataBinding();
binding.initialize(s);
DataBindingProvider p = new DataBindingProvider(binding);
@@ -157,7 +157,7 @@
+ "xsi:type=\"p0:Structure\">"
+ "<p0:text>sdo</p0:text><p0:int>3</p0:int><p0:dbl>123.5</p0:dbl><p0:texts>text1</p0:texts>"
+ "</p0:Structure>";
- Service s = new JAXRSServiceImpl(Collections.singletonList(c2));
+ Service s = new JAXRSServiceImpl(Collections.singletonList(c2), true);
DataBinding binding = new SDODataBinding();
binding.initialize(s);
DataBindingProvider p = new DataBindingProvider(binding);
Modified: cxf/trunk/rt/frontend/jaxrs/src/test/java/org/apache/cxf/jaxrs/utils/ResourceUtilsTest.java
URL: http://svn.apache.org/viewvc/cxf/trunk/rt/frontend/jaxrs/src/test/java/org/apache/cxf/jaxrs/utils/ResourceUtilsTest.java?rev=808885&r1=808884&r2=808885&view=diff
==============================================================================
--- cxf/trunk/rt/frontend/jaxrs/src/test/java/org/apache/cxf/jaxrs/utils/ResourceUtilsTest.java (original)
+++ cxf/trunk/rt/frontend/jaxrs/src/test/java/org/apache/cxf/jaxrs/utils/ResourceUtilsTest.java Fri Aug 28 13:34:18 2009
@@ -82,6 +82,31 @@
}
@Test
+ public void testUserResourceFromFile() throws Exception {
+ List<UserResource> list =
+ ResourceUtils.getUserResources("classpath:/resources.xml");
+ assertNotNull(list);
+ assertEquals(1, list.size());
+ UserResource resource = list.get(0);
+ assertEquals("java.util.Map", resource.getName());
+ assertEquals("map", resource.getPath());
+ assertEquals("application/xml", resource.getProduces());
+ assertEquals("application/json", resource.getConsumes());
+ UserOperation oper = resource.getOperations().get(0);
+ assertEquals("putAll", oper.getName());
+ assertEquals("/putAll", oper.getPath());
+ assertEquals("PUT", oper.getVerb());
+ assertEquals("application/json", oper.getProduces());
+ assertEquals("application/xml", oper.getConsumes());
+
+ Parameter p = oper.getParameters().get(0);
+ assertEquals("map", p.getName());
+ assertEquals("emptyMap", p.getDefaultValue());
+ assertTrue(p.isEncoded());
+ assertEquals("REQUEST_BODY", p.getType().toString());
+ }
+
+ @Test
public void testGetAllJaxbClasses() {
ClassResourceInfo cri1 =
ResourceUtils.createClassResourceInfo(BookInterface.class, BookInterface.class, true, true);
Added: cxf/trunk/rt/frontend/jaxrs/src/test/resources/resources.xml
URL: http://svn.apache.org/viewvc/cxf/trunk/rt/frontend/jaxrs/src/test/resources/resources.xml?rev=808885&view=auto
==============================================================================
--- cxf/trunk/rt/frontend/jaxrs/src/test/resources/resources.xml (added)
+++ cxf/trunk/rt/frontend/jaxrs/src/test/resources/resources.xml Fri Aug 28 13:34:18 2009
@@ -0,0 +1,9 @@
+<model xmlns="http://cxf.apache.org/jaxrs">
+ <resource name="java.util.Map"
+ path="map" produces="application/xml" consumes="application/json">
+ <operation name="putAll" verb="PUT" path="/putAll"
+ produces="application/json" consumes="application/xml">
+ <param name="map" type="REQUEST_BODY" encoded="true" defaultValue="emptyMap"/>
+ </operation>
+ </resource>
+</model>
\ No newline at end of file
Propchange: cxf/trunk/rt/frontend/jaxrs/src/test/resources/resources.xml
------------------------------------------------------------------------------
svn:eol-style = native
Propchange: cxf/trunk/rt/frontend/jaxrs/src/test/resources/resources.xml
------------------------------------------------------------------------------
svn:keywords = Rev Date
Propchange: cxf/trunk/rt/frontend/jaxrs/src/test/resources/resources.xml
------------------------------------------------------------------------------
svn:mime-type = text/xml
Modified: cxf/trunk/systests/src/test/resources/jaxrs_non_spring/WEB-INF/resources.xml
URL: http://svn.apache.org/viewvc/cxf/trunk/systests/src/test/resources/jaxrs_non_spring/WEB-INF/resources.xml?rev=808885&r1=808884&r2=808885&view=diff
==============================================================================
--- cxf/trunk/systests/src/test/resources/jaxrs_non_spring/WEB-INF/resources.xml (original)
+++ cxf/trunk/systests/src/test/resources/jaxrs_non_spring/WEB-INF/resources.xml Fri Aug 28 13:34:18 2009
@@ -1,6 +1,6 @@
<model xmlns="http://cxf.apache.org/jaxrs">
<resource name="org.apache.cxf.systest.jaxrs.BookStoreNoAnnotations"
- path="bookstore" producesTypes="application/xml" consumesTypes="application/xml">
+ path="bookstore" produces="application/xml" consumes="application/xml">
<operation name="getBook" verb="GET" path="/books/{id}">
<param name="id" type="PATH" encoded="false"/>
</operation>