Return-Path: Delivered-To: apmail-ws-axis-dev-archive@www.apache.org Received: (qmail 56095 invoked from network); 20 Aug 2008 02:03:17 -0000 Received: from hermes.apache.org (HELO mail.apache.org) (140.211.11.2) by minotaur.apache.org with SMTP; 20 Aug 2008 02:03:17 -0000 Received: (qmail 24064 invoked by uid 500); 20 Aug 2008 02:03:15 -0000 Delivered-To: apmail-ws-axis-dev-archive@ws.apache.org Received: (qmail 23918 invoked by uid 500); 20 Aug 2008 02:03:15 -0000 Mailing-List: contact axis-cvs-help@ws.apache.org; run by ezmlm Precedence: bulk list-help: list-unsubscribe: List-Post: List-Id: Delivered-To: mailing list axis-cvs@ws.apache.org Received: (qmail 23909 invoked by uid 99); 20 Aug 2008 02:03:15 -0000 Received: from athena.apache.org (HELO athena.apache.org) (140.211.11.136) by apache.org (qpsmtpd/0.29) with ESMTP; Tue, 19 Aug 2008 19:03:15 -0700 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, 20 Aug 2008 02:02:26 +0000 Received: by eris.apache.org (Postfix, from userid 65534) id 66921238898E; Tue, 19 Aug 2008 19:02:55 -0700 (PDT) Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit Subject: svn commit: r687222 - in /webservices/axis/trunk/c/src/wsdl/org/apache/axis/wsdl/wsdl2ws: WSDL2Ws.java info/WSDLInfo.java Date: Wed, 20 Aug 2008 02:02:55 -0000 To: axis-cvs@ws.apache.org From: nadiramra@apache.org X-Mailer: svnmailer-1.0.8 Message-Id: <20080820020255.66921238898E@eris.apache.org> X-Virus-Checked: Checked by ClamAV on apache.org Author: nadiramra Date: Tue Aug 19 19:02:54 2008 New Revision: 687222 URL: http://svn.apache.org/viewvc?rev=687222&view=rev Log: Refactor to put code in proper classes. Modified: webservices/axis/trunk/c/src/wsdl/org/apache/axis/wsdl/wsdl2ws/WSDL2Ws.java webservices/axis/trunk/c/src/wsdl/org/apache/axis/wsdl/wsdl2ws/info/WSDLInfo.java Modified: webservices/axis/trunk/c/src/wsdl/org/apache/axis/wsdl/wsdl2ws/WSDL2Ws.java URL: http://svn.apache.org/viewvc/webservices/axis/trunk/c/src/wsdl/org/apache/axis/wsdl/wsdl2ws/WSDL2Ws.java?rev=687222&r1=687221&r2=687222&view=diff ============================================================================== --- webservices/axis/trunk/c/src/wsdl/org/apache/axis/wsdl/wsdl2ws/WSDL2Ws.java (original) +++ webservices/axis/trunk/c/src/wsdl/org/apache/axis/wsdl/wsdl2ws/WSDL2Ws.java Tue Aug 19 19:02:54 2008 @@ -24,7 +24,6 @@ import java.util.Iterator; import java.util.List; import java.util.Map; -import java.util.Vector; import java.util.Enumeration; import java.util.Hashtable; @@ -36,19 +35,11 @@ import javax.wsdl.PortType; import javax.wsdl.Service; import javax.xml.namespace.QName; -import javax.xml.rpc.holders.IntHolder; - -// hold off until we use 1.4 or newer axis.jar. -//import org.apache.axis.constants.Style; import org.apache.axis.wsdl.symbolTable.BaseType; import org.apache.axis.wsdl.symbolTable.BindingEntry; import org.apache.axis.wsdl.symbolTable.CElementDecl; -import org.apache.axis.wsdl.symbolTable.CSchemaUtils; import org.apache.axis.wsdl.symbolTable.CContainedAttribute; -import org.apache.axis.wsdl.symbolTable.CollectionElement; -import org.apache.axis.wsdl.symbolTable.CollectionType; -import org.apache.axis.wsdl.symbolTable.DefinedElement; import org.apache.axis.wsdl.symbolTable.DefinedType; import org.apache.axis.wsdl.symbolTable.Element; import org.apache.axis.wsdl.symbolTable.Parameters; @@ -63,7 +54,6 @@ import org.apache.axis.wsdl.wsdl2ws.info.WSDLInfo; import org.apache.axis.wsdl.wsdl2ws.info.WebServiceContext; import org.apache.axis.wsdl.wsdl2ws.info.WrapperInfo; -import org.w3c.dom.Node; /** * This is the main class for the WSDL2Ws Tool. This class reuses the code in the @@ -243,23 +233,7 @@ // Generate types, populating the type map // ================================================== - c_typeMap = new TypeMap(); - - Iterator it = c_symbolTable.getTypeIndex().values().iterator(); - while (it.hasNext()) - { - TypeEntry type = (TypeEntry) it.next(); - Node node = type.getNode(); - if (node != null) - { - if (c_verbose) - { - System.out.println( "==>getTypeInfo: Processing type...." + type.getQName()); - } - - createTypeInfo(type); - } - } + c_typeMap = c_wsdlInfo.generateTypeMap(); // ================================================== // Get service, ports, binding, and port type @@ -320,7 +294,7 @@ { System.out.println( "Dumping typeMap...."); - it = c_typeMap.getTypes().iterator(); + Iterator it = c_typeMap.getTypes().iterator(); while (it.hasNext()) { System.out.println(it.next()); @@ -789,283 +763,6 @@ } } - - /** - * Iterates through symbol table, creating types in the typemap. - * - * @param typename - * @return - * @throws WrapperFault - */ - private Type createTypeInfo(QName typename) throws WrapperFault - { - TypeEntry type = c_symbolTable.getType(typename); - if (type == null) - { - type = c_symbolTable.getElement(typename); - if (type == null) - { - throw new WrapperFault( - "[" - + typename - + "]unexpected condition occurred " - + ".. please inform the axis-dev@apache.org mailing list ASAP"); - } - } - return createTypeInfo(type); - } - - /** - * Creates a type map entry from a symbol table typeentry. - * - * @param type - * @return - * @throws WrapperFault - */ - private Type createTypeInfo(TypeEntry type) throws WrapperFault - { - Type typedata = null; - Type newSecondaryType = null; - - // Do not add types which are not used in the WSDL - if (!type.isReferenced()) - return null; - - if (c_verbose && !CUtils.isPrimitiveBasicType(type.getQName())) - System.out.println("Attempting to create type: " + type.getQName()); - - if (type instanceof CollectionElement) - { //an array - } - else if (type instanceof DefinedElement) - { - // if element references another type, process the referenced type - if (type.getRefType() != null) - { - if (c_verbose) - System.out.println("Attempting to create new type from element-ref: " + type.getRefType().getQName()); - - return createTypeInfo(type.getRefType()); - } - - return null; - } - - if (-1 != type.getQName().getLocalPart().indexOf('[')) - { - /* it seems that this is an array */ - if (null == type.getRefType()) - throw new WrapperFault("Array type found without a Ref type"); - - QName qn = type.getRefType().getQName(); - if (null == qn) - throw new WrapperFault("Array type found without a Ref type"); - - if (CUtils.isBasicType(qn)) - return null; - - QName newqn = new QName(type.getQName().getNamespaceURI(), qn.getLocalPart() + "_Array"); - // type is a inbuilt type or a already created type? - typedata = c_typeMap.getType(newqn); - if (typedata != null) - { - if (c_verbose && !CUtils.isPrimitiveBasicType(type.getQName())) - System.out.println("Type not created, already exists: " + type.getQName()); - - return typedata; - } - - typedata = new Type(newqn, newqn.getLocalPart()); - - if (type.getRefType().getRefType() != null) - typedata.setElementType(type.getRefType().getRefType().getQName().getLocalPart()); - else - typedata.setElementType(type.getRefType().getQName().getLocalPart()); - } - else - { - // type is a inbuilt type or a already created type? - typedata = c_typeMap.getType(type.getQName()); - if (typedata != null) - { - if (c_verbose && !CUtils.isPrimitiveBasicType(type.getQName())) - System.out.println("Type not created, already exists: " + type.getQName()); - - return typedata; - } - - typedata = new Type(type.getQName(), type.getQName().getLocalPart()); - } - - // Add type to type map - if (c_verbose) - System.out.println("Created new type: " + typedata.getName()); - - c_typeMap.addType(typedata.getName(), typedata); - - // work out whether this type will be generated or not - typedata.externalize(isTypeGenerated(type, typedata)); - - Node node = type.getNode(); - - if (type.isSimpleType()) - { - //check for extended types - TypeEntry base = CSchemaUtils.getComplexElementExtensionBase(type.getNode(), c_symbolTable); - if (base != null) - { - String localpart = type.getQName().getLocalPart() + "_value"; - QName typeName = new QName(type.getQName().getNamespaceURI(), localpart); - newSecondaryType = createTypeInfo(base.getQName()); - typedata.addRelatedType(newSecondaryType); - typedata.setExtensionBaseType(new CElementDecl(newSecondaryType, typeName)); - if (c_verbose) - System.out.print( - "=====complexType with simpleContent is found : " - + type.getQName().getLocalPart() + "=====\n"); - } - else - c_wsdlInfo.setRestrictionBaseAndValues(typedata, node); - - // There can be attributes in this extended basic type - Vector attributes = CSchemaUtils.getContainedAttributeTypes(type.getNode(), c_symbolTable); - if (attributes != null) - { - for (int j = 0; j < attributes.size(); j++) - { - CContainedAttribute attr = (CContainedAttribute)attributes.get(j); - newSecondaryType = createTypeInfo(attr.getTypeEntry().getQName()); - attr.setType(newSecondaryType); - typedata.addRelatedType(newSecondaryType); - } - typedata.addAttributes(attributes); - } - } - else if (type instanceof CollectionType) - { - newSecondaryType = createTypeInfo(type.getRefType().getQName()); - typedata.addRelatedType(newSecondaryType); - typedata.setTypeNameForElementName(new CElementDecl(newSecondaryType, type.getQName())); - typedata.setArray(true); - } - else - { - //is this a SOAPEnc array type - QName arrayType = CSchemaUtils.getArrayComponentQName(node,new IntHolder(0),c_symbolTable); - if (arrayType != null) - { - newSecondaryType = createTypeInfo(arrayType); - typedata.addRelatedType(newSecondaryType); - typedata.setTypeNameForElementName(new CElementDecl(newSecondaryType, new QName("item"))); - typedata.setArray(true); - } - else if ((arrayType = CSchemaUtils.getCollectionComponentQName(node)) != null) - { - newSecondaryType = createTypeInfo(arrayType); - typedata.addRelatedType(newSecondaryType); - typedata.setTypeNameForElementName(new CElementDecl(newSecondaryType, new QName("item"))); - typedata.setArray(true); - } - //Note in a array the parameter type is stored as under the name item all the time - else - { - // get all extended types - Vector extendList = new Vector(); - extendList.add(type); - - TypeEntry parent = CSchemaUtils.getComplexElementExtensionBase(type.getNode(), c_symbolTable); - while (parent != null) - { - extendList.add(parent); - parent = CSchemaUtils.getComplexElementExtensionBase(parent.getNode(), c_symbolTable); - } - - // Now generate a list of names and types starting with - // the oldest parent. (Attrs are considered before elements). - for (int i = extendList.size() - 1; i >= 0; i--) - { - TypeEntry te = (TypeEntry) extendList.elementAt(i); - - //TODO the code require the attributes name at extension base types - //different, the WSDL2Ws do not support it having same name at up and below. - - // Process the attributes - if (c_verbose) - System.out.println("Processing attributes for type: " + type.getQName()); - - // TODO Need to handle whether attributes are qualified? - Vector attributes = CSchemaUtils.getContainedAttributeTypes(te.getNode(), c_symbolTable); - if (attributes != null) - { - for (int j = 0; j < attributes.size(); j++) - { - CContainedAttribute attr = (CContainedAttribute)attributes.get(j); - newSecondaryType = createTypeInfo(attr.getTypeEntry().getQName()); - attr.setType(newSecondaryType); - typedata.addRelatedType(newSecondaryType); - } - typedata.addAttributes(attributes); - } - - // Process the elements - if (c_verbose) - System.out.println("Processing elements for type: " + type.getQName()); - - Vector elements = CSchemaUtils.getContainedElementDeclarations(te.getNode(), c_symbolTable); - if (elements != null) - { - // The following will get elementFormDefault for the schema the element is in. - boolean nsQualifyElementDefault = CSchemaUtils.isElementFormDefaultQualified(te.getNode()); - - // Now process the elements. - for (int j = 0; j < elements.size(); j++) - { - CElementDecl elem = (CElementDecl) elements.get(j); - - // Set whether to namespace qualify or not. We only process if not set. - if (!elem.getNsQualified()) - { - boolean nsQualifyElement = - CSchemaUtils.shouldWeNamespaceQualifyNode(elem.getTypeEntry().getNode(), - nsQualifyElementDefault); - elem.setNsQualified(nsQualifyElement); - } - - if (elem.getAnyElement()) - { - newSecondaryType = new Type(CUtils.anyTypeQname, CUtils.anyTypeQname.getLocalPart()); - } - else - { - QName typeName = elem.getTypeEntry().getQName(); - if (typeName.getLocalPart().indexOf('[') > 0) - { - String localpart = - typeName.getLocalPart().substring(0, typeName.getLocalPart().indexOf('[')); - - typeName = new QName(typeName.getNamespaceURI(), localpart); - - if (CUtils.isBasicType(typeName)) - newSecondaryType = createTypeInfo(typeName); - else - newSecondaryType = createTypeInfo(elem.getTypeEntry()); - } - else - newSecondaryType = createTypeInfo(typeName); - } - - typedata.addRelatedType(newSecondaryType); - elem.setType(newSecondaryType); - - typedata.setTypeNameForElementName(elem); - } - } - } // for-loop - } - } - return typedata; - } - /** * Adds faults. * @@ -1390,30 +1087,6 @@ } /** - * Work out the various conditions that dictate whether this type will be generated into a new - * file or not. - * This method is only very partially implemented. - * - * @param type - * @param typedata - * @return true if the type will not be generated. False otherwise - */ - private boolean isTypeGenerated(TypeEntry type, Type typedata) - { - // If the referenced type is actually a type that will not get generated because it's - // a base type array then tell other people of this case. Do this to two levels of indirection - - if(type.getRefType()!=null) - if(type.getRefType().getRefType()!=null && type.getRefType().getRefType().isBaseType()) - return false; - - if (typedata.isAnonymous()) - return false; - else - return true; - } - - /** * Resolves name conflict between a method name and a type name. * When doing document-literal, usually the name of the wrapper element is same as the * operation name. Modified: webservices/axis/trunk/c/src/wsdl/org/apache/axis/wsdl/wsdl2ws/info/WSDLInfo.java URL: http://svn.apache.org/viewvc/webservices/axis/trunk/c/src/wsdl/org/apache/axis/wsdl/wsdl2ws/info/WSDLInfo.java?rev=687222&r1=687221&r2=687222&view=diff ============================================================================== --- webservices/axis/trunk/c/src/wsdl/org/apache/axis/wsdl/wsdl2ws/info/WSDLInfo.java (original) +++ webservices/axis/trunk/c/src/wsdl/org/apache/axis/wsdl/wsdl2ws/info/WSDLInfo.java Tue Aug 19 19:02:54 2008 @@ -34,11 +34,17 @@ import javax.wsdl.extensions.soap.SOAPAddress; import javax.xml.namespace.QName; import javax.xml.rpc.holders.BooleanHolder; +import javax.xml.rpc.holders.IntHolder; import org.apache.axis.Constants; import org.apache.axis.wsdl.gen.Parser; import org.apache.axis.wsdl.symbolTable.BindingEntry; +import org.apache.axis.wsdl.symbolTable.CContainedAttribute; +import org.apache.axis.wsdl.symbolTable.CElementDecl; import org.apache.axis.wsdl.symbolTable.CSchemaUtils; +import org.apache.axis.wsdl.symbolTable.CollectionElement; +import org.apache.axis.wsdl.symbolTable.CollectionType; +import org.apache.axis.wsdl.symbolTable.DefinedElement; import org.apache.axis.wsdl.symbolTable.SchemaUtils; import org.apache.axis.wsdl.symbolTable.ServiceEntry; import org.apache.axis.wsdl.symbolTable.SymTabEntry; @@ -310,6 +316,433 @@ } /** + * Iterates through the symbol table, generating user-defined types and + * storing the types in a hash table. + * + * @return + * @throws WrapperFault + */ + public TypeMap generateTypeMap() throws WrapperFault + { + TypeMap typeMap = new TypeMap(); + if (c_symbolTable == null) + return typeMap; + + Iterator it = c_symbolTable.getTypeIndex().values().iterator(); + while (it.hasNext()) + { + TypeEntry type = (TypeEntry) it.next(); + Node node = type.getNode(); + if (node != null) + { + if (c_verbose) + { + System.out.println( "==>getTypeInfo: Processing type...." + type.getQName()); + } + + createTypeInfo(type, typeMap); + } + } + + return typeMap; + } + + + /** + * Returns list of Port objects in a service definition based on selection criteria. + * + * @param s service definition. + * @param styleDocument true=return document style; false=return "rpc" style. + * This parameter is ignored for REST (HTTP) bindings. + * @param soap11 true=return SOAP 1.1 bindings; false=SOAP 1.1 bindings are ignored. + * @param soap12 true=return SOAP 1.2 bindings; false=SOAP 1.2 bindings are ignored. + * @param rest true=return HTTP bindings; false=ignore HTTP bindings. + * @return List of ports that match selection criteria. + * @throws Exception + */ + private ArrayList getServicePorts(Service s, + boolean styleDocument, + boolean soap11, + boolean soap12, + boolean rest) throws Exception + { + ArrayList a = new ArrayList(); + + if (s == null) + return a; + + Iterator ports = s.getPorts().values().iterator(); + while (ports.hasNext()) + { + Port p = (Port) ports.next(); + Binding b = p.getBinding(); + BindingEntry be = c_symbolTable.getBindingEntry(b.getQName()); + if (b == null || be == null) + throw new WrapperFault("No binding exists for port '" + p.getName() + "'."); + + if ((be.getBindingType() == BindingEntry.TYPE_SOAP) && (soap11 || soap12)) + { + String style = be.getBindingStyle().getName(); + if (style == null) + style = "rpc"; // TODO need to revisit. + + if ((styleDocument && style.equalsIgnoreCase("document")) + || (!styleDocument && style.equalsIgnoreCase("rpc"))) + { + String ns = Constants.URI_WSDL11_SOAP; + SOAPBinding soapbinding = (SOAPBinding)getExtensibilityElement(b, INSTANCEOF_SOAPBINDING); + if (soapbinding != null && null != soapbinding.getElementType().getNamespaceURI()) + ns = soapbinding.getElementType().getNamespaceURI(); + + if ((soap11 && ns.equals(Constants.URI_WSDL11_SOAP)) + || (soap12 && ns.equals(Constants.URI_WSDL12_SOAP))) + a.add(p); + } + } + else if (rest && (be.getBindingType() == BindingEntry.TYPE_HTTP_GET + || be.getBindingType() == BindingEntry.TYPE_HTTP_POST)) + { + a.add(p); + } + } + + return a; + } + + /** + * Collects all the information by the wsdl2ws tool. + */ + private void processWSDLDocument() throws Exception + { + // Get target name space of WSDL + c_targetNameSpaceOfWSDL = c_symbolTable.getDefinition().getTargetNamespace(); + + // Collect services and bindings. + Iterator it = c_symbolTable.getHashMap().values().iterator(); + while (it.hasNext()) + { + Vector v = (Vector) it.next(); + for (int i = 0; i < v.size(); ++i) + { + SymTabEntry entry = (SymTabEntry) v.elementAt(i); + + if (entry instanceof org.apache.axis.wsdl.symbolTable.ServiceEntry) + c_services.add(((ServiceEntry) entry).getService()); + else if (entry instanceof org.apache.axis.wsdl.symbolTable.BindingEntry) + c_bindings.add(entry); + } + } + } + + /** + * Helper function that returns requested extensibility element. + * + * @param e element to retrieve extensibility elements from. + * @param clazz instance of class + * @return extensibility element. + */ + private static Object getExtensibilityElement(WSDLElement e, int clazz) + { + if (e != null) + { + List extElems = e.getExtensibilityElements(); + if (extElems != null) + { + Iterator it = extElems.iterator(); + + while (it.hasNext()) + { + Object o = it.next(); + if ((clazz == INSTANCEOF_SOAPBINDING && (o instanceof javax.wsdl.extensions.soap.SOAPBinding)) + || (clazz == INSTANCEOF_SOAPADDRESS && (o instanceof javax.wsdl.extensions.soap.SOAPAddress)) + || (clazz == INSTANCEOF_SOAPOPERATION && (o instanceof javax.wsdl.extensions.soap.SOAPOperation)) + || (clazz == INSTANCEOF_SOAPBODY && (o instanceof javax.wsdl.extensions.soap.SOAPBody))) + return o; + } + } + } + + return null; + } + + + /** + * Generate a type for the specified QName. + * + * @param typename + * @return + * @throws WrapperFault + */ + private Type createTypeInfo(QName typename, TypeMap typeMap) throws WrapperFault + { + TypeEntry type = c_symbolTable.getType(typename); + if (type == null) + { + type = c_symbolTable.getElement(typename); + if (type == null) + { + throw new WrapperFault( + "[" + + typename + + "]unexpected condition occurred " + + ".. please inform the axis-dev@apache.org mailing list ASAP"); + } + } + return createTypeInfo(type, typeMap); + } + + /** + * Creates a type map entry from a symbol table typeentry. + * + * @param type + * @return + * @throws WrapperFault + */ + private Type createTypeInfo(TypeEntry type, TypeMap typeMap) throws WrapperFault + { + Type typedata = null; + Type newSecondaryType = null; + + // Do not add types which are not used in the WSDL + if (!type.isReferenced()) + return null; + + if (c_verbose && !CUtils.isPrimitiveBasicType(type.getQName())) + System.out.println("Attempting to create type: " + type.getQName()); + + if (type instanceof CollectionElement) + { //an array + } + else if (type instanceof DefinedElement) + { + // if element references another type, process the referenced type + if (type.getRefType() != null) + { + if (c_verbose) + System.out.println("Attempting to create new type from element-ref: " + type.getRefType().getQName()); + + return createTypeInfo(type.getRefType(), typeMap); + } + + return null; + } + + if (-1 != type.getQName().getLocalPart().indexOf('[')) + { + /* it seems that this is an array */ + if (null == type.getRefType()) + throw new WrapperFault("Array type found without a Ref type"); + + QName qn = type.getRefType().getQName(); + if (null == qn) + throw new WrapperFault("Array type found without a Ref type"); + + if (CUtils.isBasicType(qn)) + return null; + + QName newqn = new QName(type.getQName().getNamespaceURI(), qn.getLocalPart() + "_Array"); + // type is a inbuilt type or a already created type? + typedata = typeMap.getType(newqn); + if (typedata != null) + { + if (c_verbose && !CUtils.isPrimitiveBasicType(type.getQName())) + System.out.println("Type not created, already exists: " + type.getQName()); + + return typedata; + } + + typedata = new Type(newqn, newqn.getLocalPart()); + + if (type.getRefType().getRefType() != null) + typedata.setElementType(type.getRefType().getRefType().getQName().getLocalPart()); + else + typedata.setElementType(type.getRefType().getQName().getLocalPart()); + } + else + { + // type is a inbuilt type or a already created type? + typedata = typeMap.getType(type.getQName()); + if (typedata != null) + { + if (c_verbose && !CUtils.isPrimitiveBasicType(type.getQName())) + System.out.println("Type not created, already exists: " + type.getQName()); + + return typedata; + } + + typedata = new Type(type.getQName(), type.getQName().getLocalPart()); + } + + // Add type to type map + if (c_verbose) + System.out.println("Created new type: " + typedata.getName()); + + typeMap.addType(typedata.getName(), typedata); + + // TODO revisit...work out whether this type will be generated or not + typedata.externalize(isTypeGenerated(type, typedata)); + + Node node = type.getNode(); + + if (type.isSimpleType()) + { + //check for extended types + TypeEntry base = CSchemaUtils.getComplexElementExtensionBase(type.getNode(), c_symbolTable); + if (base != null) + { + String localpart = type.getQName().getLocalPart() + "_value"; + QName typeName = new QName(type.getQName().getNamespaceURI(), localpart); + newSecondaryType = createTypeInfo(base.getQName(), typeMap); + typedata.addRelatedType(newSecondaryType); + typedata.setExtensionBaseType(new CElementDecl(newSecondaryType, typeName)); + if (c_verbose) + System.out.print( + "=====complexType with simpleContent is found : " + + type.getQName().getLocalPart() + "=====\n"); + } + else + setRestrictionBaseAndValues(typedata, node); + + // There can be attributes in this extended basic type + Vector attributes = CSchemaUtils.getContainedAttributeTypes(type.getNode(), c_symbolTable); + if (attributes != null) + { + for (int j = 0; j < attributes.size(); j++) + { + CContainedAttribute attr = (CContainedAttribute)attributes.get(j); + newSecondaryType = createTypeInfo(attr.getTypeEntry().getQName(), typeMap); + attr.setType(newSecondaryType); + typedata.addRelatedType(newSecondaryType); + } + typedata.addAttributes(attributes); + } + } + else if (type instanceof CollectionType) + { + newSecondaryType = createTypeInfo(type.getRefType().getQName(), typeMap); + typedata.addRelatedType(newSecondaryType); + typedata.setTypeNameForElementName(new CElementDecl(newSecondaryType, type.getQName())); + typedata.setArray(true); + } + else + { + //is this a SOAPEnc array type + QName arrayType = CSchemaUtils.getArrayComponentQName(node,new IntHolder(0),c_symbolTable); + if (arrayType != null) + { + newSecondaryType = createTypeInfo(arrayType, typeMap); + typedata.addRelatedType(newSecondaryType); + typedata.setTypeNameForElementName(new CElementDecl(newSecondaryType, new QName("item"))); + typedata.setArray(true); + } + else if ((arrayType = CSchemaUtils.getCollectionComponentQName(node)) != null) + { + newSecondaryType = createTypeInfo(arrayType, typeMap); + typedata.addRelatedType(newSecondaryType); + typedata.setTypeNameForElementName(new CElementDecl(newSecondaryType, new QName("item"))); + typedata.setArray(true); + } + //Note in a array the parameter type is stored as under the name item all the time + else + { + // get all extended types + Vector extendList = new Vector(); + extendList.add(type); + + TypeEntry parent = CSchemaUtils.getComplexElementExtensionBase(type.getNode(), c_symbolTable); + while (parent != null) + { + extendList.add(parent); + parent = CSchemaUtils.getComplexElementExtensionBase(parent.getNode(), c_symbolTable); + } + + // Now generate a list of names and types starting with + // the oldest parent. (Attrs are considered before elements). + for (int i = extendList.size() - 1; i >= 0; i--) + { + TypeEntry te = (TypeEntry) extendList.elementAt(i); + + //TODO the code require the attributes name at extension base types + //different, the WSDL2Ws do not support it having same name at up and below. + + // Process the attributes + if (c_verbose) + System.out.println("Processing attributes for type: " + type.getQName()); + + // TODO Need to handle whether attributes are qualified? + Vector attributes = CSchemaUtils.getContainedAttributeTypes(te.getNode(), c_symbolTable); + if (attributes != null) + { + for (int j = 0; j < attributes.size(); j++) + { + CContainedAttribute attr = (CContainedAttribute)attributes.get(j); + newSecondaryType = createTypeInfo(attr.getTypeEntry().getQName(), typeMap); + attr.setType(newSecondaryType); + typedata.addRelatedType(newSecondaryType); + } + typedata.addAttributes(attributes); + } + + // Process the elements + if (c_verbose) + System.out.println("Processing elements for type: " + type.getQName()); + + Vector elements = CSchemaUtils.getContainedElementDeclarations(te.getNode(), c_symbolTable); + if (elements != null) + { + // The following will get elementFormDefault for the schema the element is in. + boolean nsQualifyElementDefault = CSchemaUtils.isElementFormDefaultQualified(te.getNode()); + + // Now process the elements. + for (int j = 0; j < elements.size(); j++) + { + CElementDecl elem = (CElementDecl) elements.get(j); + + // Set whether to namespace qualify or not. We only process if not set. + if (!elem.getNsQualified()) + { + boolean nsQualifyElement = + CSchemaUtils.shouldWeNamespaceQualifyNode(elem.getTypeEntry().getNode(), + nsQualifyElementDefault); + elem.setNsQualified(nsQualifyElement); + } + + if (elem.getAnyElement()) + { + newSecondaryType = new Type(CUtils.anyTypeQname, CUtils.anyTypeQname.getLocalPart()); + } + else + { + QName typeName = elem.getTypeEntry().getQName(); + if (typeName.getLocalPart().indexOf('[') > 0) + { + String localpart = + typeName.getLocalPart().substring(0, typeName.getLocalPart().indexOf('[')); + + typeName = new QName(typeName.getNamespaceURI(), localpart); + + if (CUtils.isBasicType(typeName)) + newSecondaryType = createTypeInfo(typeName, typeMap); + else + newSecondaryType = createTypeInfo(elem.getTypeEntry(), typeMap); + } + else + newSecondaryType = createTypeInfo(typeName, typeMap); + } + + typedata.addRelatedType(newSecondaryType); + elem.setType(newSecondaryType); + + typedata.setTypeNameForElementName(elem); + } + } + } // for-loop + } + } + return typedata; + } + + /** * If the specified node represents a supported JAX-RPC restriction, * a Vector is returned which contains the base type and the values (enumerations etc). * The first element in the vector is the base type (an TypeEntry). @@ -317,7 +750,7 @@ * NEEDS WORK - CURRENTLY THE ONLY THING WE DO IS GENERATE ENUMERATOR CONSTANTS AND CREATE * AN EMPTY RESTRICTOR FUNCTION WHEN DOING CODE GENERATION STEP. */ - public void setRestrictionBaseAndValues(Type typedata, Node node) + private void setRestrictionBaseAndValues(Type typedata, Node node) { if (node == null) return; @@ -515,122 +948,29 @@ } } return; - } + } /** - * Returns list of Port objects in a service definition based on selection criteria. - * - * @param s service definition. - * @param styleDocument true=return document style; false=return "rpc" style. - * This parameter is ignored for REST (HTTP) bindings. - * @param soap11 true=return SOAP 1.1 bindings; false=SOAP 1.1 bindings are ignored. - * @param soap12 true=return SOAP 1.2 bindings; false=SOAP 1.2 bindings are ignored. - * @param rest true=return HTTP bindings; false=ignore HTTP bindings. - * @return List of ports that match selection criteria. - * @throws Exception + * Work out the various conditions that dictate whether this type will be generated into a new + * file or not. + * This method is only very partially implemented. + * + * @param type + * @param typedata + * @return true if the type will not be generated. False otherwise */ - private ArrayList getServicePorts(Service s, - boolean styleDocument, - boolean soap11, - boolean soap12, - boolean rest) throws Exception - { - ArrayList a = new ArrayList(); - - if (s == null) - return a; - - Iterator ports = s.getPorts().values().iterator(); - while (ports.hasNext()) - { - Port p = (Port) ports.next(); - Binding b = p.getBinding(); - BindingEntry be = c_symbolTable.getBindingEntry(b.getQName()); - if (b == null || be == null) - throw new WrapperFault("No binding exists for port '" + p.getName() + "'."); - - if ((be.getBindingType() == BindingEntry.TYPE_SOAP) && (soap11 || soap12)) - { - String style = be.getBindingStyle().getName(); - if (style == null) - style = "rpc"; // TODO need to revisit. - - if ((styleDocument && style.equalsIgnoreCase("document")) - || (!styleDocument && style.equalsIgnoreCase("rpc"))) - { - String ns = Constants.URI_WSDL11_SOAP; - SOAPBinding soapbinding = (SOAPBinding)getExtensibilityElement(b, INSTANCEOF_SOAPBINDING); - if (soapbinding != null && null != soapbinding.getElementType().getNamespaceURI()) - ns = soapbinding.getElementType().getNamespaceURI(); - - if ((soap11 && ns.equals(Constants.URI_WSDL11_SOAP)) - || (soap12 && ns.equals(Constants.URI_WSDL12_SOAP))) - a.add(p); - } - } - else if (rest && (be.getBindingType() == BindingEntry.TYPE_HTTP_GET - || be.getBindingType() == BindingEntry.TYPE_HTTP_POST)) - { - a.add(p); - } - } - - return a; - } - - /** - * Collects all the information by the wsdl2ws tool. - */ - private void processWSDLDocument() throws Exception - { - // Get target name space of WSDL - c_targetNameSpaceOfWSDL = c_symbolTable.getDefinition().getTargetNamespace(); - - // Collect services and bindings. - Iterator it = c_symbolTable.getHashMap().values().iterator(); - while (it.hasNext()) - { - Vector v = (Vector) it.next(); - for (int i = 0; i < v.size(); ++i) - { - SymTabEntry entry = (SymTabEntry) v.elementAt(i); - - if (entry instanceof org.apache.axis.wsdl.symbolTable.ServiceEntry) - c_services.add(((ServiceEntry) entry).getService()); - else if (entry instanceof org.apache.axis.wsdl.symbolTable.BindingEntry) - c_bindings.add(entry); - } - } - } - - /** - * Helper function that returns requested extensibility element. - * - * @param e element to retrieve extensibility elements from. - * @param clazz instance of class - * @return extensibility element. - */ - private static Object getExtensibilityElement(WSDLElement e, int clazz) + private boolean isTypeGenerated(TypeEntry type, Type typedata) { - if (e != null) - { - List extElems = e.getExtensibilityElements(); - if (extElems != null) - { - Iterator it = extElems.iterator(); - - while (it.hasNext()) - { - Object o = it.next(); - if ((clazz == INSTANCEOF_SOAPBINDING && (o instanceof javax.wsdl.extensions.soap.SOAPBinding)) - || (clazz == INSTANCEOF_SOAPADDRESS && (o instanceof javax.wsdl.extensions.soap.SOAPAddress)) - || (clazz == INSTANCEOF_SOAPOPERATION && (o instanceof javax.wsdl.extensions.soap.SOAPOperation)) - || (clazz == INSTANCEOF_SOAPBODY && (o instanceof javax.wsdl.extensions.soap.SOAPBody))) - return o; - } - } - } + // If the referenced type is actually a type that will not get generated because it's + // a base type array then tell other people of this case. Do this to two levels of indirection - return null; + if(type.getRefType()!=null) + if(type.getRefType().getRefType()!=null && type.getRefType().getRefType().isBaseType()) + return false; + + if (typedata.isAnonymous()) + return false; + else + return true; } }