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

Wed, 27 Apr 2016 01:27:09 +0800

author
aoqi
date
Wed, 27 Apr 2016 01:27:09 +0800
changeset 0
373ffda63c9a
permissions
-rw-r--r--

Initial load
http://hg.openjdk.java.net/jdk8u/jdk8u/jaxws/
changeset: 657:d47a47f961ee
tag: jdk8u25-b17

     1 /*
     2  * Copyright (c) 1997, 2011, Oracle and/or its affiliates. All rights reserved.
     3  * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
     4  *
     5  * This code is free software; you can redistribute it and/or modify it
     6  * under the terms of the GNU General Public License version 2 only, as
     7  * published by the Free Software Foundation.  Oracle designates this
     8  * particular file as subject to the "Classpath" exception as provided
     9  * by Oracle in the LICENSE file that accompanied this code.
    10  *
    11  * This code is distributed in the hope that it will be useful, but WITHOUT
    12  * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
    13  * FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
    14  * version 2 for more details (a copy is included in the LICENSE file that
    15  * accompanied this code).
    16  *
    17  * You should have received a copy of the GNU General Public License version
    18  * 2 along with this work; if not, write to the Free Software Foundation,
    19  * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
    20  *
    21  * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
    22  * or visit www.oracle.com if you need additional information or have any
    23  * questions.
    24  */
    26 package com.sun.tools.internal.xjc.model;
    28 import java.util.Collection;
    30 import javax.activation.MimeType;
    31 import javax.xml.namespace.QName;
    33 import com.sun.codemodel.internal.JClass;
    34 import com.sun.codemodel.internal.JExpression;
    35 import com.sun.tools.internal.xjc.model.nav.NClass;
    36 import com.sun.tools.internal.xjc.model.nav.NType;
    37 import com.sun.tools.internal.xjc.outline.Aspect;
    38 import com.sun.tools.internal.xjc.outline.Outline;
    39 import com.sun.xml.internal.bind.v2.model.annotation.Locatable;
    40 import com.sun.xml.internal.bind.v2.model.core.EnumLeafInfo;
    41 import com.sun.xml.internal.bind.v2.model.core.ID;
    42 import com.sun.xml.internal.bind.v2.model.core.NonElement;
    43 import com.sun.xml.internal.bind.v2.model.core.Element;
    44 import com.sun.xml.internal.bind.v2.runtime.Location;
    45 import com.sun.xml.internal.xsom.XSComponent;
    46 import com.sun.xml.internal.xsom.XmlString;
    48 import org.xml.sax.Locator;
    50 /**
    51  * Transducer that converts a string into an "enumeration class."
    52  *
    53  * The structure of the generated class needs to precisely
    54  * follow the JAXB spec.
    55  *
    56  * @author
    57  *    <a href="mailto:kohsuke.kawaguchi@sun.com">Kohsuke KAWAGUCHI</a>
    58  */
    59 public final class CEnumLeafInfo implements EnumLeafInfo<NType,NClass>, NClass, CNonElement
    60 {
    61     /**
    62      * The {@link Model} object to which this bean belongs.
    63      */
    64     public final Model model;
    66     /**
    67      * The parent into which the enum class should be generated.
    68      */
    69     public final CClassInfoParent parent;
    71     /**
    72      * Short name of the generated type-safe enum.
    73      */
    74     public final String shortName;
    76     private final QName typeName;
    78     private final XSComponent source;
    80     /**
    81      * Represents the underlying type of this enumeration
    82      * and its conversion.
    83      *
    84      * <p>
    85      * To parse XML into a constant, we use the base type
    86      * to do lexical -> value, then use a map to pick up the right one.
    87      *
    88      * <p>
    89      * Hence this also represents the type of the Java value.
    90      * For example, if this is an enumeration of xs:int,
    91      * then this field will be Java int.
    92      */
    93     public final CNonElement base;
    96     /**
    97      * List of enum members.
    98      */
    99     public final Collection<CEnumConstant> members;
   101     private final CCustomizations customizations;
   103     /**
   104      * @see #getLocator()
   105      */
   106     private final Locator sourceLocator;
   108     public String javadoc;
   110     public CEnumLeafInfo(Model model,
   111                          QName typeName,
   112                          CClassInfoParent container,
   113                          String shortName,
   114                          CNonElement base,
   115                          Collection<CEnumConstant> _members,
   116                          XSComponent source,
   117                          CCustomizations customizations,
   118                          Locator _sourceLocator) {
   119         this.model = model;
   120         this.parent = container;
   121         this.shortName = model.allocator.assignClassName(parent,shortName);
   122         this.base = base;
   123         this.members = _members;
   124         this.source = source;
   125         if(customizations==null)
   126             customizations = CCustomizations.EMPTY;
   127         this.customizations = customizations;
   128         this.sourceLocator = _sourceLocator;
   129         this.typeName = typeName;
   131         for( CEnumConstant mem : members )
   132             mem.setParent(this);
   134         model.add(this);
   136         // TODO: can we take advantage of the fact that enum can be XmlRootElement?
   137     }
   139     /**
   140      * Source line information that points to the place
   141      * where this type-safe enum is defined.
   142      * Used to report error messages.
   143      */
   144     public Locator getLocator() {
   145         return sourceLocator;
   146     }
   148     public QName getTypeName() {
   149         return typeName;
   150     }
   152     public NType getType() {
   153         return this;
   154     }
   156     /**
   157      * @deprecated
   158      *      why are you calling the method whose return value is known?
   159      */
   160     public boolean canBeReferencedByIDREF() {
   161         return false;
   162     }
   164     public boolean isElement() {
   165         return false;
   166     }
   168     public QName getElementName() {
   169         return null;
   170     }
   172     public Element<NType,NClass> asElement() {
   173         return null;
   174     }
   176     public NClass getClazz() {
   177         return this;
   178     }
   180     public XSComponent getSchemaComponent() {
   181         return source;
   182     }
   184     public JClass toType(Outline o, Aspect aspect) {
   185         return o.getEnum(this).clazz;
   186     }
   188     public boolean isAbstract() {
   189         return false;
   190     }
   192     public boolean isBoxedType() {
   193         return false;
   194     }
   196     public String fullName() {
   197         return parent.fullName()+'.'+shortName;
   198     }
   200     public boolean isPrimitive() {
   201         return false;
   202     }
   204     public boolean isSimpleType() {
   205         return true;
   206     }
   209     /**
   210      * The spec says the value field in the enum class will be generated
   211      * only under certain circumstances.
   212      *
   213      * @return
   214      *      true if the generated enum class should have the value field.
   215      */
   216     public boolean needsValueField() {
   217         for (CEnumConstant cec : members) {
   218             if(!cec.getName().equals(cec.getLexicalValue()))
   219                 return true;
   220         }
   221         return false;
   222     }
   224     public JExpression createConstant(Outline outline, XmlString literal) {
   225         // correctly identifying which constant it maps to is hard, so
   226         // here I'm cheating
   227         JClass type = toType(outline,Aspect.EXPOSED);
   228         for (CEnumConstant mem : members) {
   229             if(mem.getLexicalValue().equals(literal.value))
   230                 return type.staticRef(mem.getName());
   231         }
   232         return null;
   233     }
   235     @Deprecated
   236     public boolean isCollection() {
   237         return false;
   238     }
   240     @Deprecated
   241     public CAdapter getAdapterUse() {
   242         return null;
   243     }
   245     @Deprecated
   246     public CNonElement getInfo() {
   247         return this;
   248     }
   250     public ID idUse() {
   251         return ID.NONE;
   252     }
   254     public MimeType getExpectedMimeType() {
   255         return null;
   256     }
   258     public Collection<CEnumConstant> getConstants() {
   259         return members;
   260     }
   262     public NonElement<NType,NClass> getBaseType() {
   263         return base;
   264     }
   266     public CCustomizations getCustomizations() {
   267         return customizations;
   268     }
   270     public Locatable getUpstream() {
   271         throw new UnsupportedOperationException();
   272     }
   274     public Location getLocation() {
   275         throw new UnsupportedOperationException();
   276     }
   277 }

mercurial