1 /*
   2  * Copyright (c) 1997, 2015, 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  */
  25 
  26 package com.sun.tools.internal.xjc.reader.dtd.bindinfo;
  27 
  28 import java.util.ArrayList;
  29 import java.util.List;
  30 import java.util.StringTokenizer;
  31 
  32 import com.sun.tools.internal.xjc.model.CBuiltinLeafInfo;
  33 import com.sun.tools.internal.xjc.model.CClassInfoParent;
  34 import com.sun.tools.internal.xjc.model.CEnumConstant;
  35 import com.sun.tools.internal.xjc.model.CEnumLeafInfo;
  36 import com.sun.tools.internal.xjc.model.Model;
  37 import com.sun.tools.internal.xjc.model.TypeUse;
  38 
  39 import org.w3c.dom.Element;
  40 
  41 /**
  42  * {@code <enumeration>} declaration in the binding file.
  43  */
  44 public final class BIEnumeration implements BIConversion
  45 {
  46     /** Creates an object from {@code <enumeration>} declaration. */
  47     private BIEnumeration( Element _e, TypeUse _xducer ) {
  48         this.e = _e;
  49         this.xducer = _xducer;
  50     }
  51 
  52     /** {@code <enumeration>} element in DOM. */
  53     private final Element e;
  54 
  55     private final TypeUse xducer;
  56 
  57     public String name() { return DOMUtil.getAttribute(e,"name"); }
  58 
  59     /** Returns a transducer for this enumeration declaration. */
  60     public TypeUse getTransducer() { return xducer; }
  61 
  62 
  63 
  64 
  65     /** Creates a global enumeration declaration. */
  66     static BIEnumeration create( Element dom, BindInfo parent ) {
  67         // create a class in the target package.
  68         return new BIEnumeration(
  69             dom,
  70             new CEnumLeafInfo(
  71                 parent.model,
  72                 null,
  73                 new CClassInfoParent.Package(parent.getTargetPackage()),
  74                 DOMUtil.getAttribute(dom,"name"),
  75                 CBuiltinLeafInfo.STRING,
  76                 buildMemberList(parent.model,dom),
  77                 null, null/*TODO*/,
  78                 DOMLocator.getLocationInfo(dom)));
  79     }
  80 
  81     /** Creates an element-local enumeration declaration. */
  82     static BIEnumeration create( Element dom, BIElement parent ) {
  83         // create a class as a nested class
  84         return new BIEnumeration(
  85             dom,
  86             new CEnumLeafInfo(
  87                 parent.parent.model,
  88                 null,
  89                 parent.clazz,
  90                 DOMUtil.getAttribute(dom,"name"),
  91                 CBuiltinLeafInfo.STRING,
  92                 buildMemberList(parent.parent.model,dom),
  93                 null, null/*TODO*/,
  94                 DOMLocator.getLocationInfo(dom) ));
  95     }
  96 
  97     private static List<CEnumConstant> buildMemberList( Model model, Element dom ) {
  98         List<CEnumConstant> r = new ArrayList<CEnumConstant>();
  99 
 100         String members = DOMUtil.getAttribute(dom,"members");
 101         if(members==null) members="";   // TODO: error handling
 102 
 103         StringTokenizer tokens = new StringTokenizer(members);
 104         while(tokens.hasMoreTokens()) {
 105             String token = tokens.nextToken();
 106             r.add(new CEnumConstant(model.getNameConverter().toConstantName(token),
 107                     null,token,null/*TODO*/,null,null));
 108         }
 109 
 110         return r;
 111     }
 112 }