001: /*
002: * Redistribution and use of this software and associated documentation
003: * ("Software"), with or without modification, are permitted provided
004: * that the following conditions are met:
005: *
006: * 1. Redistributions of source code must retain copyright
007: * statements and notices. Redistributions must also contain a
008: * copy of this document.
009: *
010: * 2. Redistributions in binary form must reproduce the
011: * above copyright notice, this list of conditions and the
012: * following disclaimer in the documentation and/or other
013: * materials provided with the distribution.
014: *
015: * 3. The name "Exolab" must not be used to endorse or promote
016: * products derived from this Software without prior written
017: * permission of Intalio, Inc. For written permission,
018: * please contact info@exolab.org.
019: *
020: * 4. Products derived from this Software may not be called "Exolab"
021: * nor may "Exolab" appear in their names without prior written
022: * permission of Intalio, Inc. Exolab is a registered
023: * trademark of Intalio, Inc.
024: *
025: * 5. Due credit should be given to the Exolab Project
026: * (http://www.exolab.org/).
027: *
028: * THIS SOFTWARE IS PROVIDED BY INTALIO, INC. AND CONTRIBUTORS
029: * ``AS IS'' AND ANY EXPRESSED OR IMPLIED WARRANTIES, INCLUDING, BUT
030: * NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND
031: * FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL
032: * INTALIO, INC. OR ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT,
033: * INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
034: * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR
035: * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
036: * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT,
037: * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
038: * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED
039: * OF THE POSSIBILITY OF SUCH DAMAGE.
040: *
041: * Copyright 2001 (C) Intalio, Inc. All Rights Reserved.
042: *
043: * $Id: GroupNaming.java 6678 2007-01-02 17:09:52Z rjoachim $
044: */
045: package org.exolab.castor.builder;
046:
047: import java.util.Hashtable;
048:
049: import org.exolab.castor.xml.JavaNaming;
050: import org.exolab.castor.xml.schema.ComplexType;
051: import org.exolab.castor.xml.schema.ElementDecl;
052: import org.exolab.castor.xml.schema.Group;
053: import org.exolab.castor.xml.schema.ModelGroup;
054: import org.exolab.castor.xml.schema.Structure;
055:
056: /***
057: * A simple class used for creating class names for unnamed Groups in XML Schema.
058: *
059: * @author <a href="mailto:kvisco@intalio.com">Keith Visco</a>
060: * @version $Revision: 6678 $ $Date: 2006-04-25 15:08:23 -0600 (Tue, 25 Apr 2006) $
061: */
062: public final class GroupNaming {
063:
064: /**
065: * A HashTable of HashTables that keeps track of group names for each
066: * package.
067: */
068: private Hashtable _packageGroupNames = null;
069:
070: /**
071: * Creates a new GroupNaming.
072: */
073: public GroupNaming() {
074: _packageGroupNames = new Hashtable();
075: } //-- GroupNaming
076:
077: /**
078: * Returns the qualified group name for a given Group instance and a package
079: * name; null if there isn't one already.
080: *
081: * @param group A Group instance
082: * @param packageName A package name
083: * @return The fully qualified group name for the Group instance/package
084: * name combination
085: */
086: private String getGroupName(final Group group,
087: final String packageName) {
088: Hashtable groupNames = (Hashtable) _packageGroupNames
089: .get(packageName);
090: if (groupNames == null) {
091: return null;
092: }
093: return (String) groupNames.get(group);
094: }
095:
096: /**
097: * Sets the qualified group name for a given Group instance and package
098: * name.
099: *
100: * @param group A Group instance
101: * @param packageName A package name
102: * @param name The fully qualified group name for the Group instance/package
103: * name combination
104: */
105: private void putGroupName(final Group group,
106: final String packageName, final String name) {
107: Hashtable groupNames = (Hashtable) _packageGroupNames
108: .get(packageName);
109: if (groupNames == null) {
110: groupNames = new Hashtable();
111: _packageGroupNames.put(packageName, groupNames);
112: }
113: groupNames.put(group, name);
114: }
115:
116: /**
117: * Checks whether for a given group and package name combination an entry
118: * already exists.
119: *
120: * @param packageName A package name
121: * @param name A group name.
122: * @return True if a mapping already exists
123: */
124: private boolean containsGroupName(final String packageName,
125: final String name) {
126: Hashtable groupNames = (Hashtable) _packageGroupNames
127: .get(packageName);
128: if (groupNames == null) {
129: return false;
130: }
131: return groupNames.contains(name);
132: }
133:
134: /**
135: * Creates a class name for the given Group. A null value will be returned
136: * if a name cannot be created for the group.
137: *
138: * @param group the group to create a class name for
139: * @param packageName the package name for this group
140: * @return the class name for the given Group.
141: */
142: public String createClassName(final Group group,
143: final String packageName) {
144: String name = group.getName();
145: if (name != null) {
146: return JavaNaming.toJavaClassName(name);
147: }
148: name = getGroupName(group, packageName);
149: if (name != null) {
150: return name;
151: }
152:
153: Structure parent = group.getParent();
154: if (parent == null) {
155: return null;
156: }
157:
158: boolean addOrder = true;
159: switch (parent.getStructureType()) {
160: case Structure.GROUP:
161: name = createClassName((Group) parent, packageName);
162: break;
163: case Structure.MODELGROUP:
164: name = ((ModelGroup) parent).getName();
165: name = JavaNaming.toJavaClassName(name);
166: addOrder = false;
167: break;
168: case Structure.COMPLEX_TYPE:
169: name = getClassName((ComplexType) parent);
170: addOrder = false;
171: break;
172: default:
173: break;
174: }
175:
176: if (name != null) {
177: if (addOrder) {
178: String order = group.getOrder().toString();
179: name += JavaNaming.toJavaClassName(order);
180: }
181:
182: int count = 2;
183: String tmpName = name;
184: while (containsGroupName(packageName, name)) {
185: name = tmpName + count;
186: ++count;
187: }
188: putGroupName(group, packageName, name);
189: }
190: return name;
191: } //-- createClassName
192:
193: /**
194: * Returns the class name for the given ComplexType.
195: * <p>
196: * If the ComplexType instance is named, simply return the name of the
197: * ComplexType.
198: * <p>
199: * If it is not named (in other words, if it is an anonymous ComplexType
200: * definition), check for the name of the containing element (definition).
201: *
202: * @param complexType the ComplexType for which to return a class name
203: * @return the class name for the given ComplexType
204: */
205: private static String getClassName(final ComplexType complexType) {
206: //-- if complexType has name, simply return it
207: String name = complexType.getName();
208: if (name != null) {
209: return JavaNaming.toJavaClassName(name);
210: }
211:
212: //-- otherwise get name of containing element
213: Structure parent = complexType.getParent();
214: if (parent != null
215: && parent.getStructureType() == Structure.ELEMENT) {
216: name = ((ElementDecl) parent).getName();
217: }
218:
219: if (name != null) {
220: name = JavaNaming.toJavaClassName(name);
221: }
222: return name;
223: } //-- getName
224:
225: } //-- class GroupNaming
|