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/05/06 12:34:43 UTC
svn commit: r772137 - in /cxf/trunk:
rt/frontend/jaxrs/src/main/java/org/apache/cxf/jaxrs/provider/
rt/frontend/jaxrs/src/test/java/org/apache/cxf/jaxrs/provider/
rt/frontend/jaxrs/src/test/java/org/apache/cxf/jaxrs/resources/
systests/src/test/java/or...
Author: sergeyb
Date: Wed May 6 10:34:42 2009
New Revision: 772137
URL: http://svn.apache.org/viewvc?rev=772137&view=rev
Log:
JAX-RS : adding JAXB-based XSLT provider
Added:
cxf/trunk/rt/frontend/jaxrs/src/main/java/org/apache/cxf/jaxrs/provider/XSLTJaxbProvider.java (with props)
cxf/trunk/rt/frontend/jaxrs/src/test/java/org/apache/cxf/jaxrs/provider/XSLTJaxbProviderTest.java (with props)
cxf/trunk/rt/frontend/jaxrs/src/test/java/org/apache/cxf/jaxrs/provider/template.xsl (with props)
cxf/trunk/systests/src/test/java/org/apache/cxf/systest/jaxrs/URIResolverImpl.java (with props)
cxf/trunk/systests/src/test/java/org/apache/cxf/systest/jaxrs/resources/book.xhtml
cxf/trunk/systests/src/test/java/org/apache/cxf/systest/jaxrs/resources/template.xsl (with props)
cxf/trunk/systests/src/test/java/org/apache/cxf/systest/jaxrs/resources/template2.xsl (with props)
Modified:
cxf/trunk/rt/frontend/jaxrs/src/main/java/org/apache/cxf/jaxrs/provider/JAXBElementProvider.java
cxf/trunk/rt/frontend/jaxrs/src/test/java/org/apache/cxf/jaxrs/resources/Book.java
cxf/trunk/systests/src/test/java/org/apache/cxf/systest/jaxrs/BookStoreSpring.java
cxf/trunk/systests/src/test/java/org/apache/cxf/systest/jaxrs/JAXRSClientServerSpringBookTest.java
cxf/trunk/systests/src/test/resources/jaxrs/WEB-INF/beans.xml
Modified: cxf/trunk/rt/frontend/jaxrs/src/main/java/org/apache/cxf/jaxrs/provider/JAXBElementProvider.java
URL: http://svn.apache.org/viewvc/cxf/trunk/rt/frontend/jaxrs/src/main/java/org/apache/cxf/jaxrs/provider/JAXBElementProvider.java?rev=772137&r1=772136&r2=772137&view=diff
==============================================================================
--- cxf/trunk/rt/frontend/jaxrs/src/main/java/org/apache/cxf/jaxrs/provider/JAXBElementProvider.java (original)
+++ cxf/trunk/rt/frontend/jaxrs/src/main/java/org/apache/cxf/jaxrs/provider/JAXBElementProvider.java Wed May 6 10:34:42 2009
@@ -106,7 +106,7 @@
if (JAXBElement.class.isAssignableFrom(type)) {
response = unmarshaller.unmarshal(new StreamSource(is), theType);
} else {
- response = unmarshaller.unmarshal(is);
+ response = doUnmarshal(unmarshaller, is, mt);
}
response = checkAdapter(response, anns, false);
return response;
@@ -122,6 +122,10 @@
return null;
}
+ protected Object doUnmarshal(Unmarshaller unmarshaller, InputStream is, MediaType mt)
+ throws JAXBException {
+ return unmarshaller.unmarshal(is);
+ }
public void writeTo(Object obj, Class<?> cls, Type genericType, Annotation[] anns,
MediaType m, MultivaluedMap<String, Object> headers, OutputStream os)
@@ -133,7 +137,7 @@
genericType = actualClass;
}
String encoding = getEncoding(m, headers);
- marshal(actualObject, actualClass, genericType, encoding, os);
+ marshal(actualObject, actualClass, genericType, encoding, os, m);
} catch (JAXBException e) {
handleJAXBException(e);
} catch (WebApplicationException e) {
@@ -143,7 +147,8 @@
}
}
- protected void marshal(Object obj, Class<?> cls, Type genericType, String enc, OutputStream os)
+ protected void marshal(Object obj, Class<?> cls, Type genericType,
+ String enc, OutputStream os, MediaType mt)
throws Exception {
Marshaller ms = createMarshaller(obj, cls, genericType, enc);
@@ -158,8 +163,12 @@
}
ms.marshal(obj, writer);
} else {
- ms.marshal(obj, os);
+ doMarshal(ms, obj, os, mt);
}
}
+ protected void doMarshal(Marshaller ms, Object obj, OutputStream os, MediaType mt)
+ throws Exception {
+ ms.marshal(obj, os);
+ }
}
Added: cxf/trunk/rt/frontend/jaxrs/src/main/java/org/apache/cxf/jaxrs/provider/XSLTJaxbProvider.java
URL: http://svn.apache.org/viewvc/cxf/trunk/rt/frontend/jaxrs/src/main/java/org/apache/cxf/jaxrs/provider/XSLTJaxbProvider.java?rev=772137&view=auto
==============================================================================
--- cxf/trunk/rt/frontend/jaxrs/src/main/java/org/apache/cxf/jaxrs/provider/XSLTJaxbProvider.java (added)
+++ cxf/trunk/rt/frontend/jaxrs/src/main/java/org/apache/cxf/jaxrs/provider/XSLTJaxbProvider.java Wed May 6 10:34:42 2009
@@ -0,0 +1,342 @@
+/**
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements. See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership. The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License. You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied. See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+package org.apache.cxf.jaxrs.provider;
+
+import java.io.BufferedReader;
+import java.io.File;
+import java.io.FileInputStream;
+import java.io.InputStream;
+import java.io.InputStreamReader;
+import java.io.OutputStream;
+import java.io.Reader;
+import java.lang.annotation.Annotation;
+import java.lang.reflect.Type;
+import java.util.ArrayList;
+import java.util.HashMap;
+import java.util.List;
+import java.util.Map;
+import java.util.Properties;
+import java.util.logging.Logger;
+
+import javax.ws.rs.Consumes;
+import javax.ws.rs.Produces;
+import javax.ws.rs.WebApplicationException;
+import javax.ws.rs.core.MediaType;
+import javax.ws.rs.core.MultivaluedMap;
+import javax.ws.rs.core.PathSegment;
+import javax.ws.rs.core.UriInfo;
+import javax.ws.rs.ext.Provider;
+import javax.xml.bind.JAXBException;
+import javax.xml.bind.Marshaller;
+import javax.xml.bind.Unmarshaller;
+import javax.xml.transform.Result;
+import javax.xml.transform.Source;
+import javax.xml.transform.Templates;
+import javax.xml.transform.Transformer;
+import javax.xml.transform.TransformerConfigurationException;
+import javax.xml.transform.TransformerFactory;
+import javax.xml.transform.URIResolver;
+import javax.xml.transform.sax.SAXSource;
+import javax.xml.transform.sax.SAXTransformerFactory;
+import javax.xml.transform.sax.TransformerHandler;
+import javax.xml.transform.stream.StreamResult;
+import javax.xml.transform.stream.StreamSource;
+
+import org.xml.sax.InputSource;
+import org.xml.sax.XMLFilter;
+
+import org.apache.cxf.common.logging.LogUtils;
+import org.apache.cxf.jaxrs.ext.MessageContext;
+
+@Produces({"application/xml", "application/*+xml", "text/xml", "text/html" })
+@Consumes({"application/xml", "application/*+xml", "text/xml", "text/html" })
+@Provider
+public class XSLTJaxbProvider extends JAXBElementProvider {
+
+ private static final Logger LOG = LogUtils.getL7dLogger(XSLTJaxbProvider.class);
+
+ private static final String ABSOLUTE_PATH_PARAMETER = "absolute.path";
+ private static final String BASE_PATH_PARAMETER = "base.path";
+ private static final String RELATIVE_PATH_PARAMETER = "relative.path";
+
+ private SAXTransformerFactory factory;
+ private Templates inTemplates;
+ private Templates outTemplates;
+ private Map<String, Templates> inMediaTemplates;
+ private Map<String, Templates> outMediaTemplates;
+
+ private List<String> inClassesToHandle;
+ private List<String> outClassesToHandle;
+ private Map<String, Object> inParamsMap;
+ private Map<String, Object> outParamsMap;
+ private Map<String, String> inProperties;
+ private Map<String, String> outProperties;
+ private URIResolver uriResolver;
+ private String systemId;
+
+ @Override
+ public boolean isReadable(Class<?> type, Type genericType, Annotation[] anns, MediaType mt) {
+ return inTemplatesAvailable(mt) && inClassCanBeHandled(type.getName())
+ && super.isReadable(type, genericType, anns, mt);
+ }
+
+ @Override
+ public boolean isWriteable(Class<?> type, Type genericType, Annotation[] anns, MediaType mt) {
+ return outTemplatesAvailable(mt) && outClassCanBeHandled(type.getName())
+ && super.isWriteable(type, genericType, anns, mt);
+ }
+
+ protected boolean inTemplatesAvailable(MediaType mt) {
+ return inTemplates != null || inMediaTemplates.containsKey(mt.getType() + "/" + mt.getSubtype());
+ }
+
+ protected boolean outTemplatesAvailable(MediaType mt) {
+ return outTemplates != null || outMediaTemplates.containsKey(mt.getType() + "/" + mt.getSubtype());
+ }
+
+ protected Templates getInTemplates(MediaType mt) {
+ return inTemplates != null ? inTemplates
+ : inMediaTemplates.get(mt.getType() + "/" + mt.getSubtype());
+ }
+
+ protected Templates getOutTemplates(MediaType mt) {
+ return outTemplates != null ? outTemplates
+ : outMediaTemplates.get(mt.getType() + "/" + mt.getSubtype());
+ }
+
+ @Override
+ protected Object doUnmarshal(Unmarshaller unmarshaller, InputStream is, MediaType mt)
+ throws JAXBException {
+ try {
+ XMLFilter filter = factory.newXMLFilter(
+ createTemplates(getInTemplates(mt), inParamsMap, inProperties));
+ SAXSource source = new SAXSource(filter, new InputSource(is));
+ if (systemId != null) {
+ source.setSystemId(systemId);
+ }
+ return unmarshaller.unmarshal(source);
+ } catch (TransformerConfigurationException ex) {
+ LOG.warning("Transformation exception : " + ex.getMessage());
+ throw new WebApplicationException(ex);
+ }
+ }
+
+ @Override
+ protected void doMarshal(Marshaller ms, Object obj, OutputStream os, MediaType mt)
+ throws Exception {
+ TransformerHandler th = factory.newTransformerHandler(
+ createTemplates(getOutTemplates(mt), outParamsMap, outProperties));
+ Result result = new StreamResult(os);
+ if (systemId != null) {
+ result.setSystemId(systemId);
+ }
+ th.setResult(result);
+ ms.marshal(obj, th);
+ }
+
+ public void setOutTemplate(String loc) {
+ outTemplates = createTemplates(loc);
+ }
+
+ public void setInTemplate(String loc) {
+ inTemplates = createTemplates(loc);
+ }
+
+ public void setInMediaTemplates(Map<String, String> map) {
+ inMediaTemplates = new HashMap<String, Templates>();
+ for (Map.Entry<String, String> entry : map.entrySet()) {
+ inMediaTemplates.put(entry.getKey(), createTemplates(entry.getValue()));
+ }
+ }
+
+ public void setOutMediaTemplates(Map<String, String> map) {
+ outMediaTemplates = new HashMap<String, Templates>();
+ for (Map.Entry<String, String> entry : map.entrySet()) {
+ outMediaTemplates.put(entry.getKey(), createTemplates(entry.getValue()));
+ }
+ }
+
+ public void setResolver(URIResolver resolver) {
+ uriResolver = resolver;
+ if (factory != null) {
+ factory.setURIResolver(uriResolver);
+ }
+ }
+
+ public void setSystemId(String system) {
+ systemId = system;
+ }
+
+ public void setInParameters(Map<String, Object> inParams) {
+ this.inParamsMap = inParams;
+ }
+
+ public void setOutParameters(Map<String, Object> outParams) {
+ this.outParamsMap = outParams;
+ }
+
+ public void setInProperties(Map<String, String> inProps) {
+ this.inProperties = inProps;
+ }
+
+ public void setOutProperties(Map<String, String> outProps) {
+ this.outProperties = outProps;
+ }
+
+ public void setInClassname(String className) {
+ if (inClassesToHandle == null) {
+ inClassesToHandle = new ArrayList<String>();
+ }
+ inClassesToHandle.add(className);
+ }
+
+ public boolean inClassCanBeHandled(String className) {
+ return inClassesToHandle == null || inClassesToHandle.contains(className);
+ }
+
+ public void setOutClassname(String className) {
+ if (outClassesToHandle == null) {
+ outClassesToHandle = new ArrayList<String>();
+ }
+ outClassesToHandle.add(className);
+ }
+
+ public boolean outClassCanBeHandled(String className) {
+ return outClassesToHandle == null || outClassesToHandle.contains(className);
+ }
+
+ @SuppressWarnings("unchecked")
+ private Templates createTemplates(Templates templates,
+ Map<String, Object> configuredParams,
+ Map<String, String> outProps) {
+ if (templates == null) {
+ LOG.severe("No template is available");
+ throw new WebApplicationException(500);
+ }
+
+ TemplatesImpl templ = new TemplatesImpl(templates);
+ MessageContext mc = getContext();
+ if (mc != null) {
+ UriInfo ui = mc.getUriInfo();
+ MultivaluedMap<String, String> params = ui.getPathParameters();
+ for (Map.Entry<String, List<String>> entry : params.entrySet()) {
+ String value = entry.getValue().get(0);
+ int ind = value.indexOf(";");
+ if (ind > 0) {
+ value = value.substring(0, ind);
+ }
+ templ.setTransformerParameter(entry.getKey(), value);
+ }
+
+ List<PathSegment> segments = ui.getPathSegments();
+ if (segments.size() > 0) {
+ setTransformParameters(templ, segments.get(segments.size() - 1).getMatrixParameters());
+ }
+ setTransformParameters(templ, ui.getQueryParameters());
+ templ.setTransformerParameter(ABSOLUTE_PATH_PARAMETER, ui.getAbsolutePath().toString());
+ templ.setTransformerParameter(RELATIVE_PATH_PARAMETER, ui.getPath());
+ templ.setTransformerParameter(BASE_PATH_PARAMETER, ui.getBaseUri().toString());
+ if (configuredParams != null) {
+ for (Map.Entry<String, Object> entry : configuredParams.entrySet()) {
+ templ.setTransformerParameter(entry.getKey(), entry.getValue());
+ }
+ }
+ }
+ if (outProps != null) {
+ templ.setOutProperties(outProps);
+ }
+
+ return templ;
+ }
+
+ private void setTransformParameters(TemplatesImpl templ, MultivaluedMap<String, String> params) {
+ for (Map.Entry<String, List<String>> entry : params.entrySet()) {
+ templ.setTransformerParameter(entry.getKey(), entry.getValue().get(0));
+ }
+ }
+
+ protected Templates createTemplates(String loc) {
+ try {
+ InputStream is = null;
+ if (loc.startsWith("classpath:")) {
+ String path = loc.substring("classpath:".length() + 1);
+ is = this.getClass().getClassLoader().getResourceAsStream(path);
+ } else {
+ File f = new File(loc);
+ if (f.exists()) {
+ is = new FileInputStream(f);
+ }
+ }
+ if (is == null) {
+ LOG.warning("No template is available at : " + loc);
+ return null;
+ }
+
+ Reader r = new BufferedReader(
+ new InputStreamReader(is, "UTF-8"));
+ Source source = new StreamSource(r);
+ if (factory == null) {
+ factory = (SAXTransformerFactory)TransformerFactory.newInstance();
+ if (uriResolver != null) {
+ factory.setURIResolver(uriResolver);
+ }
+ }
+ return factory.newTemplates(source);
+
+ } catch (Exception ex) {
+ LOG.warning("No template can be created : " + ex.getMessage());
+ }
+ return null;
+ }
+
+ private static class TemplatesImpl implements Templates {
+
+ private Templates templates;
+ private Map<String, Object> transformParameters = new HashMap<String, Object>();
+ private Map<String, String> outProps = new HashMap<String, String>();
+
+ public TemplatesImpl(Templates templates) {
+ this.templates = templates;
+ }
+
+ public void setTransformerParameter(String name, Object value) {
+ transformParameters.put(name, value);
+ }
+
+ public void setOutProperties(Map<String, String> props) {
+ this.outProps = props;
+ }
+
+ public Properties getOutputProperties() {
+ return templates.getOutputProperties();
+ }
+
+ public Transformer newTransformer() throws TransformerConfigurationException {
+ Transformer tr = templates.newTransformer();
+ for (Map.Entry<String, Object> entry : transformParameters.entrySet()) {
+ tr.setParameter(entry.getKey(), entry.getValue());
+ }
+ for (Map.Entry<String, String> entry : outProps.entrySet()) {
+ tr.setOutputProperty(entry.getKey(), entry.getValue());
+ }
+ return tr;
+ }
+
+ }
+}
Propchange: cxf/trunk/rt/frontend/jaxrs/src/main/java/org/apache/cxf/jaxrs/provider/XSLTJaxbProvider.java
------------------------------------------------------------------------------
svn:eol-style = native
Propchange: cxf/trunk/rt/frontend/jaxrs/src/main/java/org/apache/cxf/jaxrs/provider/XSLTJaxbProvider.java
------------------------------------------------------------------------------
svn:keywords = Rev Date
Added: cxf/trunk/rt/frontend/jaxrs/src/test/java/org/apache/cxf/jaxrs/provider/XSLTJaxbProviderTest.java
URL: http://svn.apache.org/viewvc/cxf/trunk/rt/frontend/jaxrs/src/test/java/org/apache/cxf/jaxrs/provider/XSLTJaxbProviderTest.java?rev=772137&view=auto
==============================================================================
--- cxf/trunk/rt/frontend/jaxrs/src/test/java/org/apache/cxf/jaxrs/provider/XSLTJaxbProviderTest.java (added)
+++ cxf/trunk/rt/frontend/jaxrs/src/test/java/org/apache/cxf/jaxrs/provider/XSLTJaxbProviderTest.java Wed May 6 10:34:42 2009
@@ -0,0 +1,74 @@
+/**
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements. See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership. The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License. You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied. See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+package org.apache.cxf.jaxrs.provider;
+
+import java.io.ByteArrayInputStream;
+import java.io.ByteArrayOutputStream;
+import java.io.StringReader;
+
+import javax.ws.rs.core.MediaType;
+import javax.xml.bind.Unmarshaller;
+
+import org.apache.cxf.jaxrs.impl.MetadataMap;
+import org.apache.cxf.jaxrs.resources.Book;
+
+import org.junit.Assert;
+import org.junit.Test;
+
+public class XSLTJaxbProviderTest extends Assert {
+
+ private static final String TEMPLATE_LOCATION = "classpath:/org/apache/cxf/jaxrs/provider/template.xsl";
+ private static final String BOOK_XML = "<Book><id>123</id><name>TheBook</name></Book>";
+
+ @Test
+ public void testWrite() throws Exception {
+ XSLTJaxbProvider provider = new XSLTJaxbProvider();
+ provider.setOutTemplate(TEMPLATE_LOCATION);
+
+ Book b = new Book();
+ b.setId(123L);
+ b.setName("TheBook");
+ ByteArrayOutputStream bos = new ByteArrayOutputStream();
+ provider.writeTo(b, Book.class, Book.class, b.getClass().getAnnotations(),
+ MediaType.TEXT_XML_TYPE, new MetadataMap<String, Object>(), bos);
+ Unmarshaller um = provider.getClassContext(Book.class).createUnmarshaller();
+ Book b2 = (Book)um.unmarshal(new StringReader(bos.toString()));
+ b.setName("TheBook2");
+ assertEquals("Transformation is bad", b, b2);
+ }
+
+ @SuppressWarnings("unchecked")
+ @Test
+ public void testRead() throws Exception {
+ XSLTJaxbProvider provider = new XSLTJaxbProvider();
+ provider.setInTemplate(TEMPLATE_LOCATION);
+
+ Book b = new Book();
+ b.setId(123L);
+ b.setName("TheBook");
+ Book b2 = (Book)provider.readFrom((Class)Book.class, Book.class, b.getClass().getAnnotations(),
+ MediaType.TEXT_XML_TYPE, new MetadataMap<String, String>(),
+ new ByteArrayInputStream(BOOK_XML.getBytes()));
+ b.setName("TheBook2");
+ assertEquals("Transformation is bad", b, b2);
+ }
+
+
+
+}
Propchange: cxf/trunk/rt/frontend/jaxrs/src/test/java/org/apache/cxf/jaxrs/provider/XSLTJaxbProviderTest.java
------------------------------------------------------------------------------
svn:eol-style = native
Propchange: cxf/trunk/rt/frontend/jaxrs/src/test/java/org/apache/cxf/jaxrs/provider/XSLTJaxbProviderTest.java
------------------------------------------------------------------------------
svn:keywords = Rev Date
Added: cxf/trunk/rt/frontend/jaxrs/src/test/java/org/apache/cxf/jaxrs/provider/template.xsl
URL: http://svn.apache.org/viewvc/cxf/trunk/rt/frontend/jaxrs/src/test/java/org/apache/cxf/jaxrs/provider/template.xsl?rev=772137&view=auto
==============================================================================
--- cxf/trunk/rt/frontend/jaxrs/src/test/java/org/apache/cxf/jaxrs/provider/template.xsl (added)
+++ cxf/trunk/rt/frontend/jaxrs/src/test/java/org/apache/cxf/jaxrs/provider/template.xsl Wed May 6 10:34:42 2009
@@ -0,0 +1,13 @@
+<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform" version="1.0">
+ <xsl:template match="@*|node()">
+ <xsl:copy>
+ <xsl:apply-templates select="@*|node()"/>
+ </xsl:copy>
+ </xsl:template>
+
+ <xsl:template match="name">
+ <xsl:copy>TheBook2</xsl:copy>
+ </xsl:template>
+
+
+</xsl:stylesheet>
Propchange: cxf/trunk/rt/frontend/jaxrs/src/test/java/org/apache/cxf/jaxrs/provider/template.xsl
------------------------------------------------------------------------------
svn:eol-style = native
Propchange: cxf/trunk/rt/frontend/jaxrs/src/test/java/org/apache/cxf/jaxrs/provider/template.xsl
------------------------------------------------------------------------------
svn:keywords = Rev Date
Propchange: cxf/trunk/rt/frontend/jaxrs/src/test/java/org/apache/cxf/jaxrs/provider/template.xsl
------------------------------------------------------------------------------
svn:mime-type = text/xml
Modified: cxf/trunk/rt/frontend/jaxrs/src/test/java/org/apache/cxf/jaxrs/resources/Book.java
URL: http://svn.apache.org/viewvc/cxf/trunk/rt/frontend/jaxrs/src/test/java/org/apache/cxf/jaxrs/resources/Book.java?rev=772137&r1=772136&r2=772137&view=diff
==============================================================================
--- cxf/trunk/rt/frontend/jaxrs/src/test/java/org/apache/cxf/jaxrs/resources/Book.java (original)
+++ cxf/trunk/rt/frontend/jaxrs/src/test/java/org/apache/cxf/jaxrs/resources/Book.java Wed May 6 10:34:42 2009
@@ -37,6 +37,11 @@
public Book() {
}
+ public Book(String name, long id) {
+ this.name = name;
+ this.id = id;
+ }
+
public void setName(String n) {
name = n;
}
@@ -62,4 +67,18 @@
public String getState() {
return "";
}
+
+ public int hashCode() {
+ return name.hashCode() * 37 + new Long(id).hashCode();
+ }
+
+ public boolean equals(Object o) {
+ if (!(o instanceof Book)) {
+ return false;
+ }
+ Book other = (Book)o;
+
+ return other.name.equals(name) && other.id == id;
+
+ }
}
Modified: cxf/trunk/systests/src/test/java/org/apache/cxf/systest/jaxrs/BookStoreSpring.java
URL: http://svn.apache.org/viewvc/cxf/trunk/systests/src/test/java/org/apache/cxf/systest/jaxrs/BookStoreSpring.java?rev=772137&r1=772136&r2=772137&view=diff
==============================================================================
--- cxf/trunk/systests/src/test/java/org/apache/cxf/systest/jaxrs/BookStoreSpring.java (original)
+++ cxf/trunk/systests/src/test/java/org/apache/cxf/systest/jaxrs/BookStoreSpring.java Wed May 6 10:34:42 2009
@@ -25,6 +25,7 @@
import javax.ws.rs.Consumes;
import javax.ws.rs.GET;
+import javax.ws.rs.MatrixParam;
import javax.ws.rs.POST;
import javax.ws.rs.Path;
import javax.ws.rs.PathParam;
@@ -117,7 +118,18 @@
return b;
}
-
+ @GET
+ @Path("books/xslt/{id}")
+ @Produces({"text/html", "application/xhtml+xml", "application/xml" })
+ public Book getBookXSLT(@PathParam("id") long id,
+ @QueryParam("name") String name,
+ @MatrixParam("name2") String name2) {
+ // how to have Book2 populated ?
+ Book b = new Book();
+ b.setId(999);
+ b.setName("CXF in ");
+ return b;
+ }
final void init() {
Book book = new Book();
Modified: cxf/trunk/systests/src/test/java/org/apache/cxf/systest/jaxrs/JAXRSClientServerSpringBookTest.java
URL: http://svn.apache.org/viewvc/cxf/trunk/systests/src/test/java/org/apache/cxf/systest/jaxrs/JAXRSClientServerSpringBookTest.java?rev=772137&r1=772136&r2=772137&view=diff
==============================================================================
--- cxf/trunk/systests/src/test/java/org/apache/cxf/systest/jaxrs/JAXRSClientServerSpringBookTest.java (original)
+++ cxf/trunk/systests/src/test/java/org/apache/cxf/systest/jaxrs/JAXRSClientServerSpringBookTest.java Wed May 6 10:34:42 2009
@@ -23,6 +23,11 @@
import java.io.InputStream;
import java.net.URL;
import java.net.URLConnection;
+import java.util.HashMap;
+import java.util.Map;
+
+import javax.xml.bind.annotation.XmlElement;
+import javax.xml.bind.annotation.XmlRootElement;
import org.apache.commons.httpclient.HttpClient;
import org.apache.commons.httpclient.methods.FileRequestEntity;
@@ -30,8 +35,12 @@
import org.apache.commons.httpclient.methods.RequestEntity;
import org.apache.cxf.helpers.IOUtils;
import org.apache.cxf.io.CachedOutputStream;
+import org.apache.cxf.jaxrs.client.WebClient;
+import org.apache.cxf.jaxrs.ext.xml.XMLSource;
import org.apache.cxf.testutil.common.AbstractBusClientServerTestBase;
+
import org.junit.BeforeClass;
+import org.junit.Ignore;
import org.junit.Test;
public class JAXRSClientServerSpringBookTest extends AbstractBusClientServerTestBase {
@@ -39,7 +48,7 @@
@BeforeClass
public static void startServers() throws Exception {
assertTrue("server did not launch correctly",
- launchServer(BookServerSpring.class, true));
+ launchServer(BookServerSpring.class));
}
@Test
@@ -173,13 +182,41 @@
}
@Test
- public void testAddGetBookAegis() throws Exception {
+ public void testGetBookAegis() throws Exception {
String endpointAddress =
"http://localhost:9080/the/thebooks4/bookstore/books/aegis";
getBook(endpointAddress, "resources/expected_add_book_aegis.txt", "application/xml");
}
+
+ @Test
+ public void testGetBookXSLTXml() throws Exception {
+ String endpointAddress =
+ "http://localhost:9080/the/thebooks5/bookstore/books/xslt";
+ WebClient wc = WebClient.create(endpointAddress);
+ wc.accept("application/xml").path(666).matrix("name2", 2).query("name", "Action - ");
+ Book b = wc.get(Book.class);
+ assertEquals(666, b.getId());
+ assertEquals("CXF in Action - 2", b.getName());
+ }
+
+
+ @Test
+ public void testGetBookXSLTHtml() throws Exception {
+
+ String endpointAddress =
+ "http://localhost:9080/the/thebooks5/bookstore/books/xslt";
+ WebClient wc = WebClient.create(endpointAddress);
+ wc.accept("application/xhtml+xml").path(666).matrix("name2", 2).query("name", "Action - ");
+ XMLSource source = wc.get(XMLSource.class);
+ Map<String, String> namespaces = new HashMap<String, String>();
+ namespaces.put("xhtml", "http://www.w3.org/1999/xhtml");
+ Book2 b = source.getNode("xhtml:html/xhtml:body/xhtml:ul/xhtml:Book", namespaces, Book2.class);
+ assertEquals(666, b.getId());
+ assertEquals("CXF in Action - 2", b.getName());
+ }
+
@Test
public void testAddValidBookJson() throws Exception {
doPost("http://localhost:9080/the/bookstore/books/convert",
@@ -236,4 +273,31 @@
return bos.getOut().toString();
}
+ @Ignore
+ @XmlRootElement(name = "Book", namespace = "http://www.w3.org/1999/xhtml")
+ public static class Book2 {
+ @XmlElement(name = "id", namespace = "http://www.w3.org/1999/xhtml")
+ private long id1;
+ @XmlElement(name = "name", namespace = "http://www.w3.org/1999/xhtml")
+ private String name1;
+ public Book2() {
+
+ }
+ public long getId() {
+ return id1;
+ }
+
+ public void setId(Long theId) {
+ id1 = theId;
+ }
+
+ public String getName() {
+ return name1;
+ }
+
+ public void setName(String n) {
+ name1 = n;
+ }
+
+ }
}
Added: cxf/trunk/systests/src/test/java/org/apache/cxf/systest/jaxrs/URIResolverImpl.java
URL: http://svn.apache.org/viewvc/cxf/trunk/systests/src/test/java/org/apache/cxf/systest/jaxrs/URIResolverImpl.java?rev=772137&view=auto
==============================================================================
--- cxf/trunk/systests/src/test/java/org/apache/cxf/systest/jaxrs/URIResolverImpl.java (added)
+++ cxf/trunk/systests/src/test/java/org/apache/cxf/systest/jaxrs/URIResolverImpl.java Wed May 6 10:34:42 2009
@@ -0,0 +1,37 @@
+/**
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements. See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership. The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License. You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied. See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+
+package org.apache.cxf.systest.jaxrs;
+
+import java.io.InputStream;
+
+import javax.xml.transform.Source;
+import javax.xml.transform.TransformerException;
+import javax.xml.transform.URIResolver;
+import javax.xml.transform.stream.StreamSource;
+
+public class URIResolverImpl implements URIResolver {
+
+ public Source resolve(String href, String base) throws TransformerException {
+ InputStream is = getClass().getClassLoader()
+ .getResourceAsStream("org/apache/cxf/systest/jaxrs/resources/" + href);
+ return new StreamSource(is);
+ }
+
+}
Propchange: cxf/trunk/systests/src/test/java/org/apache/cxf/systest/jaxrs/URIResolverImpl.java
------------------------------------------------------------------------------
svn:eol-style = native
Propchange: cxf/trunk/systests/src/test/java/org/apache/cxf/systest/jaxrs/URIResolverImpl.java
------------------------------------------------------------------------------
svn:keywords = Rev Date
Added: cxf/trunk/systests/src/test/java/org/apache/cxf/systest/jaxrs/resources/book.xhtml
URL: http://svn.apache.org/viewvc/cxf/trunk/systests/src/test/java/org/apache/cxf/systest/jaxrs/resources/book.xhtml?rev=772137&view=auto
==============================================================================
--- cxf/trunk/systests/src/test/java/org/apache/cxf/systest/jaxrs/resources/book.xhtml (added)
+++ cxf/trunk/systests/src/test/java/org/apache/cxf/systest/jaxrs/resources/book.xhtml Wed May 6 10:34:42 2009
@@ -0,0 +1,10 @@
+<html xmlns="http://www.w3.org/1999/xhtml"
+ xmlns:books="http://www.w3.org/books">
+<head> <title>Testing XML Example</title> </head>
+<body>
+ <h1>Book</h1>
+ <ul>
+ <books:bookTag/>
+ </ul>
+</body>
+</html>
Added: cxf/trunk/systests/src/test/java/org/apache/cxf/systest/jaxrs/resources/template.xsl
URL: http://svn.apache.org/viewvc/cxf/trunk/systests/src/test/java/org/apache/cxf/systest/jaxrs/resources/template.xsl?rev=772137&view=auto
==============================================================================
--- cxf/trunk/systests/src/test/java/org/apache/cxf/systest/jaxrs/resources/template.xsl (added)
+++ cxf/trunk/systests/src/test/java/org/apache/cxf/systest/jaxrs/resources/template.xsl Wed May 6 10:34:42 2009
@@ -0,0 +1,16 @@
+<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform" version="1.0" xmlns:books="http://www.w3.org/books">
+
+ <xsl:import href="template2.xsl"/>
+
+ <xsl:variable name="root" select="/"/>
+ <xsl:variable name="htmlDoc" select="document('book.xhtml')"/>
+
+ <xsl:template match="/">
+ <xsl:apply-templates select="$htmlDoc/*"/>
+ </xsl:template>
+
+ <xsl:template match="books:bookTag">
+ <xsl:apply-templates select="$root/*"/>
+ </xsl:template>
+
+</xsl:stylesheet>
Propchange: cxf/trunk/systests/src/test/java/org/apache/cxf/systest/jaxrs/resources/template.xsl
------------------------------------------------------------------------------
svn:eol-style = native
Propchange: cxf/trunk/systests/src/test/java/org/apache/cxf/systest/jaxrs/resources/template.xsl
------------------------------------------------------------------------------
svn:keywords = Rev Date
Propchange: cxf/trunk/systests/src/test/java/org/apache/cxf/systest/jaxrs/resources/template.xsl
------------------------------------------------------------------------------
svn:mime-type = text/xml
Added: cxf/trunk/systests/src/test/java/org/apache/cxf/systest/jaxrs/resources/template2.xsl
URL: http://svn.apache.org/viewvc/cxf/trunk/systests/src/test/java/org/apache/cxf/systest/jaxrs/resources/template2.xsl?rev=772137&view=auto
==============================================================================
--- cxf/trunk/systests/src/test/java/org/apache/cxf/systest/jaxrs/resources/template2.xsl (added)
+++ cxf/trunk/systests/src/test/java/org/apache/cxf/systest/jaxrs/resources/template2.xsl Wed May 6 10:34:42 2009
@@ -0,0 +1,28 @@
+<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform" version="1.0" xmlns:books="http://www.w3.org/books">
+
+ <xsl:param name="id" select="''"/>
+ <xsl:param name="name" select="''"/>
+ <xsl:param name="name2" select="''"/>
+
+ <xsl:template match="@*|node()">
+ <xsl:copy>
+ <xsl:apply-templates select="@*|node()"/>
+ </xsl:copy>
+ </xsl:template>
+
+ <xsl:template match="id">
+ <xsl:copy>
+ <xsl:value-of select="$id"/>
+ </xsl:copy>
+ </xsl:template>
+
+ <xsl:template match="name">
+ <xsl:copy>
+ <xsl:value-of select="."/>
+ <xsl:value-of select="$name"/>
+ <xsl:value-of select="$name2"/>
+ </xsl:copy>
+ </xsl:template>
+
+
+</xsl:stylesheet>
Propchange: cxf/trunk/systests/src/test/java/org/apache/cxf/systest/jaxrs/resources/template2.xsl
------------------------------------------------------------------------------
svn:eol-style = native
Propchange: cxf/trunk/systests/src/test/java/org/apache/cxf/systest/jaxrs/resources/template2.xsl
------------------------------------------------------------------------------
svn:keywords = Rev Date
Propchange: cxf/trunk/systests/src/test/java/org/apache/cxf/systest/jaxrs/resources/template2.xsl
------------------------------------------------------------------------------
svn:mime-type = text/xml
Modified: cxf/trunk/systests/src/test/resources/jaxrs/WEB-INF/beans.xml
URL: http://svn.apache.org/viewvc/cxf/trunk/systests/src/test/resources/jaxrs/WEB-INF/beans.xml?rev=772137&r1=772136&r2=772137&view=diff
==============================================================================
--- cxf/trunk/systests/src/test/resources/jaxrs/WEB-INF/beans.xml (original)
+++ cxf/trunk/systests/src/test/resources/jaxrs/WEB-INF/beans.xml Wed May 6 10:34:42 2009
@@ -90,6 +90,32 @@
</jaxrs:server>
+ <jaxrs:server id="bookservice5"
+ address="/thebooks5/bookstore">
+ <jaxrs:serviceBeans>
+ <ref bean="serviceBean" />
+ </jaxrs:serviceBeans>
+
+ <jaxrs:providers>
+ <ref bean="xsltProvider"/>
+ </jaxrs:providers>
+ </jaxrs:server>
+
+ <util:map id="outTemplates">
+ <entry key="application/xhtml+xml" value="classpath:/org/apache/cxf/systest/jaxrs/resources/template.xsl"/>
+ <entry key="application/xml" value="classpath:/org/apache/cxf/systest/jaxrs/resources/template2.xsl"/>
+ </util:map>
+
+ <bean id="xsltProvider" class="org.apache.cxf.jaxrs.provider.XSLTJaxbProvider">
+ <property name="resolver" ref="uriResolver"/>
+ <!--
+ <property name="outTemplate" value="classpath:/org/apache/cxf/systest/jaxrs/resources/template.xsl"/>
+ -->
+ <property name="outMediaTemplates" ref="outTemplates"/>
+ </bean>
+
+ <bean id="uriResolver" class="org.apache.cxf.systest.jaxrs.URIResolverImpl"/>
+
<bean id="jaxbProvider" class="org.apache.cxf.jaxrs.provider.JAXBElementProvider">
<property name="schemaHandler" ref="schemaHolder"/>
</bean>