diff -r 000000000000 -r 373ffda63c9a src/share/jaxws_classes/com/sun/tools/internal/xjc/model/CTypeRef.java --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/src/share/jaxws_classes/com/sun/tools/internal/xjc/model/CTypeRef.java Wed Apr 27 01:27:09 2016 +0800 @@ -0,0 +1,154 @@ +/* + * Copyright (c) 1997, 2011, Oracle and/or its affiliates. All rights reserved. + * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. + * + * This code is free software; you can redistribute it and/or modify it + * under the terms of the GNU General Public License version 2 only, as + * published by the Free Software Foundation. Oracle designates this + * particular file as subject to the "Classpath" exception as provided + * by Oracle in the LICENSE file that accompanied this code. + * + * This code is distributed in the hope that it will be useful, but WITHOUT + * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or + * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License + * version 2 for more details (a copy is included in the LICENSE file that + * accompanied this code). + * + * You should have received a copy of the GNU General Public License version + * 2 along with this work; if not, write to the Free Software Foundation, + * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. + * + * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA + * or visit www.oracle.com if you need additional information or have any + * 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; + +/** + * {@link TypeRef} for XJC. + * + * TODO: do we need the source schema component support here? + * + * @author Kohsuke Kawaguchi + */ +public final class CTypeRef implements TypeRef { + /** + * In-memory type. + * + * This is the type used when + */ + @XmlJavaTypeAdapter(RuntimeUtil.ToStringAdapter.class) + private final CNonElement type; + + private final QName elementName; + + /** + * XML Schema type name of {@link #type}, if available. + */ + /*package*/ final @Nullable QName typeName; + + private final boolean nillable; + public final XmlString defaultValue; + + public CTypeRef(CNonElement type, XSElementDecl decl) { + this(type, BGMBuilder.getName(decl),getSimpleTypeName(decl), decl.isNillable(), decl.getDefaultValue() ); + + } + + public QName getTypeName() { + return typeName; + } + + public static QName getSimpleTypeName(XSElementDecl decl) { + 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: + * + * + * + * + * + * + * + * + * + * + * @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; + + this.type = type; + this.elementName = elementName; + this.typeName = typeName; + this.nillable = nillable; + this.defaultValue = defaultValue; + } + + public CNonElement getTarget() { + return type; + } + + public QName getTagName() { + return elementName; + } + + public boolean isNillable() { + return nillable; + } + + /** + * Inside XJC, use {@link #defaultValue} that has context information. + * This method is to override the one defined in the runtime model. + * + * @see #defaultValue + */ + public String getDefaultValue() { + if(defaultValue!=null) + return defaultValue.value; + else + return null; + } + + public boolean isLeaf() { + // TODO: implement this method later + throw new UnsupportedOperationException(); + } + + public PropertyInfo getSource() { + // TODO: implement this method later + throw new UnsupportedOperationException(); + } +}