Return-Path: Delivered-To: apmail-cxf-commits-archive@www.apache.org Received: (qmail 758 invoked from network); 25 Feb 2009 17:55:15 -0000 Received: from hermes.apache.org (HELO mail.apache.org) (140.211.11.2) by minotaur.apache.org with SMTP; 25 Feb 2009 17:55:15 -0000 Received: (qmail 9015 invoked by uid 500); 25 Feb 2009 17:55:15 -0000 Delivered-To: apmail-cxf-commits-archive@cxf.apache.org Received: (qmail 8920 invoked by uid 500); 25 Feb 2009 17:55:15 -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 8771 invoked by uid 99); 25 Feb 2009 17:55:14 -0000 Received: from nike.apache.org (HELO nike.apache.org) (192.87.106.230) by apache.org (qpsmtpd/0.29) with ESMTP; Wed, 25 Feb 2009 09:55:14 -0800 X-ASF-Spam-Status: No, hits=-2000.0 required=10.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; Wed, 25 Feb 2009 17:55:00 +0000 Received: by eris.apache.org (Postfix, from userid 65534) id A5AB5238899B; Wed, 25 Feb 2009 17:54:38 +0000 (UTC) Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit Subject: svn commit: r747871 [1/3] - in /cxf/branches/2.1.x-fixes: api/src/main/java/org/apache/cxf/wsdl/ rt/databinding/aegis/ rt/databinding/aegis/src/main/java/org/apache/cxf/aegis/ rt/databinding/aegis/src/main/java/org/apache/cxf/aegis/databinding/ rt/data... Date: Wed, 25 Feb 2009 17:54:36 -0000 To: commits@cxf.apache.org From: dkulp@apache.org X-Mailer: svnmailer-1.0.8 Message-Id: <20090225175438.A5AB5238899B@eris.apache.org> X-Virus-Checked: Checked by ClamAV on apache.org Author: dkulp Date: Wed Feb 25 17:54:34 2009 New Revision: 747871 URL: http://svn.apache.org/viewvc?rev=747871&view=rev Log: Back out binary incompatible changes Added: cxf/branches/2.1.x-fixes/api/src/main/java/org/apache/cxf/wsdl/WSDLConstants.java (with props) Removed: cxf/branches/2.1.x-fixes/rt/databinding/aegis/src/test/java/org/apache/cxf/aegis/standalone/SchemaAddinsTest.java Modified: cxf/branches/2.1.x-fixes/rt/databinding/aegis/pom.xml cxf/branches/2.1.x-fixes/rt/databinding/aegis/src/main/java/org/apache/cxf/aegis/AegisContext.java cxf/branches/2.1.x-fixes/rt/databinding/aegis/src/main/java/org/apache/cxf/aegis/databinding/AegisDatabinding.java cxf/branches/2.1.x-fixes/rt/databinding/aegis/src/main/java/org/apache/cxf/aegis/type/AbstractTypeCreator.java cxf/branches/2.1.x-fixes/rt/databinding/aegis/src/main/java/org/apache/cxf/aegis/type/DefaultTypeMapping.java cxf/branches/2.1.x-fixes/rt/databinding/aegis/src/main/java/org/apache/cxf/aegis/type/Type.java cxf/branches/2.1.x-fixes/rt/databinding/aegis/src/main/java/org/apache/cxf/aegis/type/TypeUtil.java cxf/branches/2.1.x-fixes/rt/databinding/aegis/src/main/java/org/apache/cxf/aegis/type/XMLTypeCreator.java cxf/branches/2.1.x-fixes/rt/databinding/aegis/src/main/java/org/apache/cxf/aegis/type/basic/ArrayType.java cxf/branches/2.1.x-fixes/rt/databinding/aegis/src/main/java/org/apache/cxf/aegis/type/basic/BeanType.java cxf/branches/2.1.x-fixes/rt/databinding/aegis/src/main/java/org/apache/cxf/aegis/type/basic/BeanTypeInfo.java cxf/branches/2.1.x-fixes/rt/databinding/aegis/src/main/java/org/apache/cxf/aegis/type/basic/ObjectType.java cxf/branches/2.1.x-fixes/rt/databinding/aegis/src/main/java/org/apache/cxf/aegis/type/basic/XMLBeanTypeInfo.java cxf/branches/2.1.x-fixes/rt/databinding/aegis/src/main/java/org/apache/cxf/aegis/type/collection/MapType.java cxf/branches/2.1.x-fixes/rt/databinding/aegis/src/main/java/org/apache/cxf/aegis/type/encoded/ArrayTypeInfo.java cxf/branches/2.1.x-fixes/rt/databinding/aegis/src/main/java/org/apache/cxf/aegis/type/encoded/SoapArrayType.java cxf/branches/2.1.x-fixes/rt/databinding/aegis/src/main/java/org/apache/cxf/aegis/type/encoded/SoapRefType.java cxf/branches/2.1.x-fixes/rt/databinding/aegis/src/main/java/org/apache/cxf/aegis/type/java5/EnumType.java cxf/branches/2.1.x-fixes/rt/databinding/aegis/src/main/java/org/apache/cxf/aegis/type/mtom/AbstractXOPType.java cxf/branches/2.1.x-fixes/rt/databinding/aegis/src/main/java/org/apache/cxf/aegis/util/NamespaceHelper.java cxf/branches/2.1.x-fixes/rt/databinding/aegis/src/main/java/org/apache/cxf/aegis/util/stax/JDOMNamespaceContext.java cxf/branches/2.1.x-fixes/rt/databinding/aegis/src/main/java/org/apache/cxf/aegis/util/stax/JDOMStreamWriter.java cxf/branches/2.1.x-fixes/rt/databinding/aegis/src/main/java/org/apache/cxf/aegis/xml/jdom/JDOMWriter.java cxf/branches/2.1.x-fixes/rt/databinding/aegis/src/main/java/org/apache/cxf/aegis/xml/stax/ElementWriter.java cxf/branches/2.1.x-fixes/rt/databinding/aegis/src/test/java/org/apache/cxf/aegis/AbstractAegisTest.java cxf/branches/2.1.x-fixes/rt/databinding/aegis/src/test/java/org/apache/cxf/aegis/custom/CustomMappingTest.java cxf/branches/2.1.x-fixes/rt/databinding/aegis/src/test/java/org/apache/cxf/aegis/integration/ParameterMappingTest.java cxf/branches/2.1.x-fixes/rt/databinding/aegis/src/test/java/org/apache/cxf/aegis/integration/WrappedTest.java cxf/branches/2.1.x-fixes/rt/databinding/aegis/src/test/java/org/apache/cxf/aegis/services/ArrayService.aegis.xml cxf/branches/2.1.x-fixes/rt/databinding/aegis/src/test/java/org/apache/cxf/aegis/type/basic/BeanTest.java cxf/branches/2.1.x-fixes/rt/databinding/aegis/src/test/java/org/apache/cxf/aegis/type/basic/QualificationTest.java cxf/branches/2.1.x-fixes/rt/databinding/aegis/src/test/java/org/apache/cxf/aegis/type/encoded/AbstractEncodedTest.java cxf/branches/2.1.x-fixes/rt/databinding/aegis/src/test/java/org/apache/cxf/aegis/type/encoded/ArrayTypeInfoTest.java cxf/branches/2.1.x-fixes/rt/databinding/aegis/src/test/java/org/apache/cxf/aegis/type/encoded/SoapArrayTypeTest.java cxf/branches/2.1.x-fixes/rt/databinding/aegis/src/test/java/org/apache/cxf/aegis/type/encoded/StructTypeTest.java cxf/branches/2.1.x-fixes/rt/databinding/aegis/src/test/java/org/apache/cxf/aegis/type/java5/AnnotatedTypeTest.java cxf/branches/2.1.x-fixes/rt/databinding/aegis/src/test/java/org/apache/cxf/aegis/type/java5/EnumTypeTest.java cxf/branches/2.1.x-fixes/rt/databinding/aegis/src/test/java/org/apache/cxf/aegis/type/java5/JaxbTypeTest.java cxf/branches/2.1.x-fixes/rt/databinding/aegis/src/test/java/org/apache/cxf/aegis/type/java5/XFireTypeTest.java cxf/branches/2.1.x-fixes/rt/databinding/aegis/src/test/java/org/apache/cxf/aegis/type/streams/XMLStreamReaderMappingTest.java cxf/branches/2.1.x-fixes/rt/databinding/aegis/src/test/resources/org/apache/cxf/aegis/type/aegisOptionsTestBeans.xml cxf/branches/2.1.x-fixes/rt/databinding/xmlbeans/src/test/java/org/apache/cxf/xmlbeans/WeatherService2Test.java cxf/branches/2.1.x-fixes/rt/databinding/xmlbeans/src/test/java/org/apache/cxf/xmlbeans/XMLBeansServiceTest.java cxf/branches/2.1.x-fixes/rt/databinding/xmlbeans/src/test/java/org/apache/cxf/xmlbeans/rpc/WeatherServiceRPCLitTest.java cxf/branches/2.1.x-fixes/systests/pom.xml cxf/branches/2.1.x-fixes/systests/src/test/java/org/apache/cxf/systest/aegis/AegisClientServerTest.java Added: cxf/branches/2.1.x-fixes/api/src/main/java/org/apache/cxf/wsdl/WSDLConstants.java URL: http://svn.apache.org/viewvc/cxf/branches/2.1.x-fixes/api/src/main/java/org/apache/cxf/wsdl/WSDLConstants.java?rev=747871&view=auto ============================================================================== --- cxf/branches/2.1.x-fixes/api/src/main/java/org/apache/cxf/wsdl/WSDLConstants.java (added) +++ cxf/branches/2.1.x-fixes/api/src/main/java/org/apache/cxf/wsdl/WSDLConstants.java Wed Feb 25 17:54:34 2009 @@ -0,0 +1,146 @@ +/** + * 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.wsdl; + +import javax.xml.namespace.QName; + +public final class WSDLConstants { + + public static final String WSDL_PREFIX = "wsdl"; + public static final String NS_WSDL11 = "http://schemas.xmlsoap.org/wsdl/"; + + + public static final String NP_XMLNS = "xmlns"; + public static final String NS_XMLNS = "http://www.w3.org/2000/xmlns/"; + + // XML Schema (CR) datatypes + structures + public static final String NP_SCHEMA_XSD = "xsd"; + public static final String NS_SCHEMA_XSD = "http://www.w3.org/2001/XMLSchema"; + + public static final QName QNAME_SCHEMA = new QName(NS_SCHEMA_XSD, "schema"); + + // XML Schema instance + public static final String NP_SCHEMA_XSI = "xsi"; + public static final String NS_SCHEMA_XSI = "http://www.w3.org/2001/XMLSchema-instance"; + + public static final String A_XSI_TYPE = "type"; + public static final String A_XSI_NIL = "nil"; + + // XML Schema attribute names + public static final QName NA_XSI_TYPE = new QName(NP_SCHEMA_XSI, A_XSI_TYPE, NS_SCHEMA_XSI); + public static final QName NA_XSI_NIL = new QName(NP_SCHEMA_XSI, A_XSI_NIL, NS_SCHEMA_XSI); + + + + public static final String NS_SOAP = "http://schemas.xmlsoap.org/wsdl/soap/"; + public static final String NS_SOAP11 = NS_SOAP; + public static final String NS_SOAP12 = "http://schemas.xmlsoap.org/wsdl/soap12/"; + public static final String SOAP11_PREFIX = "soap"; + public static final String SOAP12_PREFIX = "soap12"; + + public static final String NS_SOAP11_HTTP_TRANSPORT = "http://schemas.xmlsoap.org/soap/http"; + + public static final QName QNAME_SOAP_BINDING = new QName(NS_SOAP, "binding"); + public static final QName QNAME_SOAP_OPERATION = new QName(NS_SOAP, "operation"); + public static final QName QNAME_SOAP_BODY = new QName(NS_SOAP, "body"); + public static final QName QNAME_SOAP_FAULT = new QName(NS_SOAP, "fault"); + public static final QName QNAME_SOAP_BINDING_ADDRESS = new QName(NS_SOAP, "address"); + + + public static final String NS_SOAP12_HTTP_TRANSPORT = "http://www.w3.org/2003/05/soap/bindings/HTTP/"; + + public static final QName QNAME_SOAP12_BINDING = new QName(NS_SOAP12, "binding"); + public static final QName QNAME_SOAP12_BINDING_ADDRESS = new QName(NS_SOAP12, "address"); + + + public static final String DOCUMENT = "document"; + public static final String RPC = "rpc"; + public static final String LITERAL = "literal"; + public static final String REPLACE_WITH_ACTUAL_URL = "REPLACE_WITH_ACTUAL_URL"; + + public static final String JMS_PREFIX = "jms"; + public static final String TNS_PREFIX = "tns"; + + // WSDL 1.1 definitions + public static final QName QNAME_BINDING = new QName(NS_WSDL11, "binding"); + public static final QName QNAME_DEFINITIONS = new QName(NS_WSDL11, "definitions"); + public static final QName QNAME_DOCUMENTATION = new QName(NS_WSDL11, "documentation"); + public static final QName QNAME_IMPORT = new QName(NS_WSDL11, "import"); + public static final QName QNAME_MESSAGE = new QName(NS_WSDL11, "message"); + public static final QName QNAME_PART = new QName(NS_WSDL11, "part"); + public static final QName QNAME_OPERATION = new QName(NS_WSDL11, "operation"); + public static final QName QNAME_INPUT = new QName(NS_WSDL11, "input"); + public static final QName QNAME_OUTPUT = new QName(NS_WSDL11, "output"); + + public static final QName QNAME_PORT = new QName(NS_WSDL11, "port"); + public static final QName QNAME_ADDRESS = new QName(NS_WSDL11, "address"); + public static final QName QNAME_PORT_TYPE = new QName(NS_WSDL11, "portType"); + public static final QName QNAME_FAULT = new QName(NS_WSDL11, "fault"); + public static final QName QNAME_SERVICE = new QName(NS_WSDL11, "service"); + public static final QName QNAME_TYPES = new QName(NS_WSDL11, "types"); + + // WSDL Validation + public static final String ATTR_PART_ELEMENT = "element"; + public static final String ATTR_PART_TYPE = "type"; + public static final String ATTR_TYPE = "type"; + + //For Stax2DOM getUserData(location) + public static final String NODE_LOCATION = "location"; + + public static final int DOC_WRAPPED = 1; + public static final int DOC_BARE = 2; + public static final int RPC_WRAPPED = 3; + public static final int ERORR_STYLE_USE = -1; + + public static final String NS_BINDING_XML = "http://cxf.apache.org/bindings/xformat"; + public static final QName QNAME_XMLHTTP_BINDING_ADDRESS = + new QName("http://schemas.xmlsoap.org/wsdl/http/", "address"); + + public static final String ATTR_TRANSPORT = "transport"; + public static final String ATTR_LOCATION = "location"; + public static final String ATTR_NAME = "name"; + public static final String ATTR_NAMESPACE = "namespace"; + public static final String ATTR_TNS = "targetNamespace"; + // usual prefix for the targetNamespace. + public static final String CONVENTIONAL_TNS_PREFIX = "tns"; + + public static final String WSDL11 = "1.1"; + public static final String WSDL20 = "2.0"; + + public enum WSDLVersion { + WSDL11, + WSDL20, + UNKNOWN + }; + + private WSDLConstants() { + } + + public static WSDLVersion getVersion(String version) { + if (WSDL11.equals(version)) { + return WSDLVersion.WSDL11; + } + if (WSDL20.equals(version)) { + return WSDLVersion.WSDL20; + } + return WSDLVersion.UNKNOWN; + } + +} Propchange: cxf/branches/2.1.x-fixes/api/src/main/java/org/apache/cxf/wsdl/WSDLConstants.java ------------------------------------------------------------------------------ svn:eol-style = native Propchange: cxf/branches/2.1.x-fixes/api/src/main/java/org/apache/cxf/wsdl/WSDLConstants.java ------------------------------------------------------------------------------ svn:keywords = Rev Date Modified: cxf/branches/2.1.x-fixes/rt/databinding/aegis/pom.xml URL: http://svn.apache.org/viewvc/cxf/branches/2.1.x-fixes/rt/databinding/aegis/pom.xml?rev=747871&r1=747870&r2=747871&view=diff ============================================================================== --- cxf/branches/2.1.x-fixes/rt/databinding/aegis/pom.xml (original) +++ cxf/branches/2.1.x-fixes/rt/databinding/aegis/pom.xml Wed Feb 25 17:54:34 2009 @@ -82,9 +82,13 @@ jdom jdom ${jdom.version} - provided + jaxen + jaxen + + + junit junit test Modified: cxf/branches/2.1.x-fixes/rt/databinding/aegis/src/main/java/org/apache/cxf/aegis/AegisContext.java URL: http://svn.apache.org/viewvc/cxf/branches/2.1.x-fixes/rt/databinding/aegis/src/main/java/org/apache/cxf/aegis/AegisContext.java?rev=747871&r1=747870&r2=747871&view=diff ============================================================================== --- cxf/branches/2.1.x-fixes/rt/databinding/aegis/src/main/java/org/apache/cxf/aegis/AegisContext.java (original) +++ cxf/branches/2.1.x-fixes/rt/databinding/aegis/src/main/java/org/apache/cxf/aegis/AegisContext.java Wed Feb 25 17:54:34 2009 @@ -46,10 +46,11 @@ import org.apache.cxf.aegis.type.java5.Java5TypeCreator; import org.apache.cxf.common.classloader.ClassLoaderUtils; import org.apache.cxf.common.util.SOAPConstants; -import org.apache.cxf.common.xmlschema.XmlSchemaUtils; -import org.apache.cxf.helpers.XMLUtils; -import org.apache.ws.commons.schema.XmlSchema; -import org.apache.ws.commons.schema.XmlSchemaCollection; +import org.apache.cxf.helpers.DOMUtils; +import org.jaxen.JaxenException; +import org.jaxen.jdom.JDOMXPath; +import org.jdom.Element; +import org.jdom.Namespace; /** * The Aegis Databinding context object. This object coordinates the data binding process: reading and writing @@ -73,11 +74,19 @@ public class AegisContext { /** - * Namespace used for the miscellaneous Aegis type schema. + * Namespace used for miscellaneous Aegis types. */ - public static final String UTILITY_TYPES_SCHEMA_NS = "http://cxf.apache.org/aegisTypes"; - private Document aegisTypesSchemaDocument; - private Document xmimeSchemaDocument; + public static final String SCHEMA_NS = "http://cxf.apache.org/aegisTypes"; + private static JDOMXPath importTypesXpath; + + static { + try { + importTypesXpath = new JDOMXPath("xsd:import[@namespace='" + SCHEMA_NS + "']"); + importTypesXpath.addNamespace(SOAPConstants.XSD_PREFIX, SOAPConstants.XSD); + } catch (JaxenException e) { + throw new RuntimeException(e); + } + } private boolean writeXsiTypes; private boolean readXsiTypes = true; @@ -92,9 +101,9 @@ private TypeCreationOptions configuration; private boolean mtomEnabled; private boolean mtomUseXmime; - private boolean enableJDOMMappings; // this URI goes into the type map. private String mappingNamespaceURI; + private Document typesSchemaDocument; /** * Construct a context. @@ -141,9 +150,7 @@ } if (typeMapping == null) { boolean defaultNillable = configuration.isDefaultNillable(); - TypeMapping baseTM = DefaultTypeMapping.createDefaultTypeMapping(defaultNillable, - mtomUseXmime, - enableJDOMMappings); + TypeMapping baseTM = DefaultTypeMapping.createDefaultTypeMapping(defaultNillable, mtomUseXmime); // The use of the XSD URI in the mapping is, MAGIC. if (mappingNamespaceURI == null) { mappingNamespaceURI = SOAPConstants.XSD; @@ -241,47 +248,43 @@ } } - public static boolean schemaImportsUtilityTypes(XmlSchema schema) { - return XmlSchemaUtils.schemaImportsNamespace(schema, UTILITY_TYPES_SCHEMA_NS); - } - - private Document getSchemaDocument(String resourcePath) { + public static boolean schemaImportsUtilityTypes(Element schemaElement) { try { - return XMLUtils.parse(getClass().getResourceAsStream(resourcePath)); - } catch (ParserConfigurationException e) { + return importTypesXpath.selectSingleNode(schemaElement) != null; + } catch (JaxenException e) { throw new RuntimeException(e); + } + } + + public Document getTypesSchemaDocument() { + ensureTypesSchemaDocument(); + return typesSchemaDocument; + } + + private void ensureTypesSchemaDocument() { + if (typesSchemaDocument != null) { + return; + } + try { + typesSchemaDocument = DOMUtils.readXml(getClass() + .getResourceAsStream("/META-INF/cxf/aegisTypes.xsd")); } catch (SAXException e) { throw new RuntimeException(e); } catch (IOException e) { throw new RuntimeException(e); + } catch (ParserConfigurationException e) { + throw new RuntimeException(e); } } - - // could we make these documents static? What would we synchronize on? - private Document getAegisTypesSchemaDocument() { - if (aegisTypesSchemaDocument == null) { - aegisTypesSchemaDocument = getSchemaDocument("/META-INF/cxf/aegisTypes.xsd"); - } - return aegisTypesSchemaDocument; - } - - private Document getXmimeSchemaDocument() { - if (xmimeSchemaDocument == null) { - xmimeSchemaDocument = getSchemaDocument("/schemas/wsdl/xmime.xsd"); - } - return xmimeSchemaDocument; - } - - public XmlSchema addTypesSchemaDocument(XmlSchemaCollection collection) { - return collection.read(getAegisTypesSchemaDocument(), null); - } - - public XmlSchema addXmimeSchemaDocument(XmlSchemaCollection collection) { - return collection.read(getXmimeSchemaDocument(), null); - } - public static void addUtilityTypesToSchema(XmlSchema root) { - XmlSchemaUtils.addImportIfNeeded(root, UTILITY_TYPES_SCHEMA_NS); + public static void addUtilityTypesToSchema(Element root) { + if (schemaImportsUtilityTypes(root)) { + return; + } + Element element = new Element("import", SOAPConstants.XSD_PREFIX, SOAPConstants.XSD); + root.addContent(0, element); + element.setAttribute("namespace", SCHEMA_NS); + root.addNamespaceDeclaration(Namespace.getNamespace("aegisTypes", SCHEMA_NS)); } /** @@ -464,16 +467,4 @@ public void setMappingNamespaceURI(String mappingNamespaceURI) { this.mappingNamespaceURI = mappingNamespaceURI; } - - public boolean isEnableJDOMMappings() { - return enableJDOMMappings; - } - - /** - * Whether to enable JDOM as a mapping for xsd:anyType if JDOM is in the classpath. - * @param enableJDOMMappings - */ - public void setEnableJDOMMappings(boolean enableJDOMMappings) { - this.enableJDOMMappings = enableJDOMMappings; - } } Modified: cxf/branches/2.1.x-fixes/rt/databinding/aegis/src/main/java/org/apache/cxf/aegis/databinding/AegisDatabinding.java URL: http://svn.apache.org/viewvc/cxf/branches/2.1.x-fixes/rt/databinding/aegis/src/main/java/org/apache/cxf/aegis/databinding/AegisDatabinding.java?rev=747871&r1=747870&r2=747871&view=diff ============================================================================== --- cxf/branches/2.1.x-fixes/rt/databinding/aegis/src/main/java/org/apache/cxf/aegis/databinding/AegisDatabinding.java (original) +++ cxf/branches/2.1.x-fixes/rt/databinding/aegis/src/main/java/org/apache/cxf/aegis/databinding/AegisDatabinding.java Wed Feb 25 17:54:34 2009 @@ -18,6 +18,7 @@ */ package org.apache.cxf.aegis.databinding; +import java.io.IOException; import java.lang.reflect.Method; import java.util.Collection; import java.util.HashMap; @@ -28,43 +29,53 @@ import java.util.logging.Logger; import javax.xml.namespace.QName; +import javax.xml.parsers.ParserConfigurationException; import javax.xml.stream.XMLStreamReader; import javax.xml.stream.XMLStreamWriter; import org.w3c.dom.Node; +import org.xml.sax.SAXException; + import org.apache.cxf.aegis.AegisContext; import org.apache.cxf.aegis.DatabindingException; -import org.apache.cxf.aegis.type.AbstractTypeCreator; +import org.apache.cxf.aegis.type.AbstractTypeCreator.TypeClassInfo; import org.apache.cxf.aegis.type.Type; import org.apache.cxf.aegis.type.TypeCreationOptions; import org.apache.cxf.aegis.type.TypeCreator; import org.apache.cxf.aegis.type.TypeMapping; import org.apache.cxf.aegis.type.mtom.AbstractXOPType; -import org.apache.cxf.common.WSDLConstants; import org.apache.cxf.common.classloader.ClassLoaderUtils; import org.apache.cxf.common.i18n.Message; import org.apache.cxf.common.logging.LogUtils; +import org.apache.cxf.common.util.SOAPConstants; import org.apache.cxf.common.xmlschema.SchemaCollection; -import org.apache.cxf.common.xmlschema.XmlSchemaConstants; -import org.apache.cxf.common.xmlschema.XmlSchemaUtils; import org.apache.cxf.databinding.AbstractDataBinding; import org.apache.cxf.databinding.DataReader; import org.apache.cxf.databinding.DataWriter; import org.apache.cxf.frontend.MethodDispatcher; import org.apache.cxf.frontend.SimpleMethodDispatcher; import org.apache.cxf.helpers.CastUtils; +import org.apache.cxf.helpers.DOMUtils; import org.apache.cxf.service.Service; +import org.apache.cxf.service.factory.ServiceConstructionException; import org.apache.cxf.service.model.AbstractMessageContainer; import org.apache.cxf.service.model.FaultInfo; import org.apache.cxf.service.model.MessagePartInfo; import org.apache.cxf.service.model.OperationInfo; -import org.apache.cxf.service.model.SchemaInfo; import org.apache.cxf.service.model.ServiceInfo; +import org.apache.cxf.wsdl.WSDLConstants; import org.apache.ws.commons.schema.XmlSchema; import org.apache.ws.commons.schema.XmlSchemaAnnotated; -import org.apache.ws.commons.schema.XmlSchemaForm; import org.apache.ws.commons.schema.utils.NamespaceMap; +import org.jaxen.JaxenException; +import org.jaxen.jdom.JDOMXPath; +import org.jdom.Attribute; +import org.jdom.Document; +import org.jdom.Element; +import org.jdom.JDOMException; +import org.jdom.Namespace; +import org.jdom.output.DOMOutputter; /** * CXF databinding object for Aegis. By default, this creates an AegisContext object. To customize @@ -99,6 +110,7 @@ protected static final int FAULT_PARAM = 2; private static final Logger LOG = LogUtils.getL7dLogger(AegisDatabinding.class); + private static org.w3c.dom.Document xmimeSchemaDocument; private AegisContext aegisContext; private Map part2Type; @@ -108,10 +120,36 @@ private TypeCreationOptions configuration; private boolean mtomEnabled; private boolean mtomUseXmime; + private JDOMXPath importXmimeXpath; public AegisDatabinding() { super(); part2Type = new HashMap(); + // we have this also in AbstractXOPType. There has to be a better way. + importXmimeXpath = AbstractXOPType.getXmimeXpathImport(); + } + + private boolean schemaImportsXmime(Element schemaElement) { + try { + return importXmimeXpath.selectSingleNode(schemaElement) != null; + } catch (JaxenException e) { + throw new RuntimeException(e); + } + } + + private void ensureXmimeSchemaDocument() { + if (xmimeSchemaDocument != null) { + return; + } + try { + xmimeSchemaDocument = DOMUtils.readXml(getClass().getResourceAsStream("/schemas/wsdl/xmime.xsd")); + } catch (SAXException e) { + throw new RuntimeException(e); + } catch (IOException e) { + throw new RuntimeException(e); + } catch (ParserConfigurationException e) { + throw new RuntimeException(e); + } } /** @@ -421,90 +459,106 @@ } Map namespaceMap = getDeclaredNamespaceMappings(); + boolean needXmimeSchema = false; + // utility types. + boolean needTypesSchema = false; - for (ServiceInfo si : s.getServiceInfos()) { - // these two must be recalculated per-service-info! - boolean needXmimeSchema = false; - boolean needTypesSchema = false; - - for (Map.Entry> entry : tns2Type.entrySet()) { - - String schemaNamespaceUri = entry.getKey(); - - if (XmlSchemaConstants.XSD_NAMESPACE_URI.equals(schemaNamespaceUri)) { - continue; - } - - if (AegisContext.UTILITY_TYPES_SCHEMA_NS.equals(schemaNamespaceUri)) { - continue; // we handle this separately. - } - - if (AbstractXOPType.XML_MIME_NS.equals(schemaNamespaceUri)) { - continue; // similiarly. - } - - SchemaInfo schemaInfo = si.addNewSchema(entry.getKey()); - XmlSchema schema = schemaInfo.getSchema(); - NamespaceMap xmlsNamespaceMap = new NamespaceMap(); - - // user-requested prefix mappings. - if (namespaceMap != null) { - for (Map.Entry e : namespaceMap.entrySet()) { - xmlsNamespaceMap.add(e.getValue(), e.getKey()); - } - } - - // tns: is conventional, and besides we have unit tests that are hardcoded to it. - if (!xmlsNamespaceMap.containsKey(WSDLConstants.CONVENTIONAL_TNS_PREFIX) - // if some wants something other than TNS, they get it. - && !xmlsNamespaceMap.containsValue(entry.getKey())) { - xmlsNamespaceMap.add(WSDLConstants.CONVENTIONAL_TNS_PREFIX, entry.getKey()); - } - - // ditto for xsd: instead of just namespace= for the schema schema. - if (!xmlsNamespaceMap.containsKey("xsd") - && !xmlsNamespaceMap.containsValue(XmlSchemaConstants.XSD_NAMESPACE_URI)) { - xmlsNamespaceMap.add("xsd", XmlSchemaConstants.XSD_NAMESPACE_URI); - } - - schema.setNamespaceContext(xmlsNamespaceMap); - schema.setTargetNamespace(entry.getKey()); - schema.setElementFormDefault(new XmlSchemaForm(XmlSchemaForm.QUALIFIED)); - schema.setAttributeFormDefault(new XmlSchemaForm(XmlSchemaForm.QUALIFIED)); + for (Map.Entry> entry : tns2Type.entrySet()) { + String xsdPrefix = SOAPConstants.XSD_PREFIX; + if (namespaceMap != null && namespaceMap.containsKey(SOAPConstants.XSD)) { + xsdPrefix = namespaceMap.get(SOAPConstants.XSD); + } + + Element e = new Element("schema", xsdPrefix, SOAPConstants.XSD); - for (Type t : entry.getValue()) { - t.writeSchema(schema); + e.setAttribute(new Attribute(WSDLConstants.ATTR_TNS, entry.getKey())); + + if (null != namespaceMap) { // did application hand us some + // additional namespaces? + for (Map.Entry mapping : namespaceMap.entrySet()) { + // user gives us namespace->prefix mapping. + e.addNamespaceDeclaration(Namespace.getNamespace(mapping.getValue(), mapping.getKey())); } + } + + // if the user didn't pick something else, assign 'tns' as the + // prefix. + if (namespaceMap == null || !namespaceMap.containsKey(entry.getKey())) { + // Schemas are more readable if there is a specific prefix for + // the TNS. + e.addNamespaceDeclaration(Namespace.getNamespace(WSDLConstants.CONVENTIONAL_TNS_PREFIX, entry + .getKey())); + } + e.setAttribute(new Attribute("elementFormDefault", "qualified")); + e.setAttribute(new Attribute("attributeFormDefault", "qualified")); - if (schemaImportsXmime(schema)) { - needXmimeSchema = true; + for (Type t : entry.getValue()) { + t.writeSchema(e); + } + + if (e.getChildren().size() == 0) { + continue; + } + + if (schemaImportsXmime(e)) { + needXmimeSchema = true; + } + if (AegisContext.schemaImportsUtilityTypes(e)) { + needTypesSchema = true; + } + + try { + NamespaceMap nsMap = new NamespaceMap(); + + nsMap.add(xsdPrefix, SOAPConstants.XSD); + + // We prefer explicit prefixes over those generated in the + // types. + // This loop may have intended to support prefixes from + // individual aegis files, + // but that isn't a good idea. + for (Iterator itr = e.getAdditionalNamespaces().iterator(); itr.hasNext();) { + Namespace n = (Namespace)itr.next(); + if (!nsMap.containsValue(n.getURI())) { + nsMap.add(n.getPrefix(), n.getURI()); + } } - - if (AegisContext.schemaImportsUtilityTypes(schema)) { - needTypesSchema = true; + + org.w3c.dom.Document schema = new DOMOutputter().output(new Document(e)); + + for (ServiceInfo si : s.getServiceInfos()) { + SchemaCollection col = si.getXmlSchemaCollection(); + col.setNamespaceContext(nsMap); + XmlSchema xmlSchema = addSchemaDocument(si, col, schema, entry.getKey()); + // Work around bug in JDOM DOMOutputter which fails to + // correctly + // assign namespaces to attributes. If JDOM worked right, + // the collection object would get the prefixes for itself. + xmlSchema.setNamespaceContext(nsMap); } + } catch (JDOMException e1) { + throw new ServiceConstructionException(e1); } - if (needXmimeSchema) { - XmlSchema schema = - aegisContext.addXmimeSchemaDocument(si.getXmlSchemaCollection().getXmlSchemaCollection()); - SchemaInfo schemaInfo = new SchemaInfo(schema.getTargetNamespace()); - schemaInfo.setSchema(schema); - si.addSchema(schemaInfo); + } + + if (needXmimeSchema) { + ensureXmimeSchemaDocument(); + for (ServiceInfo si : s.getServiceInfos()) { + SchemaCollection col = si.getXmlSchemaCollection(); + // invented systemId. + addSchemaDocument(si, col, xmimeSchemaDocument, AbstractXOPType.XML_MIME_NS); } - - if (needTypesSchema) { - XmlSchema schema = - aegisContext.addTypesSchemaDocument(si.getXmlSchemaCollection().getXmlSchemaCollection()); - SchemaInfo schemaInfo = new SchemaInfo(schema.getTargetNamespace()); - schemaInfo.setSchema(schema); - si.addSchema(schemaInfo); + } + + if (needTypesSchema) { + org.w3c.dom.Document schema = aegisContext.getTypesSchemaDocument(); + for (ServiceInfo si : s.getServiceInfos()) { + SchemaCollection col = si.getXmlSchemaCollection(); + addSchemaDocument(si, col, schema, AegisContext.SCHEMA_NS); } } - } - - private boolean schemaImportsXmime(XmlSchema schema) { - return XmlSchemaUtils.schemaImportsNamespace(schema, AbstractXOPType.XML_MIME_NS); + } public QName getSuggestedName(Service s, TypeMapping tm, OperationInfo op, int param) { @@ -546,7 +600,7 @@ OperationInfo op = param.getMessageInfo().getOperation(); Method m = getMethod(s, op); - AbstractTypeCreator.TypeClassInfo info; + TypeClassInfo info; if (paramtype != FAULT_PARAM && m != null) { info = typeCreator.createClassInfo(m, param.getIndex() - offset); } else { Modified: cxf/branches/2.1.x-fixes/rt/databinding/aegis/src/main/java/org/apache/cxf/aegis/type/AbstractTypeCreator.java URL: http://svn.apache.org/viewvc/cxf/branches/2.1.x-fixes/rt/databinding/aegis/src/main/java/org/apache/cxf/aegis/type/AbstractTypeCreator.java?rev=747871&r1=747870&r2=747871&view=diff ============================================================================== --- cxf/branches/2.1.x-fixes/rt/databinding/aegis/src/main/java/org/apache/cxf/aegis/type/AbstractTypeCreator.java (original) +++ cxf/branches/2.1.x-fixes/rt/databinding/aegis/src/main/java/org/apache/cxf/aegis/type/AbstractTypeCreator.java Wed Feb 25 17:54:34 2009 @@ -34,15 +34,13 @@ import org.apache.cxf.aegis.type.collection.MapType; import org.apache.cxf.aegis.util.NamespaceHelper; import org.apache.cxf.aegis.util.ServiceUtils; -import org.apache.cxf.common.WSDLConstants; import org.apache.cxf.common.util.XMLSchemaQNames; +import org.apache.cxf.wsdl.WSDLConstants; /** * @author Hani Suleiman Date: Jun 14, 2005 Time: 11:59:57 PM */ public abstract class AbstractTypeCreator implements TypeCreator { - public static final String HTTP_CXF_APACHE_ORG_ARRAYS = "http://cxf.apache.org/arrays"; - protected TypeMapping tm; protected AbstractTypeCreator nextCreator; @@ -310,7 +308,7 @@ ns = tm.getMappingIdentifierURI(); } if (WSDLConstants.NS_SCHEMA_XSD.equals(ns)) { - ns = HTTP_CXF_APACHE_ORG_ARRAYS; + ns = "http://cxf.apache.org/arrays"; } String first = type.getSchemaType().getLocalPart().substring(0, 1); @@ -318,13 +316,13 @@ String localName = "ArrayOf" + first.toUpperCase() + last; if (info.nonDefaultAttributes()) { localName += "-"; - if (info.getMinOccurs() >= 0) { - localName += info.minOccurs; - } - localName += "-"; if (info.getMaxOccurs() >= 0) { localName += info.maxOccurs; } + localName += "-"; + if (info.getMinOccurs() >= 0) { + localName += info.minOccurs; + } if (info.isFlat()) { localName += "Flat"; } Modified: cxf/branches/2.1.x-fixes/rt/databinding/aegis/src/main/java/org/apache/cxf/aegis/type/DefaultTypeMapping.java URL: http://svn.apache.org/viewvc/cxf/branches/2.1.x-fixes/rt/databinding/aegis/src/main/java/org/apache/cxf/aegis/type/DefaultTypeMapping.java?rev=747871&r1=747870&r2=747871&view=diff ============================================================================== --- cxf/branches/2.1.x-fixes/rt/databinding/aegis/src/main/java/org/apache/cxf/aegis/type/DefaultTypeMapping.java (original) +++ cxf/branches/2.1.x-fixes/rt/databinding/aegis/src/main/java/org/apache/cxf/aegis/type/DefaultTypeMapping.java Wed Feb 25 17:54:34 2009 @@ -68,9 +68,9 @@ import org.apache.cxf.aegis.type.xml.SourceType; import org.apache.cxf.aegis.type.xml.XMLStreamReaderType; import org.apache.cxf.binding.soap.Soap11; -import org.apache.cxf.common.classloader.ClassLoaderUtils; import org.apache.cxf.common.util.SOAPConstants; import org.apache.cxf.common.util.XMLSchemaQNames; +import org.jdom.Element; /** * Contains type mappings for java/qname pairs. @@ -224,7 +224,7 @@ } private static void fillStandardMappings(TypeMapping tm, boolean defaultNillable, - boolean enableMtomXmime, boolean enableJDOM) { + boolean enableMtomXmime) { defaultRegister(tm, defaultNillable, BigDecimal.class, XMLSchemaQNames.XSD_DECIMAL, new BigDecimalType()); defaultRegister(tm, defaultNillable, BigInteger.class, XMLSchemaQNames.XSD_INTEGER, @@ -234,6 +234,9 @@ defaultRegister(tm, defaultNillable, Calendar.class, XMLSchemaQNames.XSD_DATETIME, new CalendarType()); defaultRegister(tm, defaultNillable, Date.class, XMLSchemaQNames.XSD_DATETIME, new DateTimeType()); + defaultRegister(tm, defaultNillable, Document.class, XMLSchemaQNames.XSD_ANY, new DocumentType()); + defaultRegister(tm, defaultNillable, Element.class, XMLSchemaQNames.XSD_ANY, + new JDOMElementType()); defaultRegister(tm, defaultNillable, Float.class, XMLSchemaQNames.XSD_FLOAT, new FloatType()); defaultRegister(tm, defaultNillable, Double.class, XMLSchemaQNames.XSD_DOUBLE, new DoubleType()); defaultRegister(tm, defaultNillable, Integer.class, XMLSchemaQNames.XSD_INT, new IntType()); @@ -262,6 +265,8 @@ defaultRegister(tm, defaultNillable, java.sql.Date.class, XMLSchemaQNames.XSD_DATETIME, new SqlDateType()); + defaultRegister(tm, defaultNillable, org.jdom.Document.class, XMLSchemaQNames.XSD_ANY, + new JDOMDocumentType()); QName mtomBase64 = XMLSchemaQNames.XSD_BASE64; if (enableMtomXmime) { @@ -272,56 +277,13 @@ new DataSourceType(enableMtomXmime, null)); defaultRegister(tm, defaultNillable, DataHandler.class, mtomBase64, new DataHandlerType(enableMtomXmime, null)); - - - defaultRegister(tm, defaultNillable, Document.class, XMLSchemaQNames.XSD_ANY, new DocumentType()); - if (enableJDOM) { - registerJDOMTypes(tm, defaultNillable); - } - - } - - private static void registerJDOMTypes(TypeMapping tm, boolean defaultNillable) { - try { - Class jdomDocClass = ClassLoaderUtils.loadClass("org.jdom.Document", DefaultTypeMapping.class); - defaultRegister(tm, defaultNillable, jdomDocClass, XMLSchemaQNames.XSD_ANY, - new JDOMDocumentType()); - - } catch (ClassNotFoundException e) { - // not available. - } - - try { - Class jdomElementClass = - ClassLoaderUtils.loadClass("org.jdom.Element", DefaultTypeMapping.class); - defaultRegister(tm, defaultNillable, jdomElementClass, XMLSchemaQNames.XSD_ANY, - new JDOMElementType()); - } catch (ClassNotFoundException e) { - // not available. - } - } - - public static DefaultTypeMapping createSoap11TypeMapping(boolean defaultNillable, - boolean enableMtomXmime) { - return createSoap11TypeMapping( - defaultNillable, - enableMtomXmime, - false); } - /** - * Create a type mapping object with a stock set of mappings, including the SOAP 1.1 'encoded' - * types. - * @param defaultNillable whether elements are nillable by default. - * @param enableMtomXmime whether to enable XMIME annotations with MTOM. - * @param enableJDOM whether to add mappings for JDOM. - * @return - */ public static DefaultTypeMapping createSoap11TypeMapping(boolean defaultNillable, - boolean enableMtomXmime, boolean enableJDOM) { + boolean enableMtomXmime) { // Create a Type Mapping for SOAP 1.1 Encoding DefaultTypeMapping soapTM = new DefaultTypeMapping(Soap11.SOAP_ENCODING_URI); - fillStandardMappings(soapTM, defaultNillable, enableMtomXmime, enableJDOM); + fillStandardMappings(soapTM, defaultNillable, enableMtomXmime); defaultRegister(soapTM, defaultNillable, boolean.class, Soap11.ENCODED_BOOLEAN, new BooleanType()); defaultRegister(soapTM, defaultNillable, char.class, Soap11.ENCODED_CHAR, new CharacterType()); @@ -353,26 +315,10 @@ } public static DefaultTypeMapping createDefaultTypeMapping(boolean defaultNillable, - boolean enableMtomXmime) { - return createDefaultTypeMapping( - defaultNillable, - enableMtomXmime, - false); - } - - /** - * Create a set of default type mappings. - * @param defaultNillable whether elements are nillable by default. - * @param enableMtomXmime whether to enable XMIME annotations on MTOM. - * @param enableJDOM whether to map JDOM types. - * @return - */ - public static DefaultTypeMapping createDefaultTypeMapping(boolean defaultNillable, - boolean enableMtomXmime, - boolean enableJDOM) { + boolean enableMtomXmime) { // by convention, the default mapping is against the XML schema URI. DefaultTypeMapping tm = new DefaultTypeMapping(SOAPConstants.XSD); - fillStandardMappings(tm, defaultNillable, enableMtomXmime, enableJDOM); + fillStandardMappings(tm, defaultNillable, enableMtomXmime); defaultRegister(tm, defaultNillable, Character.class, CharacterAsStringType.CHARACTER_AS_STRING_TYPE_QNAME, new CharacterAsStringType()); Modified: cxf/branches/2.1.x-fixes/rt/databinding/aegis/src/main/java/org/apache/cxf/aegis/type/Type.java URL: http://svn.apache.org/viewvc/cxf/branches/2.1.x-fixes/rt/databinding/aegis/src/main/java/org/apache/cxf/aegis/type/Type.java?rev=747871&r1=747870&r2=747871&view=diff ============================================================================== --- cxf/branches/2.1.x-fixes/rt/databinding/aegis/src/main/java/org/apache/cxf/aegis/type/Type.java (original) +++ cxf/branches/2.1.x-fixes/rt/databinding/aegis/src/main/java/org/apache/cxf/aegis/type/Type.java Wed Feb 25 17:54:34 2009 @@ -26,8 +26,7 @@ import org.apache.cxf.aegis.DatabindingException; import org.apache.cxf.aegis.xml.MessageReader; import org.apache.cxf.aegis.xml.MessageWriter; -import org.apache.ws.commons.schema.XmlSchema; -import org.apache.ws.commons.schema.XmlSchemaElement; +import org.jdom.Element; /** * A Type reads and writes XML fragments to create and write objects. @@ -77,7 +76,7 @@ * type object adds it to the schema. * @param root root of the XSD document. */ - public void writeSchema(XmlSchema root) { + public void writeSchema(Element root) { } /** @@ -85,7 +84,7 @@ * xsd:element element, it can implement this. * @param schemaElement */ - public void addToSchemaElement(XmlSchemaElement schemaElement) { + public void addToSchemaElement(Element schemaElement) { } /** Modified: cxf/branches/2.1.x-fixes/rt/databinding/aegis/src/main/java/org/apache/cxf/aegis/type/TypeUtil.java URL: http://svn.apache.org/viewvc/cxf/branches/2.1.x-fixes/rt/databinding/aegis/src/main/java/org/apache/cxf/aegis/type/TypeUtil.java?rev=747871&r1=747870&r2=747871&view=diff ============================================================================== --- cxf/branches/2.1.x-fixes/rt/databinding/aegis/src/main/java/org/apache/cxf/aegis/type/TypeUtil.java (original) +++ cxf/branches/2.1.x-fixes/rt/databinding/aegis/src/main/java/org/apache/cxf/aegis/type/TypeUtil.java Wed Feb 25 17:54:34 2009 @@ -18,6 +18,8 @@ */ package org.apache.cxf.aegis.type; +import java.util.List; + import javax.xml.namespace.QName; import javax.xml.stream.XMLStreamReader; import org.apache.commons.logging.Log; @@ -25,9 +27,10 @@ import org.apache.cxf.aegis.AegisContext; import org.apache.cxf.aegis.util.NamespaceHelper; import org.apache.cxf.common.util.SOAPConstants; -import org.apache.cxf.common.xmlschema.XmlSchemaUtils; -import org.apache.ws.commons.schema.XmlSchema; - +import org.apache.cxf.helpers.CastUtils; +import org.jdom.Attribute; +import org.jdom.Element; +import org.jdom.Namespace; /** * Static methods/constants for Aegis. @@ -156,9 +159,26 @@ return type; } - - public static void setAttributeAttributes(QName name, Type type, XmlSchema root) { + public static Attribute createTypeAttribute(String prefix, Type type, Element root) { String ns = type.getSchemaType().getNamespaceURI(); - XmlSchemaUtils.addImportIfNeeded(root, ns); + if (!ns.equals(root.getAttributeValue("targetNamespace")) + && !ns.equals(SOAPConstants.XSD)) { + //find import statement + List l = CastUtils.cast(root.getChildren("import", + Namespace.getNamespace(SOAPConstants.XSD))); + boolean found = false; + for (Element e : l) { + if (ns.equals(e.getAttributeValue("namespace"))) { + found = true; + } + } + if (!found) { + Element element = new Element("import", SOAPConstants.XSD_PREFIX, SOAPConstants.XSD); + root.addContent(0, element); + element.setAttribute("namespace", ns); + } + } + return new Attribute("type", prefix + ':' + type.getSchemaType().getLocalPart()); } + } Modified: cxf/branches/2.1.x-fixes/rt/databinding/aegis/src/main/java/org/apache/cxf/aegis/type/XMLTypeCreator.java URL: http://svn.apache.org/viewvc/cxf/branches/2.1.x-fixes/rt/databinding/aegis/src/main/java/org/apache/cxf/aegis/type/XMLTypeCreator.java?rev=747871&r1=747870&r2=747871&view=diff ============================================================================== --- cxf/branches/2.1.x-fixes/rt/databinding/aegis/src/main/java/org/apache/cxf/aegis/type/XMLTypeCreator.java (original) +++ cxf/branches/2.1.x-fixes/rt/databinding/aegis/src/main/java/org/apache/cxf/aegis/type/XMLTypeCreator.java Wed Feb 25 17:54:34 2009 @@ -38,12 +38,6 @@ import javax.xml.transform.stream.StreamSource; import javax.xml.validation.Schema; import javax.xml.validation.SchemaFactory; -import javax.xml.xpath.XPathConstants; - -import org.w3c.dom.Document; -import org.w3c.dom.Element; -import org.w3c.dom.Node; -import org.w3c.dom.NodeList; import org.xml.sax.ErrorHandler; import org.xml.sax.SAXException; @@ -56,8 +50,12 @@ import org.apache.cxf.aegis.type.basic.XMLBeanTypeInfo; import org.apache.cxf.aegis.util.NamespaceHelper; import org.apache.cxf.common.classloader.ClassLoaderUtils; -import org.apache.cxf.helpers.DOMUtils; -import org.apache.cxf.helpers.XPathUtils; +import org.jdom.Document; +import org.jdom.Element; +import org.jdom.JDOMException; +import org.jdom.Namespace; +import org.jdom.input.DOMBuilder; +import org.jdom.xpath.XPath; /** * Deduce mapping information from an xml file. The xml file should be in the @@ -115,7 +113,7 @@ if (is != null) { try { aegisDocumentBuilderFactory = DocumentBuilderFactory.newInstance(); - aegisDocumentBuilderFactory.setNamespaceAware(true); + SchemaFactory schemaFactory = SchemaFactory.newInstance(XMLConstants.W3C_XML_SCHEMA_NS_URI); aegisSchema = schemaFactory.newSchema(new StreamSource(is)); @@ -134,8 +132,6 @@ } } } - - private XPathUtils xpathUtils = new XPathUtils(); private Document readAegisFile(InputStream is, final String path) throws IOException { DocumentBuilder documentBuilder; @@ -188,7 +184,7 @@ // above. return null; } - return doc; + return new DOMBuilder().build(doc); } protected Document getDocument(Class clazz) { @@ -325,17 +321,17 @@ if (mapping != null || mappings.size() > 0) { String typeNameAtt = null; if (mapping != null) { - typeNameAtt = DOMUtils.getAttributeValueEmptyNull(mapping, "name"); + typeNameAtt = mapping.getAttributeValue("name"); } String extensibleElements = null; if (mapping != null) { - extensibleElements = mapping.getAttribute("extensibleElements"); + extensibleElements = mapping.getAttributeValue("extensibleElements"); } String extensibleAttributes = null; if (mapping != null) { - extensibleAttributes = mapping.getAttribute("extensibleAttributes"); + extensibleAttributes = mapping.getAttributeValue("extensibleAttributes"); } String defaultNS = NamespaceHelper.makeNamespaceFromClassName(info.getTypeClass().getName(), @@ -440,7 +436,7 @@ } info.setTypeClass(m.getReturnType()); // info.setAnnotations(m.getAnnotations()); - Element rtElement = DOMUtils.getFirstChildWithName(bestMatch, "", "return-type"); + Element rtElement = bestMatch.getChild("return-type"); readMetadata(info, mapping, rtElement); } @@ -448,25 +444,24 @@ } protected void readMetadata(TypeClassInfo info, Element mapping, Element parameter) { - info.setTypeName(createQName(parameter, DOMUtils.getAttributeValueEmptyNull(parameter, "typeName"))); - info.setMappedName(createQName(parameter, - DOMUtils.getAttributeValueEmptyNull(parameter, "mappedName"))); + info.setTypeName(createQName(parameter, parameter.getAttributeValue("typeName"))); + info.setMappedName(createQName(parameter, parameter.getAttributeValue("mappedName"))); setComponentType(info, mapping, parameter); setKeyType(info, mapping, parameter); setValueType(info, mapping, parameter); setType(info, parameter); - String min = DOMUtils.getAttributeValueEmptyNull(parameter, "minOccurs"); + String min = parameter.getAttributeValue("minOccurs"); if (min != null) { info.setMinOccurs(Long.parseLong(min)); } - String max = DOMUtils.getAttributeValueEmptyNull(parameter, "maxOccurs"); + String max = parameter.getAttributeValue("maxOccurs"); if (max != null) { info.setMaxOccurs(Long.parseLong(max)); } - String flat = DOMUtils.getAttributeValueEmptyNull(parameter, "flat"); + String flat = parameter.getAttributeValue("flat"); if (flat != null) { info.setFlat(Boolean.valueOf(flat.toLowerCase()).booleanValue()); } @@ -525,7 +520,7 @@ } protected void setComponentType(TypeClassInfo info, Element mapping, Element parameter) { - String componentType = DOMUtils.getAttributeValueEmptyNull(parameter, "componentType"); + String componentType = parameter.getAttributeValue("componentType"); if (componentType != null) { info.setGenericType(loadGeneric(info, mapping, componentType)); } @@ -543,7 +538,7 @@ TypeClassInfo componentInfo = new TypeClassInfo(); componentInfo.setDescription("generic component " + componentInfo.getDescription()); readMetadata(componentInfo, mapping, propertyEl); - String className = DOMUtils.getAttributeValueEmptyNull(propertyEl, "class"); + String className = propertyEl.getAttributeValue("class"); if (className == null) { throw new DatabindingException("A 'class' attribute must be specified for " + name); @@ -566,7 +561,7 @@ } protected void setType(TypeClassInfo info, Element parameter) { - String type = DOMUtils.getAttributeValueEmptyNull(parameter, "type"); + String type = parameter.getAttributeValue("type"); if (type != null) { try { info.setType(ClassLoaderUtils.loadClass(type, getClass())); @@ -577,14 +572,14 @@ } protected void setKeyType(TypeClassInfo info, Element mapping, Element parameter) { - String componentType = DOMUtils.getAttributeValueEmptyNull(parameter, "keyType"); + String componentType = parameter.getAttributeValue("keyType"); if (componentType != null) { info.setKeyType(loadGeneric(info, mapping, componentType)); } } private void setValueType(TypeClassInfo info, Element mapping, Element parameter) { - String componentType = DOMUtils.getAttributeValueEmptyNull(parameter, "valueType"); + String componentType = parameter.getAttributeValue("valueType"); if (componentType != null) { info.setValueType(loadGeneric(info, mapping, componentType)); } @@ -617,10 +612,10 @@ Element match = getMatch(element, "parameter[@index='" + i + "']"); if (match != null // we check if the type is specified and matches - && DOMUtils.getAttributeValueEmptyNull(match, "class") != null + && match.getAttributeValue("class") != null // if it doesn't match, then we can definitely rule out // this result - && !DOMUtils.getAttributeValueEmptyNull(match, "class").equals(parameterType.getName())) { + && !match.getAttributeValue("class").equals(parameterType.getName())) { iterator.remove(); } @@ -637,9 +632,7 @@ int highestSpecified = 0; for (Iterator iterator = nodes.iterator(); iterator.hasNext();) { Element element = (Element)iterator.next(); - - List params = DOMUtils.getChildrenWithName(element, "", "parameter"); - int availableParameters = params.size(); + int availableParameters = element.getChildren("parameter").size(); if (availableParameters > highestSpecified) { bestCandidate = element; highestSpecified = availableParameters; @@ -648,17 +641,23 @@ return bestCandidate; } - private Element getMatch(Node doc, String xpath) { - return (Element)xpathUtils.getValue(xpath, doc, XPathConstants.NODE); + private Element getMatch(Object doc, String xpath) { + try { + XPath path = XPath.newInstance(xpath); + return (Element)path.selectSingleNode(doc); + } catch (JDOMException e) { + throw new DatabindingException("Error evaluating xpath " + xpath, e); + } } - private List getMatches(Node doc, String xpath) { - NodeList nl = (NodeList)xpathUtils.getValue(xpath, doc, XPathConstants.NODESET); - List r = new ArrayList(); - for (int x = 0; x < nl.getLength(); x++) { - r.add((Element)nl.item(x)); + @SuppressWarnings("unchecked") + private List getMatches(Object doc, String xpath) { + try { + XPath path = XPath.newInstance(xpath); + return path.selectNodes(doc); + } catch (JDOMException e) { + throw new DatabindingException("Error evaluating xpath " + xpath, e); } - return r; } /** @@ -677,12 +676,12 @@ String prefix = value.substring(0, index); String localName = value.substring(index + 1); - String ns = DOMUtils.getNamespace(e, prefix); + Namespace ns = e.getNamespace(prefix); if (ns == null || localName == null) { throw new DatabindingException("Invalid QName in mapping: " + value); } - return new QName(ns, localName, prefix); + return new QName(ns.getURI(), localName, prefix); } } Modified: cxf/branches/2.1.x-fixes/rt/databinding/aegis/src/main/java/org/apache/cxf/aegis/type/basic/ArrayType.java URL: http://svn.apache.org/viewvc/cxf/branches/2.1.x-fixes/rt/databinding/aegis/src/main/java/org/apache/cxf/aegis/type/basic/ArrayType.java?rev=747871&r1=747870&r2=747871&view=diff ============================================================================== --- cxf/branches/2.1.x-fixes/rt/databinding/aegis/src/main/java/org/apache/cxf/aegis/type/basic/ArrayType.java (original) +++ cxf/branches/2.1.x-fixes/rt/databinding/aegis/src/main/java/org/apache/cxf/aegis/type/basic/ArrayType.java Wed Feb 25 17:54:34 2009 @@ -22,6 +22,8 @@ import java.util.ArrayList; import java.util.Collection; import java.util.HashSet; +import java.util.Iterator; +import java.util.List; import java.util.Set; import javax.xml.namespace.QName; @@ -32,13 +34,14 @@ import org.apache.cxf.aegis.DatabindingException; import org.apache.cxf.aegis.type.Type; import org.apache.cxf.aegis.type.TypeUtil; +import org.apache.cxf.aegis.util.NamespaceHelper; import org.apache.cxf.aegis.xml.MessageReader; import org.apache.cxf.aegis.xml.MessageWriter; +import org.apache.cxf.common.util.SOAPConstants; import org.apache.cxf.common.xmlschema.XmlSchemaConstants; -import org.apache.ws.commons.schema.XmlSchema; -import org.apache.ws.commons.schema.XmlSchemaComplexType; -import org.apache.ws.commons.schema.XmlSchemaElement; -import org.apache.ws.commons.schema.XmlSchemaSequence; +import org.jdom.Attribute; +import org.jdom.Element; +import org.jdom.Namespace; /** * An ArrayType. @@ -162,8 +165,8 @@ } @Override - public void writeObject(Object values, MessageWriter writer, - Context context) throws DatabindingException { + public void writeObject(Object values, MessageWriter writer, Context context) + throws DatabindingException { boolean forceXsiWrite = false; if (values == null) { return; @@ -186,6 +189,7 @@ String name = type.getSchemaType().getLocalPart(); + Class arrayType = type.getTypeClass(); boolean oldXsiWrite = context.getGlobalContext().isWriteXsiTypes(); @@ -262,51 +266,70 @@ } else { type.writeObject(value, cwriter, context); } - + if (type.isWriteOuter()) { cwriter.close(); } } @Override - public void writeSchema(XmlSchema root) { - if (hasDefinedArray(root)) { - return; - } + public void writeSchema(Element root) { + try { + if (hasDefinedArray(root)) { + return; + } - XmlSchemaComplexType complex = new XmlSchemaComplexType(root); - complex.setName(getSchemaType().getLocalPart()); - root.addType(complex); - root.getItems().add(complex); - - XmlSchemaSequence seq = new XmlSchemaSequence(); - complex.setParticle(seq); - - Type componentType = getComponentType(); - XmlSchemaElement element = new XmlSchemaElement(); - element.setName(componentType.getSchemaType().getLocalPart()); - element.setSchemaTypeName(componentType.getSchemaType()); - - seq.getItems().add(element); + Element complex = new Element("complexType", SOAPConstants.XSD_PREFIX, SOAPConstants.XSD); + complex.setAttribute(new Attribute("name", getSchemaType().getLocalPart())); + root.addContent(complex); - if (componentType.isNillable()) { - element.setNillable(true); - } + Element seq = new Element("sequence", SOAPConstants.XSD_PREFIX, SOAPConstants.XSD); + complex.addContent(seq); + + Element element = new Element("element", SOAPConstants.XSD_PREFIX, SOAPConstants.XSD); + seq.addContent(element); + + Type componentType = getComponentType(); + String prefix = NamespaceHelper.getUniquePrefix(root, componentType.getSchemaType() + .getNamespaceURI()); + + element.setAttribute(new Attribute("name", componentType.getSchemaType().getLocalPart())); + element.setAttribute(TypeUtil.createTypeAttribute(prefix, componentType, root)); + + if (componentType.isNillable()) { + element.setAttribute(new Attribute("nillable", "true")); + } + + element.setAttribute(new Attribute("minOccurs", Long.valueOf(getMinOccurs()).toString())); - element.setMinOccurs(getMinOccurs()); - element.setMaxOccurs(getMaxOccurs()); + if (maxOccurs == Long.MAX_VALUE) { + element.setAttribute(new Attribute("maxOccurs", "unbounded")); + } else { + element.setAttribute(new Attribute("maxOccurs", Long.valueOf(getMaxOccurs()).toString())); + } + } catch (IllegalArgumentException e) { + throw new DatabindingException("Illegal argument.", e); + } } /** - * Since both an Array and a List can have the same type definition, double check that there isn't already - * a defined type already. + * Since both an Array and a List can have the same type definition, double + * check that there isn't already a defined type already. * * @param root * @return */ - private boolean hasDefinedArray(XmlSchema root) { - return root.getTypeByName(getSchemaType().getLocalPart()) != null; + private boolean hasDefinedArray(Element root) { + List children = root.getChildren("complexType", Namespace.getNamespace(SOAPConstants.XSD)); + for (Iterator itr = children.iterator(); itr.hasNext();) { + Element e = (Element)itr.next(); + + if (e.getAttributeValue("name").equals(getSchemaType().getLocalPart())) { + return true; + } + } + return false; } /** @@ -393,7 +416,7 @@ setWriteOuter(!flat); this.flat = flat; } - + @Override public boolean hasMaxOccurs() { return true; Modified: cxf/branches/2.1.x-fixes/rt/databinding/aegis/src/main/java/org/apache/cxf/aegis/type/basic/BeanType.java URL: http://svn.apache.org/viewvc/cxf/branches/2.1.x-fixes/rt/databinding/aegis/src/main/java/org/apache/cxf/aegis/type/basic/BeanType.java?rev=747871&r1=747870&r2=747871&view=diff ============================================================================== --- cxf/branches/2.1.x-fixes/rt/databinding/aegis/src/main/java/org/apache/cxf/aegis/type/basic/BeanType.java (original) +++ cxf/branches/2.1.x-fixes/rt/databinding/aegis/src/main/java/org/apache/cxf/aegis/type/basic/BeanType.java Wed Feb 25 17:54:34 2009 @@ -26,36 +26,31 @@ import java.lang.reflect.Modifier; import java.lang.reflect.Proxy; import java.util.HashSet; +import java.util.Iterator; import java.util.Set; - import javax.xml.namespace.QName; import org.apache.cxf.aegis.AegisContext; import org.apache.cxf.aegis.Context; import org.apache.cxf.aegis.DatabindingException; -import org.apache.cxf.aegis.type.AbstractTypeCreator; import org.apache.cxf.aegis.type.Type; import org.apache.cxf.aegis.type.TypeMapping; import org.apache.cxf.aegis.type.TypeUtil; import org.apache.cxf.aegis.type.mtom.AbstractXOPType; +import org.apache.cxf.aegis.util.NamespaceHelper; import org.apache.cxf.aegis.xml.MessageReader; import org.apache.cxf.aegis.xml.MessageWriter; import org.apache.cxf.common.classloader.ClassLoaderUtils; -import org.apache.cxf.common.xmlschema.XmlSchemaUtils; +import org.apache.cxf.common.util.SOAPConstants; import org.apache.cxf.interceptor.Fault; -import org.apache.ws.commons.schema.XmlSchema; -import org.apache.ws.commons.schema.XmlSchemaAny; -import org.apache.ws.commons.schema.XmlSchemaAnyAttribute; -import org.apache.ws.commons.schema.XmlSchemaAttribute; -import org.apache.ws.commons.schema.XmlSchemaComplexContent; -import org.apache.ws.commons.schema.XmlSchemaComplexContentExtension; -import org.apache.ws.commons.schema.XmlSchemaComplexType; -import org.apache.ws.commons.schema.XmlSchemaElement; -import org.apache.ws.commons.schema.XmlSchemaSequence; +import org.jaxen.JaxenException; +import org.jdom.Attribute; +import org.jdom.Element; +import org.jdom.Namespace; /** * Serializes JavaBeans. - * + * * There's a really dangerous coding convention in this class, maintainers beware. * There are two constructor. The no-args constructor defers, until later, * the construction of a BeanTypeInfo. The one-arg constructor gets the BeanTypeInfo passed as a parameter. @@ -110,7 +105,7 @@ if (impl == null) { InvocationHandler handler = new InterfaceInvocationHandler(); - object = Proxy.newProxyInstance(this.getClass().getClassLoader(), new Class[] { + object = Proxy.newProxyInstance(clazz.getClassLoader(), new Class[] { clazz }, handler); target = handler; @@ -163,7 +158,7 @@ writeProperty(name, target, writeObj, clazz, propertyTypeInfo); } else { if (!propertyTypeInfo.isNillable(name)) { - throw new DatabindingException(name.getLocalPart() + throw new DatabindingException(name.getLocalPart() + " is nil, but not nillable."); } @@ -188,9 +183,11 @@ } } - protected Type getElementType(QName name, BeanTypeInfo beanTypeInfo, - MessageReader reader, Context context) { - + protected Type getElementType(QName name, + BeanTypeInfo beanTypeInfo, + MessageReader reader, + Context context) { + Type type = beanTypeInfo.getType(name); // Type can be overriden with a xsi:type attribute @@ -199,10 +196,11 @@ } /** - * If the class is an exception, this will try and instantiate it with information from the XFireFault (if - * it exists). + * If the class is an exception, this will try and instantiate it with + * information from the XFireFault (if it exists). */ - protected Object createFromFault(Context context) throws SecurityException, InstantiationException, + protected Object createFromFault(Context context) + throws SecurityException, InstantiationException, IllegalAccessException, IllegalArgumentException, InvocationTargetException { Class clazz = getTypeClass(); Constructor ctr; @@ -211,28 +209,16 @@ Fault fault = context.getFault(); try { - ctr = clazz.getConstructor(new Class[] { - String.class, Throwable.class - }); - o = ctr.newInstance(new Object[] { - fault.getMessage(), fault - }); + ctr = clazz.getConstructor(new Class[] {String.class, Throwable.class}); + o = ctr.newInstance(new Object[] {fault.getMessage(), fault}); } catch (NoSuchMethodException e) { try { - ctr = clazz.getConstructor(new Class[] { - String.class, Exception.class - }); - o = ctr.newInstance(new Object[] { - fault.getMessage(), fault - }); + ctr = clazz.getConstructor(new Class[] {String.class, Exception.class}); + o = ctr.newInstance(new Object[] {fault.getMessage(), fault}); } catch (NoSuchMethodException e1) { try { - ctr = clazz.getConstructor(new Class[] { - String.class - }); - o = ctr.newInstance(new Object[] { - fault.getMessage() - }); + ctr = clazz.getConstructor(new Class[] {String.class}); + o = ctr.newInstance(new Object[] {fault.getMessage()}); } catch (NoSuchMethodException e2) { return clazz.newInstance(); } @@ -249,7 +235,7 @@ throws DatabindingException { if (object instanceof InterfaceInvocationHandler) { - InterfaceInvocationHandler delegate = (InterfaceInvocationHandler)object; + InterfaceInvocationHandler delegate = (InterfaceInvocationHandler) object; delegate.writeProperty(name.getLocalPart(), property); return; } @@ -272,9 +258,7 @@ Class propertyType = desc.getPropertyType(); if ((property == null && !propertyType.isPrimitive()) || (property != null)) { - m.invoke(object, new Object[] { - property - }); + m.invoke(object, new Object[] {property}); } } catch (Exception e) { if (e instanceof DatabindingException) { @@ -287,20 +271,18 @@ } /** - * This is a hack to get the write method from the implementation class for an interface. + * This is a hack to get the write method from the implementation class for + * an interface. */ private Method getWriteMethodFromImplClass(Class impl, PropertyDescriptor pd) throws Exception { String name = pd.getName(); name = "set" + name.substring(0, 1).toUpperCase() + name.substring(1); - return impl.getMethod(name, new Class[] { - pd.getPropertyType() - }); + return impl.getMethod(name, new Class[] {pd.getPropertyType()}); } - + /** * To avoid double-writing xsi:type attributes, ObjectType uses this special entrypoint. - * * @param object * @param writer * @param context @@ -310,33 +292,38 @@ Context context, boolean wroteXsiType) { writeObjectInternal(object, writer, context, wroteXsiType); } - + /** * {@inheritDoc} */ @Override - public void writeObject(Object object, MessageWriter writer, - Context context) throws DatabindingException { + public void writeObject(Object object, MessageWriter writer, Context context) + throws DatabindingException { writeObjectInternal(object, writer, context, false); } - private void writeObjectInternal(Object object, MessageWriter writer, Context context, - boolean wroteXsiType) throws DatabindingException { + private void writeObjectInternal(Object object, MessageWriter writer, Context context, + boolean wroteXsiType) + throws DatabindingException { if (object == null) { return; } BeanTypeInfo inf = getTypeInfo(); - if (!wroteXsiType && object.getClass() == getTypeClass() && context.isWriteXsiTypes()) { + if (!wroteXsiType + && object.getClass() == getTypeClass() + && context.isWriteXsiTypes()) { writer.writeXsiType(getSchemaType()); } /* - * TODO: Replace this method with one split into two pieces so that we can front-load the attributes - * and traverse down the list of super classes. + * TODO: Replace this method with one split into two pieces so that we + * can front-load the attributes and traverse down the list of super + * classes. */ - for (QName name : inf.getAttributes()) { + for (Iterator itr = inf.getAttributes(); itr.hasNext();) { + QName name = (QName)itr.next(); Object value = readProperty(object, name); if (value != null) { @@ -355,7 +342,8 @@ } } - for (QName name : inf.getElements()) { + for (Iterator itr = inf.getElements(); itr.hasNext();) { + QName name = (QName)itr.next(); if (inf.isExtension() && inf.getPropertyDescriptorFromMappedName(name).getReadMethod().getDeclaringClass() != inf @@ -427,6 +415,163 @@ } } + /** + * @see org.apache.cxf.aegis.type.Type#writeSchema(org.jdom.Element) + */ + @Override + public void writeSchema(Element root) { + BeanTypeInfo inf = getTypeInfo(); + Element complex = new Element("complexType", SOAPConstants.XSD_PREFIX, SOAPConstants.XSD); + complex.setAttribute(new Attribute("name", getSchemaType().getLocalPart())); + root.addContent(complex); + + Type sooperType = getSuperType(); + + /* + * See Java Virtual Machine specification: + * http://java.sun.com/docs/books/vmspec/2nd-edition/html/ClassFile.doc.html#75734 + */ + if (((inf.getTypeClass().getModifiers() & Modifier.ABSTRACT) != 0) + && !inf.getTypeClass().isInterface()) { + complex.setAttribute(new Attribute("abstract", "true")); + } + + if (inf.isExtension() && sooperType != null) { + Element complexContent = new Element("complexContent", + SOAPConstants.XSD_PREFIX, + SOAPConstants.XSD); + complex.addContent(complexContent); + complex = complexContent; + } + + /* + * Decide if we're going to extend another type. If we are going to + * defer, then make sure that we extend the type for our superclass. + */ + boolean isExtension = inf.isExtension(); + + Element dummy = complex; + + if (isExtension && sooperType != null) { + + Element extension = new Element("extension", SOAPConstants.XSD_PREFIX, SOAPConstants.XSD); + complex.addContent(extension); + QName baseType = sooperType.getSchemaType(); + extension.setAttribute(new Attribute("base", getNameWithPrefix2(root, baseType + .getNamespaceURI(), baseType.getLocalPart()))); + + dummy = extension; + } + + Element seq = null; + boolean needXmime = false; + boolean needUtilityTypes = false; + + // Write out schema for elements + for (Iterator itr = inf.getElements(); itr.hasNext();) { + + QName name = (QName)itr.next(); + + if (isExtension) { + PropertyDescriptor pd = inf.getPropertyDescriptorFromMappedName(name); + + assert pd.getReadMethod() != null && pd.getWriteMethod() != null; + if (pd.getReadMethod().getDeclaringClass() != inf.getTypeClass()) { + continue; + } + } + + if (seq == null) { + seq = new Element("sequence", SOAPConstants.XSD_PREFIX, SOAPConstants.XSD); + dummy.addContent(seq); + } + + Element element = new Element("element", SOAPConstants.XSD_PREFIX, SOAPConstants.XSD); + seq.addContent(element); + + Type type = getType(inf, name); + + String nameNS = name.getNamespaceURI(); + String nameWithPrefix = getNameWithPrefix(root, nameNS, name.getLocalPart()); + + String prefix = NamespaceHelper.getUniquePrefix(root, type.getSchemaType().getNamespaceURI()); + + writeTypeReference(name, nameWithPrefix, element, type, prefix, root); + needXmime |= type.usesXmime(); + needUtilityTypes |= type.usesUtilityTypes(); + } + + if (needXmime) { + addXmimeToSchema(root); + } + + if (needUtilityTypes) { + AegisContext.addUtilityTypesToSchema(root); + } + + /** + * if future proof then add element + */ + if (inf.isExtensibleElements()) { + if (seq == null) { + seq = new Element("sequence", SOAPConstants.XSD_PREFIX, SOAPConstants.XSD); + dummy.addContent(seq); + } + seq.addContent(createAnyElement()); + } + + // Write out schema for attributes + for (Iterator itr = inf.getAttributes(); itr.hasNext();) { + QName name = (QName)itr.next(); + + Element element = new Element("attribute", SOAPConstants.XSD_PREFIX, SOAPConstants.XSD); + dummy.addContent(element); + + Type type = getType(inf, name); + + String nameNS = name.getNamespaceURI(); + String nameWithPrefix = getNameWithPrefix(root, nameNS, name.getLocalPart()); + + String prefix = NamespaceHelper.getUniquePrefix(root, type.getSchemaType().getNamespaceURI()); + element.setAttribute(new Attribute("name", nameWithPrefix)); + element.setAttribute(TypeUtil.createTypeAttribute(prefix, type, root)); + } + + /** + * If extensible attributes then add + */ + if (inf.isExtensibleAttributes()) { + dummy.addContent(createAnyAttribute()); + } + } + + private String getNameWithPrefix(Element root, String nameNS, String localName) { + if (!"".equals(nameNS) && !nameNS.equals(getSchemaType().getNamespaceURI())) { + Element rootElement = (Element)root.getParent(); + String prefix = null; + if (rootElement != null) { // can happen with doc/lit/bare + prefix = NamespaceHelper.getUniquePrefix(rootElement, nameNS); + } + + if (prefix == null || prefix.length() == 0) { + prefix = NamespaceHelper.getUniquePrefix(root, nameNS); + } + + return prefix + ":" + localName; + } + return localName; + } + + private String getNameWithPrefix2(Element root, String nameNS, String localName) { + String prefix = NamespaceHelper.getUniquePrefix(root, nameNS); + + if (prefix == null || prefix.length() == 0) { + prefix = NamespaceHelper.getUniquePrefix(root, nameNS); + } + + return prefix + ":" + localName; + } + private Type getType(BeanTypeInfo inf, QName name) { Type type = inf.getType(name); @@ -438,22 +583,23 @@ return type; } - private void writeTypeReference(QName name, XmlSchemaElement element, Type type) { + private void writeTypeReference(QName name, String nameWithPrefix, + Element element, Type type, String prefix, + Element root) { if (type.isAbstract()) { - element.setName(name.getLocalPart()); - element.setSchemaTypeName(type.getSchemaType()); + element.setAttribute(new Attribute("name", nameWithPrefix)); + element.setAttribute(TypeUtil.createTypeAttribute(prefix, type, root)); int minOccurs = getTypeInfo().getMinOccurs(name); - /* - * Old code had ridiculous '!=0' here, which cannot have been right. - */ - if (minOccurs != -1) { - element.setMinOccurs(minOccurs); + if (minOccurs == 0) { + element.setAttribute(new Attribute("minOccurs", Integer.valueOf(minOccurs).toString())); } - element.setNillable(getTypeInfo().isNillable(name)); + if (getTypeInfo().isNillable(name)) { + element.setAttribute(new Attribute("nillable", "true")); + } } else { - element.setRefName(type.getSchemaType()); + element.setAttribute(new Attribute("ref", prefix + ':' + type.getSchemaType().getLocalPart())); } } @@ -469,7 +615,7 @@ /** * We need to write a complex type schema for Beans, so return true. - * + * * @see org.apache.cxf.aegis.type.Type#isComplex() */ @Override @@ -486,11 +632,13 @@ BeanTypeInfo inf = getTypeInfo(); - for (QName name : inf.getAttributes()) { + for (Iterator itr = inf.getAttributes(); itr.hasNext();) { + QName name = (QName)itr.next(); deps.add(inf.getType(name)); } - for (QName name : inf.getElements()) { + for (Iterator itr = inf.getElements(); itr.hasNext();) { + QName name = (QName)itr.next(); if (inf.isExtension() && inf.getPropertyDescriptorFromMappedName(name).getReadMethod().getDeclaringClass() != inf .getTypeClass()) { @@ -500,7 +648,7 @@ } /* - * Automagically add chain of superclassesif this is an an extension. + * Automagically add chain of superclasses *if* this is an an extension. */ if (inf.isExtension()) { Type sooperType = getSuperType(); @@ -520,12 +668,11 @@ type = beanType.getTypeInfo().getType(name); if (type == null) { - Type superType = beanType.getSuperType(); /* - * The class might inherit from, say, 'Integer'. In - * which case we've got no BeanType to work with. - */ + Type superType = beanType.getSuperType(); /* The class might inherit from, say, 'Integer'. + In which case we've got no BeanType + to work with. */ if (superType instanceof BeanType) { - beanType = (BeanType)superType; + beanType = (BeanType) superType; } else { break; // give up. } @@ -597,6 +744,19 @@ } /** + * Create an element to represent any future elements that might get added + * to the schema + * + * @return + */ + private Element createAnyElement() { + Element result = new Element("any", SOAPConstants.XSD_PREFIX, SOAPConstants.XSD); + result.setAttribute(new Attribute("minOccurs", "0")); + result.setAttribute(new Attribute("maxOccurs", "unbounded")); + return result; + } + + /** * {@inheritDoc} */ @Override @@ -615,8 +775,29 @@ return sb.toString(); } - private void addXmimeToSchema(XmlSchema root) { - XmlSchemaUtils.addImportIfNeeded(root, AbstractXOPType.XML_MIME_NS); + /** + * Create an element to represent any future attributes that might get added + * to the schema + * + * @return + */ + private Element createAnyAttribute() { + return new Element("anyAttribute", SOAPConstants.XSD_PREFIX, SOAPConstants.XSD); + } + + private void addXmimeToSchema(Element root) { + try { + Object node = AbstractXOPType.getXmimeXpathImport().selectSingleNode(root); + if (node != null) { + return; + } + } catch (JaxenException e) { + throw new RuntimeException(e); + } + Element element = new Element("import", SOAPConstants.XSD_PREFIX, SOAPConstants.XSD); + root.addContent(0, element); + element.setAttribute("namespace", AbstractXOPType.XML_MIME_NS); + root.addNamespaceDeclaration(Namespace.getNamespace("xmime", AbstractXOPType.XML_MIME_NS)); } /** @@ -640,113 +821,4 @@ info.setTypeMapping(typeMapping); } } - - @Override - public void writeSchema(XmlSchema root) { - BeanTypeInfo inf = getTypeInfo(); - XmlSchemaComplexType complex = new XmlSchemaComplexType(root); - complex.setName(getSchemaType().getLocalPart()); - root.addType(complex); - root.getItems().add(complex); - - Type sooperType = getSuperType(); - - /* - * See Java Virtual Machine specification: - * http://java.sun.com/docs/books/vmspec/2nd-edition/html/ClassFile.doc.html#75734 - */ - if (((inf.getTypeClass().getModifiers() & Modifier.ABSTRACT) != 0) - && !inf.getTypeClass().isInterface()) { - complex.setAbstract(true); - } - - XmlSchemaSequence sequence = new XmlSchemaSequence(); - /* - * Decide if we're going to extend another type. If we are going to defer, then make sure that we - * extend the type for our superclass. - */ - boolean isExtension = inf.isExtension(); - - if (isExtension && sooperType != null) { - // if sooperType is null, things are confused. - XmlSchemaComplexContent content = new XmlSchemaComplexContent(); - complex.setContentModel(content); - XmlSchemaComplexContentExtension extension = new XmlSchemaComplexContentExtension(); - content.setContent(extension); - extension.setBaseTypeName(sooperType.getSchemaType()); - extension.setParticle(sequence); - } else { - complex.setParticle(sequence); - } - - boolean needXmime = false; - boolean needUtilityTypes = false; - - // Write out schema for elements - for (QName name : inf.getElements()) { - - if (isExtension) { - PropertyDescriptor pd = inf.getPropertyDescriptorFromMappedName(name); - - // assert pd.getReadMethod() != null && pd.getWriteMethod() != null; - - if (pd.getReadMethod().getDeclaringClass() != inf.getTypeClass()) { - continue; - } - } - - XmlSchemaElement element = new XmlSchemaElement(); - element.setName(name.getLocalPart()); - sequence.getItems().add(element); - - Type type = getType(inf, name); - if (AbstractTypeCreator. - HTTP_CXF_APACHE_ORG_ARRAYS.equals(type.getSchemaType().getNamespaceURI())) { - XmlSchemaUtils.addImportIfNeeded(root, AbstractTypeCreator.HTTP_CXF_APACHE_ORG_ARRAYS); - } - - writeTypeReference(name, element, type); - needXmime |= type.usesXmime(); - needUtilityTypes |= type.usesUtilityTypes(); - } - - if (needXmime) { - addXmimeToSchema(root); - } - - if (needUtilityTypes) { - AegisContext.addUtilityTypesToSchema(root); - } - - /** - * if future proof then add element - */ - if (inf.isExtensibleElements()) { - XmlSchemaAny any = new XmlSchemaAny(); - any.setMinOccurs(0); - any.setMaxOccurs(Long.MAX_VALUE); - sequence.getItems().add(any); - } - - // Write out schema for attributes - for (QName name : inf.getAttributes()) { - XmlSchemaAttribute attribute = new XmlSchemaAttribute(); - complex.getAttributes().add(attribute); - attribute.setName(name.getLocalPart()); - Type type = getType(inf, name); - attribute.setSchemaTypeName(type.getSchemaType()); - String ns = name.getNamespaceURI(); - if (!ns.equals(root.getTargetNamespace())) { - XmlSchemaUtils.addImportIfNeeded(root, ns); - } - } - - /** - * If extensible attributes then add - */ - if (inf.isExtensibleAttributes()) { - sequence.getItems().add(new XmlSchemaAnyAttribute()); - } - } - }