View Javadoc
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   */
25  
26  package com.sun.tools.internal.xjc.reader.xmlschema.bindinfo;
27  
28  import javax.xml.bind.annotation.XmlAttribute;
29  import javax.xml.bind.annotation.XmlElement;
30  import javax.xml.bind.annotation.XmlRootElement;
31  import javax.xml.bind.annotation.XmlType;
32  import javax.xml.namespace.QName;
33  
34  import com.sun.tools.internal.xjc.reader.Const;
35  import com.sun.xml.internal.xsom.XSAttributeDecl;
36  import com.sun.xml.internal.xsom.XSComponent;
37  import com.sun.xml.internal.xsom.XSElementDecl;
38  import com.sun.xml.internal.xsom.XSModelGroup;
39  import com.sun.xml.internal.xsom.XSModelGroupDecl;
40  import com.sun.xml.internal.xsom.XSType;
41  
42  /**
43   * Schema-wide binding customization.
44   *
45   * @author
46   *  Kohsuke Kawaguchi (kohsuke.kawaguchi@sun.com)
47   */
48  @XmlRootElement(name="schemaBindings")
49  public final class BISchemaBinding extends AbstractDeclarationImpl {
50  
51      /**
52       * Name conversion rules. All defaults to {@link BISchemaBinding#defaultNamingRule}.
53       */
54      @XmlType(propOrder={})
55      private static final class NameRules {
56          @XmlElement
57          NamingRule typeName = defaultNamingRule;
58          @XmlElement
59          NamingRule elementName = defaultNamingRule;
60          @XmlElement
61          NamingRule attributeName = defaultNamingRule;
62          @XmlElement
63          NamingRule modelGroupName = defaultNamingRule;
64          @XmlElement
65          NamingRule anonymousTypeName = defaultNamingRule;
66      }
67  
68      @XmlElement
69      private NameRules nameXmlTransform = new NameRules();
70  
71      private static final class PackageInfo {
72          @XmlAttribute
73          String name;
74          @XmlElement
75          String javadoc;
76      }
77  
78      @XmlElement(name="package")
79      private PackageInfo packageInfo = new PackageInfo();
80  
81      /**
82       * If false, it means not to generate any classes from this namespace.
83       * No ObjectFactory, no classes (the only way to bind them is by using
84       * <jaxb:class ref="..."/>)
85       */
86      @XmlAttribute(name="map")
87      public boolean map = true;
88  
89      /**
90       * Default naming rule, that doesn't change the name.
91       */
92      private static final NamingRule defaultNamingRule = new NamingRule("","");
93  
94  
95      /**
96       * Default naming rules of the generated interfaces.
97       *
98       * It simply adds prefix and suffix to the name, but
99       * the caller shouldn't care how the name mangling is
100      * done.
101      */
102     public static final class NamingRule {
103         @XmlAttribute
104         private String prefix = "";
105         @XmlAttribute
106         private String suffix = "";
107 
108         public NamingRule( String _prefix, String _suffix ) {
109             this.prefix = _prefix;
110             this.suffix = _suffix;
111         }
112 
113         public NamingRule() {
114         }
115 
116         /** Changes the name according to the rule. */
117         public String mangle( String originalName ) {
118             return prefix+originalName+suffix;
119         }
120     }
121 
122     /**
123      * Transforms the default name produced from XML name
124      * by following the customization.
125      *
126      * This shouldn't be applied to a class name specified
127      * by a customization.
128      *
129      * @param cmp
130      *      The schema component from which the default name is derived.
131      */
132     public String mangleClassName( String name, XSComponent cmp ) {
133         if( cmp instanceof XSType )
134             return nameXmlTransform.typeName.mangle(name);
135         if( cmp instanceof XSElementDecl )
136             return nameXmlTransform.elementName.mangle(name);
137         if( cmp instanceof XSAttributeDecl )
138             return nameXmlTransform.attributeName.mangle(name);
139         if( cmp instanceof XSModelGroup || cmp instanceof XSModelGroupDecl )
140             return nameXmlTransform.modelGroupName.mangle(name);
141 
142         // otherwise no modification
143         return name;
144     }
145 
146     public String mangleAnonymousTypeClassName( String name ) {
147         return nameXmlTransform.anonymousTypeName.mangle(name);
148     }
149 
150 
151     public String getPackageName() { return packageInfo.name; }
152 
153     public String getJavadoc() { return packageInfo.javadoc; }
154 
155     public QName getName() { return NAME; }
156     public static final QName NAME = new QName(
157         Const.JAXB_NSURI, "schemaBinding" );
158 }