Return-Path: X-Original-To: apmail-cxf-commits-archive@www.apache.org Delivered-To: apmail-cxf-commits-archive@www.apache.org Received: from mail.apache.org (hermes.apache.org [140.211.11.3]) by minotaur.apache.org (Postfix) with SMTP id 99D5A9F3D for ; Tue, 26 Jun 2012 13:36:40 +0000 (UTC) Received: (qmail 93385 invoked by uid 500); 26 Jun 2012 13:36:40 -0000 Delivered-To: apmail-cxf-commits-archive@cxf.apache.org Received: (qmail 93327 invoked by uid 500); 26 Jun 2012 13:36:40 -0000 Mailing-List: contact commits-help@cxf.apache.org; run by ezmlm Precedence: bulk List-Help: List-Unsubscribe: List-Post: List-Id: Reply-To: dev@cxf.apache.org Delivered-To: mailing list commits@cxf.apache.org Received: (qmail 93320 invoked by uid 99); 26 Jun 2012 13:36:40 -0000 Received: from athena.apache.org (HELO athena.apache.org) (140.211.11.136) by apache.org (qpsmtpd/0.29) with ESMTP; Tue, 26 Jun 2012 13:36:40 +0000 X-ASF-Spam-Status: No, hits=-2000.0 required=5.0 tests=ALL_TRUSTED X-Spam-Check-By: apache.org Received: from [140.211.11.4] (HELO eris.apache.org) (140.211.11.4) by apache.org (qpsmtpd/0.29) with ESMTP; Tue, 26 Jun 2012 13:36:38 +0000 Received: from eris.apache.org (localhost [127.0.0.1]) by eris.apache.org (Postfix) with ESMTP id A927E23889E0; Tue, 26 Jun 2012 13:36:18 +0000 (UTC) Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit Subject: svn commit: r1354010 - in /cxf/branches/2.6.x-fixes: ./ rt/frontend/jaxrs/src/main/java/org/apache/cxf/jaxrs/ rt/frontend/jaxrs/src/main/java/org/apache/cxf/jaxrs/model/ rt/frontend/jaxrs/src/main/java/org/apache/cxf/jaxrs/model/wadl/ rt/frontend/jaxrs... Date: Tue, 26 Jun 2012 13:36:17 -0000 To: commits@cxf.apache.org From: sergeyb@apache.org X-Mailer: svnmailer-1.0.8-patched Message-Id: <20120626133618.A927E23889E0@eris.apache.org> X-Virus-Checked: Checked by ClamAV on apache.org Author: sergeyb Date: Tue Jun 26 13:36:15 2012 New Revision: 1354010 URL: http://svn.apache.org/viewvc?rev=1354010&view=rev Log: Merged revisions 1354002,1354009 via svnmerge from https://svn.apache.org/repos/asf/cxf/trunk ........ r1354002 | sergeyb | 2012-06-26 14:12:12 +0100 (Tue, 26 Jun 2012) | 1 line [CXF-4144] Updating generated schemas with wrapper element names when possible ........ r1354009 | sergeyb | 2012-06-26 14:33:08 +0100 (Tue, 26 Jun 2012) | 1 line [CXF-4144] Fixing the test ........ Added: cxf/branches/2.6.x-fixes/rt/frontend/jaxrs/src/main/java/org/apache/cxf/jaxrs/model/ResourceTypes.java - copied unchanged from r1354009, cxf/trunk/rt/frontend/jaxrs/src/main/java/org/apache/cxf/jaxrs/model/ResourceTypes.java Modified: cxf/branches/2.6.x-fixes/ (props changed) cxf/branches/2.6.x-fixes/rt/frontend/jaxrs/src/main/java/org/apache/cxf/jaxrs/AbstractJAXRSFactoryBean.java cxf/branches/2.6.x-fixes/rt/frontend/jaxrs/src/main/java/org/apache/cxf/jaxrs/model/wadl/WadlGenerator.java cxf/branches/2.6.x-fixes/rt/frontend/jaxrs/src/main/java/org/apache/cxf/jaxrs/provider/AbstractJAXBProvider.java cxf/branches/2.6.x-fixes/rt/frontend/jaxrs/src/main/java/org/apache/cxf/jaxrs/utils/ResourceUtils.java cxf/branches/2.6.x-fixes/rt/frontend/jaxrs/src/test/java/org/apache/cxf/jaxrs/model/wadl/BookStore.java cxf/branches/2.6.x-fixes/rt/frontend/jaxrs/src/test/java/org/apache/cxf/jaxrs/model/wadl/WadlGeneratorTest.java cxf/branches/2.6.x-fixes/rt/frontend/jaxrs/src/test/java/org/apache/cxf/jaxrs/provider/JAXBElementProviderTest.java cxf/branches/2.6.x-fixes/rt/frontend/jaxrs/src/test/java/org/apache/cxf/jaxrs/utils/ResourceUtilsTest.java Propchange: cxf/branches/2.6.x-fixes/ ------------------------------------------------------------------------------ Merged /cxf/trunk:r1354002-1354009 Propchange: cxf/branches/2.6.x-fixes/ ------------------------------------------------------------------------------ Binary property 'svnmerge-integrated' - no diff available. Modified: cxf/branches/2.6.x-fixes/rt/frontend/jaxrs/src/main/java/org/apache/cxf/jaxrs/AbstractJAXRSFactoryBean.java URL: http://svn.apache.org/viewvc/cxf/branches/2.6.x-fixes/rt/frontend/jaxrs/src/main/java/org/apache/cxf/jaxrs/AbstractJAXRSFactoryBean.java?rev=1354010&r1=1354009&r2=1354010&view=diff ============================================================================== --- cxf/branches/2.6.x-fixes/rt/frontend/jaxrs/src/main/java/org/apache/cxf/jaxrs/AbstractJAXRSFactoryBean.java (original) +++ cxf/branches/2.6.x-fixes/rt/frontend/jaxrs/src/main/java/org/apache/cxf/jaxrs/AbstractJAXRSFactoryBean.java Tue Jun 26 13:36:15 2012 @@ -345,7 +345,8 @@ public class AbstractJAXRSFactoryBean ex return; } if (db instanceof PropertiesAwareDataBinding) { - Map, Type> allClasses = ResourceUtils.getAllRequestResponseTypes(cris, false); + Map, Type> allClasses = + ResourceUtils.getAllRequestResponseTypes(cris, false).getAllTypes(); Map props = new HashMap(); props.put(PropertiesAwareDataBinding.TYPES_PROPERTY, allClasses); ((PropertiesAwareDataBinding)db).initialize(props); Modified: cxf/branches/2.6.x-fixes/rt/frontend/jaxrs/src/main/java/org/apache/cxf/jaxrs/model/wadl/WadlGenerator.java URL: http://svn.apache.org/viewvc/cxf/branches/2.6.x-fixes/rt/frontend/jaxrs/src/main/java/org/apache/cxf/jaxrs/model/wadl/WadlGenerator.java?rev=1354010&r1=1354009&r2=1354010&view=diff ============================================================================== --- cxf/branches/2.6.x-fixes/rt/frontend/jaxrs/src/main/java/org/apache/cxf/jaxrs/model/wadl/WadlGenerator.java (original) +++ cxf/branches/2.6.x-fixes/rt/frontend/jaxrs/src/main/java/org/apache/cxf/jaxrs/model/wadl/WadlGenerator.java Tue Jun 26 13:36:15 2012 @@ -95,6 +95,7 @@ import org.apache.cxf.jaxrs.model.ClassR import org.apache.cxf.jaxrs.model.OperationResourceInfo; import org.apache.cxf.jaxrs.model.Parameter; import org.apache.cxf.jaxrs.model.ParameterType; +import org.apache.cxf.jaxrs.model.ResourceTypes; import org.apache.cxf.jaxrs.model.URITemplate; import org.apache.cxf.jaxrs.utils.AnnotationUtils; import org.apache.cxf.jaxrs.utils.InjectionUtils; @@ -129,7 +130,8 @@ public class WadlGenerator implements Re private boolean ignoreRequests; private boolean linkJsonToXmlSchema; private boolean useJaxbContextForQnames = true; - + private boolean supportCollections = true; + private List externalSchemasCache; private List externalSchemaLinks; private Map> externalQnamesMap; @@ -212,12 +214,14 @@ public class WadlGenerator implements Re List cris = getResourcesList(m, resource); - Set> allTypes = - ResourceUtils.getAllRequestResponseTypes(cris, useJaxbContextForQnames).keySet(); + ResourceTypes resourceTypes = + ResourceUtils.getAllRequestResponseTypes(cris, useJaxbContextForQnames); + Set> allTypes = resourceTypes.getAllTypes().keySet(); + JAXBContext context = useJaxbContextForQnames ? ResourceUtils.createJaxbContext(new HashSet>(allTypes), null, null) : null; - SchemaWriter schemaWriter = createSchemaWriter(context, ui); + SchemaWriter schemaWriter = createSchemaWriter(resourceTypes, context, ui); ElementQNameResolver qnameResolver = schemaWriter == null ? null : createElementQNameResolver(context); @@ -738,14 +742,20 @@ public class WadlGenerator implements Re doWriteParam(sb, p, type, type, p.getName() == null ? "request" : p.getName(), anns, isJson); sb.append(""); } else { - type = ResourceUtils.getActualJaxbType(type, opMethod, inbound); + boolean isCollection = InjectionUtils.isSupportedCollectionOrArray(type); + if (isCollection) { + type = InjectionUtils.getActualType(!inbound ? opMethod.getGenericReturnType() + : opMethod.getGenericParameterTypes()[getRequestBodyParam(ori).getIndex()]); + } else { + type = ResourceUtils.getActualJaxbType(type, opMethod, inbound); + } if (isJson) { sb.append(" element=\"").append(type.getSimpleName()).append("\""); } else if (qnameResolver != null && (mt.getSubtype().contains("xml") || linkJsonToXmlSchema && mt.getSubtype().contains("json")) && jaxbTypes.contains(type)) { - generateQName(sb, qnameResolver, clsMap, type, + generateQName(sb, qnameResolver, clsMap, type, isCollection, getBodyAnnotations(ori, inbound)); } addDocsAndCloseElement(sb, anns, "representation", docCategory, allowDefault, isJson); @@ -910,20 +920,34 @@ public class WadlGenerator implements Re ElementQNameResolver qnameResolver, Map, QName> clsMap, Class type, + boolean isCollection, Annotation[] annotations) { - - QName typeQName = clsMap.get(type); - if (typeQName != null) { - writeQName(sb, typeQName); - return; + if (!isCollection) { + QName typeQName = clsMap.get(type); + if (typeQName != null) { + writeQName(sb, typeQName); + return; + } } QName qname = qnameResolver.resolve(type, annotations, Collections.unmodifiableMap(clsMap)); if (qname != null) { - writeQName(sb, qname); - clsMap.put(type, qname); + if (!isCollection) { + writeQName(sb, qname); + clsMap.put(type, qname); + } else { + XMLName name = AnnotationUtils.getAnnotation(annotations, XMLName.class); + QName collectionName = null; + if (name != null) { + QName tempQName = JAXRSUtils.convertStringToQName(name.value()); + collectionName = new QName(qname.getNamespaceURI(), + tempQName.getLocalPart(), + qname.getPrefix()); + writeQName(sb, collectionName); + } + } } } @@ -932,7 +956,7 @@ public class WadlGenerator implements Re .append(qname.getLocalPart()).append("\""); } - private SchemaCollection getSchemaCollection(JAXBContext context) { + private SchemaCollection getSchemaCollection(ResourceTypes resourceTypes, JAXBContext context) { if (context == null) { return null; } @@ -942,7 +966,37 @@ public class WadlGenerator implements Re try { for (DOMResult r : JAXBUtils.generateJaxbSchemas(context, CastUtils.cast(Collections.emptyMap(), String.class, DOMResult.class))) { - DOMSource source = new DOMSource(r.getNode(), r.getSystemId()); + Document doc = (Document)r.getNode(); + if (supportCollections && !resourceTypes.getCollectionMap().isEmpty()) { + ElementQNameResolver theResolver = createElementQNameResolver(context); + String tns = doc.getDocumentElement().getAttribute("targetNamespace"); + for (Map.Entry, QName> entry : resourceTypes.getCollectionMap().entrySet()) { + if (tns.equals(entry.getValue().getNamespaceURI())) { + QName typeName = theResolver.resolve(entry.getKey(), new Annotation[]{}, + Collections., QName>emptyMap()); + if (typeName != null) { + Element newElement = doc.createElementNS(XmlSchemaConstants.XSD_NAMESPACE_URI, + "xs:element"); + newElement.setAttribute("name", entry.getValue().getLocalPart()); + Element ctElement = doc.createElementNS(XmlSchemaConstants.XSD_NAMESPACE_URI, + "xs:complexType"); + newElement.appendChild(ctElement); + Element seqElement = doc.createElementNS(XmlSchemaConstants.XSD_NAMESPACE_URI, + "xs:sequence"); + ctElement.appendChild(seqElement); + Element xsElement = doc.createElementNS(XmlSchemaConstants.XSD_NAMESPACE_URI, + "xs:element"); + seqElement.appendChild(xsElement); + xsElement.setAttribute("ref", "tns:" + typeName.getLocalPart()); + xsElement.setAttribute("minOccurs", "0"); + xsElement.setAttribute("maxOccurs", "unbounded"); + + doc.getDocumentElement().appendChild(newElement); + } + } + } + } + DOMSource source = new DOMSource(doc, r.getSystemId()); schemas.add(source); String tns = ((Document)source.getNode()).getDocumentElement().getAttribute("targetNamespace"); @@ -1284,7 +1338,8 @@ public class WadlGenerator implements Re } } - protected SchemaWriter createSchemaWriter(JAXBContext context, UriInfo ui) { + protected SchemaWriter createSchemaWriter(ResourceTypes resourceTypes, JAXBContext context, + UriInfo ui) { // if neither externalSchemaLinks nor externalSchemasCache is set // then JAXBContext will be used to generate the schema if (externalSchemaLinks != null && externalSchemasCache == null) { @@ -1292,7 +1347,7 @@ public class WadlGenerator implements Re } else if (externalSchemasCache != null) { return new StringSchemaWriter(externalSchemasCache, externalSchemaLinks, ui); } else if (context != null) { - SchemaCollection coll = getSchemaCollection(context); + SchemaCollection coll = getSchemaCollection(resourceTypes, context); if (coll != null) { return new SchemaCollectionWriter(coll); } @@ -1545,6 +1600,10 @@ public class WadlGenerator implements Re public void setIgnoreRequests(boolean ignoreRequests) { this.ignoreRequests = ignoreRequests; } + + public void setSupportCollections(boolean support) { + this.supportCollections = support; + } public void setDefaultMediaType(String mt) { this.defaultMediaType = MediaType.valueOf(mt); Modified: cxf/branches/2.6.x-fixes/rt/frontend/jaxrs/src/main/java/org/apache/cxf/jaxrs/provider/AbstractJAXBProvider.java URL: http://svn.apache.org/viewvc/cxf/branches/2.6.x-fixes/rt/frontend/jaxrs/src/main/java/org/apache/cxf/jaxrs/provider/AbstractJAXBProvider.java?rev=1354010&r1=1354009&r2=1354010&view=diff ============================================================================== --- cxf/branches/2.6.x-fixes/rt/frontend/jaxrs/src/main/java/org/apache/cxf/jaxrs/provider/AbstractJAXBProvider.java (original) +++ cxf/branches/2.6.x-fixes/rt/frontend/jaxrs/src/main/java/org/apache/cxf/jaxrs/provider/AbstractJAXBProvider.java Tue Jun 26 13:36:15 2012 @@ -161,7 +161,8 @@ public abstract class AbstractJAXBProvid public void init(List cris) { if (singleJaxbContext) { Set> allTypes = - new HashSet>(ResourceUtils.getAllRequestResponseTypes(cris, true).keySet()); + new HashSet>(ResourceUtils.getAllRequestResponseTypes(cris, true) + .getAllTypes().keySet()); JAXBContext context = ResourceUtils.createJaxbContext(allTypes, extraClass, cProperties); if (context != null) { Modified: cxf/branches/2.6.x-fixes/rt/frontend/jaxrs/src/main/java/org/apache/cxf/jaxrs/utils/ResourceUtils.java URL: http://svn.apache.org/viewvc/cxf/branches/2.6.x-fixes/rt/frontend/jaxrs/src/main/java/org/apache/cxf/jaxrs/utils/ResourceUtils.java?rev=1354010&r1=1354009&r2=1354010&view=diff ============================================================================== --- cxf/branches/2.6.x-fixes/rt/frontend/jaxrs/src/main/java/org/apache/cxf/jaxrs/utils/ResourceUtils.java (original) +++ cxf/branches/2.6.x-fixes/rt/frontend/jaxrs/src/main/java/org/apache/cxf/jaxrs/utils/ResourceUtils.java Tue Jun 26 13:36:15 2012 @@ -81,10 +81,12 @@ import org.apache.cxf.jaxrs.model.Method import org.apache.cxf.jaxrs.model.OperationResourceInfo; import org.apache.cxf.jaxrs.model.Parameter; import org.apache.cxf.jaxrs.model.ParameterType; +import org.apache.cxf.jaxrs.model.ResourceTypes; import org.apache.cxf.jaxrs.model.URITemplate; import org.apache.cxf.jaxrs.model.UserOperation; import org.apache.cxf.jaxrs.model.UserResource; import org.apache.cxf.jaxrs.model.wadl.ElementClass; +import org.apache.cxf.jaxrs.model.wadl.XMLName; import org.apache.cxf.jaxrs.provider.JAXBElementProvider; import org.apache.cxf.message.Message; import org.apache.cxf.resource.ResourceManager; @@ -467,9 +469,9 @@ public final class ResourceUtils { } - public static Map, Type> getAllRequestResponseTypes(List cris, - boolean jaxbOnly) { - Map, Type> types = new HashMap, Type>(); + public static ResourceTypes getAllRequestResponseTypes(List cris, + boolean jaxbOnly) { + ResourceTypes types = new ResourceTypes(); for (ClassResourceInfo resource : cris) { getAllTypesForResource(resource, types, jaxbOnly); } @@ -487,29 +489,33 @@ public final class ResourceUtils { return type; } - private static void getAllTypesForResource(ClassResourceInfo resource, Map, Type> types, + private static void getAllTypesForResource(ClassResourceInfo resource, + ResourceTypes types, boolean jaxbOnly) { for (OperationResourceInfo ori : resource.getMethodDispatcher().getOperationResourceInfos()) { - Class realReturnType = ori.getMethodToInvoke().getReturnType(); + Method method = ori.getMethodToInvoke(); + Class realReturnType = method.getReturnType(); Class cls = realReturnType; if (cls == Response.class) { - cls = getActualJaxbType(cls, ori.getMethodToInvoke(), false); + cls = getActualJaxbType(cls, method, false); } - Type type = ori.getMethodToInvoke().getGenericReturnType(); + Type type = method.getGenericReturnType(); if (jaxbOnly) { - checkJaxbType(cls, realReturnType == Response.class ? cls : type, types); + checkJaxbType(cls, realReturnType == Response.class ? cls : type, types, + method.getAnnotations()); } else { - types.put(cls, type); + types.getAllTypes().put(cls, type); } for (Parameter pm : ori.getParameters()) { if (pm.getType() == ParameterType.REQUEST_BODY) { - Class inType = ori.getMethodToInvoke().getParameterTypes()[pm.getIndex()]; - Type paramType = ori.getMethodToInvoke().getGenericParameterTypes()[pm.getIndex()]; + Class inType = method.getParameterTypes()[pm.getIndex()]; + Type paramType = method.getGenericParameterTypes()[pm.getIndex()]; if (jaxbOnly) { - checkJaxbType(inType, paramType, types); + checkJaxbType(inType, paramType, types, + method.getParameterAnnotations()[pm.getIndex()]); } else { - types.put(inType, paramType); + types.getAllTypes().put(inType, paramType); } } @@ -524,18 +530,28 @@ public final class ResourceUtils { } } - private static void checkJaxbType(Class type, Type genericType, Map, Type> types) { + private static void checkJaxbType(Class type, + Type genericType, + ResourceTypes types, + Annotation[] anns) { + if (InjectionUtils.isSupportedCollectionOrArray(type)) { + type = InjectionUtils.getActualType(genericType); + XMLName name = AnnotationUtils.getAnnotation(anns, XMLName.class); + if (name != null) { + types.getCollectionMap().put(type, JAXRSUtils.convertStringToQName(name.value())); + } + } JAXBElementProvider provider = new JAXBElementProvider(); if (type != null && !InjectionUtils.isPrimitive(type) && !JAXBElement.class.isAssignableFrom(type) && provider.isReadable(type, type, new Annotation[0], MediaType.APPLICATION_XML_TYPE)) { - types.put(type, type); + types.getAllTypes().put(type, type); Class genCls = InjectionUtils.getActualType(genericType); if (genCls != type && genCls instanceof Class && genCls != Object.class && !InjectionUtils.isSupportedCollectionOrArray(genCls)) { - types.put(genCls, genCls); + types.getAllTypes().put(genCls, genCls); } } } Modified: cxf/branches/2.6.x-fixes/rt/frontend/jaxrs/src/test/java/org/apache/cxf/jaxrs/model/wadl/BookStore.java URL: http://svn.apache.org/viewvc/cxf/branches/2.6.x-fixes/rt/frontend/jaxrs/src/test/java/org/apache/cxf/jaxrs/model/wadl/BookStore.java?rev=1354010&r1=1354009&r2=1354010&view=diff ============================================================================== --- cxf/branches/2.6.x-fixes/rt/frontend/jaxrs/src/test/java/org/apache/cxf/jaxrs/model/wadl/BookStore.java (original) +++ cxf/branches/2.6.x-fixes/rt/frontend/jaxrs/src/test/java/org/apache/cxf/jaxrs/model/wadl/BookStore.java Tue Jun 26 13:36:15 2012 @@ -18,6 +18,7 @@ */ package org.apache.cxf.jaxrs.model.wadl; +import java.util.Collections; import java.util.List; import javax.ws.rs.Consumes; @@ -58,6 +59,13 @@ public class BookStore { } @GET + @Produces("application/xml") + @XMLName("{http://superbooks}books") + public List getBooks() { + return Collections.emptyList(); + } + + @GET @Produces("text/plain") public String getName(@PathParam("id") Long id, @QueryParam("") QueryBean query) { return "store"; Modified: cxf/branches/2.6.x-fixes/rt/frontend/jaxrs/src/test/java/org/apache/cxf/jaxrs/model/wadl/WadlGeneratorTest.java URL: http://svn.apache.org/viewvc/cxf/branches/2.6.x-fixes/rt/frontend/jaxrs/src/test/java/org/apache/cxf/jaxrs/model/wadl/WadlGeneratorTest.java?rev=1354010&r1=1354009&r2=1354010&view=diff ============================================================================== --- cxf/branches/2.6.x-fixes/rt/frontend/jaxrs/src/test/java/org/apache/cxf/jaxrs/model/wadl/WadlGeneratorTest.java (original) +++ cxf/branches/2.6.x-fixes/rt/frontend/jaxrs/src/test/java/org/apache/cxf/jaxrs/model/wadl/WadlGeneratorTest.java Tue Jun 26 13:36:15 2012 @@ -38,6 +38,7 @@ import javax.xml.bind.annotation.XmlRoot import org.w3c.dom.Document; import org.w3c.dom.Element; +import org.apache.cxf.common.util.StringUtils; import org.apache.cxf.common.xmlschema.XmlSchemaConstants; import org.apache.cxf.helpers.DOMUtils; import org.apache.cxf.jaxrs.JAXRSServiceImpl; @@ -211,9 +212,13 @@ public class WadlGeneratorTest extends A checkResponse(r); Document doc = DOMUtils.readXml(new StringReader(r.getEntity().toString())); checkDocs(doc.getDocumentElement(), "My Application", "", ""); - checkGrammars(doc.getDocumentElement(), "thebook", "thebook2", "thechapter"); + checkGrammars(doc.getDocumentElement(), "thebook", "books", "thebook2", "thechapter"); List els = getWadlResourcesInfo(doc, "http://localhost:8080/baz", 1); - checkBookStoreInfo(els.get(0), "ns1:thebook", "ns1:thebook2", "ns1:thechapter"); + checkBookStoreInfo(els.get(0), + "ns1:thebook", + "ns1:thebook2", + "ns1:thechapter", + "ns1:books"); } @Test @@ -301,14 +306,24 @@ public class WadlGeneratorTest extends A r.getMetadata().getFirst(HttpHeaders.CONTENT_TYPE)); String wadl = r.getEntity().toString(); Document doc = DOMUtils.readXml(new StringReader(wadl)); - checkGrammars(doc.getDocumentElement(), "thebook", "thebook2", "thechapter"); + checkGrammars(doc.getDocumentElement(), "thebook", "books", "thebook2", "thechapter"); List els = getWadlResourcesInfo(doc, "http://localhost:8080/baz", 2); checkBookStoreInfo(els.get(0), "prefix1:thebook", "prefix1:thebook2", "prefix1:thechapter"); Element orderResource = els.get(1); assertEquals("/orders", orderResource.getAttribute("path")); } - private void checkGrammars(Element appElement, String bookEl, String book2El, String chapterEl) { + private void checkGrammars(Element appElement, + String bookEl, + String book2El, + String chapterEl) { + checkGrammars(appElement, bookEl, null, book2El, chapterEl); + } + private void checkGrammars(Element appElement, + String bookEl, + String booksEl, + String book2El, + String chapterEl) { List grammarEls = DOMUtils.getChildrenWithName(appElement, WadlGenerator.WADL_NS, "grammars"); assertEquals(1, grammarEls.size()); @@ -320,14 +335,21 @@ public class WadlGeneratorTest extends A XmlSchemaConstants.XSD_NAMESPACE_URI, "element"); int size = book2El == null ? 2 : 3; + int elementSize = size; + if (booksEl != null) { + elementSize++; + } - assertEquals(size, elementEls.size()); + assertEquals(elementSize, elementEls.size()); assertTrue(checkElement(elementEls, bookEl, "book")); if (book2El != null) { assertTrue(checkElement(elementEls, book2El, "book2")); } assertTrue(checkElement(elementEls, chapterEl, "chapter")); + if (booksEl != null) { + assertTrue(checkElement(elementEls, booksEl, "books")); + } List complexTypesEls = DOMUtils.getChildrenWithName(schemasEls.get(0), XmlSchemaConstants.XSD_NAMESPACE_URI, "complexType"); @@ -370,18 +392,46 @@ public class WadlGeneratorTest extends A for (Element e : els) { if (name.equals(e.getAttribute("name"))) { String type = e.getAttribute("type"); - - String expectedType1 = "tns:" + localTypeName; - String expectedType2 = "os:" + localTypeName; - if (type.equals(expectedType1) || type.equals(expectedType2)) { - return true; + if (!StringUtils.isEmpty(type)) { + String expectedType1 = "tns:" + localTypeName; + String expectedType2 = "os:" + localTypeName; + if (type.equals(expectedType1) || type.equals(expectedType2)) { + return true; + } + } else if ("books".equals(name)) { + Element ctElement = + (Element)e.getElementsByTagNameNS(XmlSchemaConstants.XSD_NAMESPACE_URI, + "complexType").item(0); + Element seqElement = + (Element)ctElement.getElementsByTagNameNS(XmlSchemaConstants.XSD_NAMESPACE_URI, + "sequence").item(0); + Element xsElement = + (Element)seqElement.getElementsByTagNameNS(XmlSchemaConstants.XSD_NAMESPACE_URI, + "element").item(0); + String ref = xsElement.getAttribute("ref"); + String expectedRef = "tns:thebook"; + String expectedRef2 = "os:thebook"; + if (ref.equals(expectedRef) || ref.equals(expectedRef2)) { + return true; + } } } } return false; } - private void checkBookStoreInfo(Element resource, String bookEl, String book2El, String chapterEl) { + private void checkBookStoreInfo(Element resource, + String bookEl, + String book2El, + String chapterEl) { + checkBookStoreInfo(resource, bookEl, book2El, chapterEl, null); + } + + private void checkBookStoreInfo(Element resource, + String bookEl, + String book2El, + String chapterEl, + String booksEl) { assertEquals("/bookstore/{id}", resource.getAttribute("path")); checkDocs(resource, "book store resource", "super resource", "en-us"); @@ -401,10 +451,10 @@ public class WadlGeneratorTest extends A // must have a single template parameter verifyParameters(resource, 1, new Param("id", "template", "xs:long")); - // must have 3 methods, GET, POST and PUT - List methodEls = getElements(resource, "method", 3); + // must have 4 methods, 2 GETs, POST and PUT + List methodEls = getElements(resource, "method", 4); - // verify GET + // verify 1st GET assertEquals("GET", methodEls.get(0).getAttribute("name")); assertEquals(0, DOMUtils.getChildrenWithName(methodEls.get(0), WadlGenerator.WADL_NS, "param").size()); @@ -424,16 +474,22 @@ public class WadlGeneratorTest extends A //check response verifyRepresentation(methodEls.get(0), "response", "text/plain", ""); + // verify 2nd GET + assertEquals("GET", methodEls.get(1).getAttribute("name")); + if (booksEl != null) { + verifyRepresentation(methodEls.get(1), "response", "application/xml", booksEl); + } + // verify POST - assertEquals("POST", methodEls.get(1).getAttribute("name")); - Element formRep = verifyRepresentation(methodEls.get(1), "request", "multipart/form-data", ""); + assertEquals("POST", methodEls.get(2).getAttribute("name")); + Element formRep = verifyRepresentation(methodEls.get(2), "request", "multipart/form-data", ""); checkDocs(formRep, "", "Attachments", ""); // verify PUT - assertEquals("PUT", methodEls.get(2).getAttribute("name")); - verifyRepresentation(methodEls.get(2), "request", "text/plain", ""); + assertEquals("PUT", methodEls.get(3).getAttribute("name")); + verifyRepresentation(methodEls.get(3), "request", "text/plain", ""); - verifyResponseWithStatus(methodEls.get(2), "204"); + verifyResponseWithStatus(methodEls.get(3), "204"); // verify resource starting with /book2 verifyGetResourceMethod(resourceEls.get(0), book2El, null); Modified: cxf/branches/2.6.x-fixes/rt/frontend/jaxrs/src/test/java/org/apache/cxf/jaxrs/provider/JAXBElementProviderTest.java URL: http://svn.apache.org/viewvc/cxf/branches/2.6.x-fixes/rt/frontend/jaxrs/src/test/java/org/apache/cxf/jaxrs/provider/JAXBElementProviderTest.java?rev=1354010&r1=1354009&r2=1354010&view=diff ============================================================================== --- cxf/branches/2.6.x-fixes/rt/frontend/jaxrs/src/test/java/org/apache/cxf/jaxrs/provider/JAXBElementProviderTest.java (original) +++ cxf/branches/2.6.x-fixes/rt/frontend/jaxrs/src/test/java/org/apache/cxf/jaxrs/provider/JAXBElementProviderTest.java Tue Jun 26 13:36:15 2012 @@ -144,6 +144,8 @@ public class JAXBElementProviderTest ext assertNotNull(bookContext); JAXBContext superBookContext = provider.getJAXBContext(SuperBook.class, SuperBook.class); assertSame(bookContext, superBookContext); + JAXBContext book2Context = provider.getJAXBContext(Book2.class, Book2.class); + assertSame(bookContext, book2Context); } @Test @@ -1466,6 +1468,12 @@ public class JAXBElementProviderTest ext public SuperBook getSuperBook() { return null; } + + @GET + public List getBook2() { + return null; + } + } @XmlRootElement(name = "list") Modified: cxf/branches/2.6.x-fixes/rt/frontend/jaxrs/src/test/java/org/apache/cxf/jaxrs/utils/ResourceUtilsTest.java URL: http://svn.apache.org/viewvc/cxf/branches/2.6.x-fixes/rt/frontend/jaxrs/src/test/java/org/apache/cxf/jaxrs/utils/ResourceUtilsTest.java?rev=1354010&r1=1354009&r2=1354010&view=diff ============================================================================== --- cxf/branches/2.6.x-fixes/rt/frontend/jaxrs/src/test/java/org/apache/cxf/jaxrs/utils/ResourceUtilsTest.java (original) +++ cxf/branches/2.6.x-fixes/rt/frontend/jaxrs/src/test/java/org/apache/cxf/jaxrs/utils/ResourceUtilsTest.java Tue Jun 26 13:36:15 2012 @@ -111,7 +111,8 @@ public class ResourceUtilsTest extends A ClassResourceInfo cri1 = ResourceUtils.createClassResourceInfo(BookInterface.class, BookInterface.class, true, true); Map, Type> types = - ResourceUtils.getAllRequestResponseTypes(Collections.singletonList(cri1), true); + ResourceUtils.getAllRequestResponseTypes(Collections.singletonList(cri1), true) + .getAllTypes(); assertEquals(2, types.size()); assertTrue(types.containsKey(Book.class)); assertTrue(types.containsKey(Chapter.class));