src/share/jaxws_classes/com/sun/tools/internal/xjc/model/CTypeRef.java

Print this page

        

@@ -23,19 +23,21 @@
  * questions.
  */
 
 package com.sun.tools.internal.xjc.model;
 
+import javax.xml.XMLConstants;
 import javax.xml.bind.annotation.adapters.XmlJavaTypeAdapter;
 import javax.xml.namespace.QName;
 
 import com.sun.tools.internal.xjc.model.nav.NClass;
 import com.sun.tools.internal.xjc.model.nav.NType;
 import com.sun.tools.internal.xjc.reader.xmlschema.BGMBuilder;
 import com.sun.xml.internal.bind.v2.model.core.PropertyInfo;
 import com.sun.xml.internal.bind.v2.model.core.TypeRef;
 import com.sun.xml.internal.bind.v2.runtime.RuntimeUtil;
+import com.sun.xml.internal.xsom.XSType;
 import com.sun.xml.internal.xsom.XmlString;
 import com.sun.xml.internal.xsom.XSElementDecl;
 import com.sun.istack.internal.Nullable;
 
 /**

@@ -72,15 +74,38 @@
     public QName getTypeName() {
         return typeName;
     }
 
     public static QName getSimpleTypeName(XSElementDecl decl) {
-        if(decl==null)  return null;
-        QName typeName = null;
-        if(decl.getType().isSimpleType())
-            typeName = BGMBuilder.getName(decl.getType());
-        return typeName;
+        if(decl==null || !decl.getType().isSimpleType())
+            return null; // null if not simple type
+        return resolveSimpleTypeName(decl.getType());
+    }
+
+    /**
+     * Recursively search for type name.
+     *
+     * This is needed to find correct type for refs like:
+     *
+     *<xs:simpleType name="parent">
+     *  <xs:restriction base="xs:date"/>
+     *</xs:simpleType>
+     *<xs:simpleType name="child">
+     *  <xs:restriction base="parent"/>
+     *</xs:simpleType>
+     *
+     *<xs:element name="testField" type="child"/>
+     *
+     * @param declType given type
+     * @return simpleTypeName or null
+     */
+    private static QName resolveSimpleTypeName(XSType declType) {
+        QName name = BGMBuilder.getName(declType);
+        if (name != null && !XMLConstants.W3C_XML_SCHEMA_NS_URI.equals(name.getNamespaceURI()))
+            return resolveSimpleTypeName(declType.getBaseType());
+        else
+            return name;
     }
 
     public CTypeRef(CNonElement type, QName elementName, QName typeName, boolean nillable, XmlString defaultValue) {
         assert type!=null;
         assert elementName!=null;