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 1999, 2000 (C) Intalio, Inc. All Rights Reserved.
042: *
043: * $Id: DefaultNaming.java 6784 2007-01-29 03:29:17Z ekuns $
044: */
045: package org.exolab.castor.xml.util;
046:
047: import org.exolab.castor.xml.XMLNaming;
048:
049: /**
050: * The default implementation of org.exolab.castor.xml.Naming
051: * @author <a href="mailto:kvisco@intalio.com">Keith Visco</a>
052: * @version $Revision: 6784 $ $Date: 2003-03-03 00:05:44 -0700 (Mon, 03 Mar 2003) $
053: */
054: public final class DefaultNaming extends XMLNaming {
055:
056: /**
057: * The lower case style with hyphens to separate words. <I>Default</I>
058: * <BR />
059: * <B>examples:</B><BR />
060: * "Blob" becomes "blob" and "DataSource" becomes "data-source".
061: */
062: public static final short LOWER_CASE_STYLE = 0;
063:
064: /**
065: * The mixed case style with uppercase characters to separate words. <BR>
066: * <B>examples:</B><BR>
067: * "Blob" becomes "blob" and "DataSource" becomes "dataSource".
068: */
069: public static final short MIXED_CASE_STYLE = 1;
070:
071: private static short _style = LOWER_CASE_STYLE;
072:
073: /**
074: * Creates a new DefaultNaming
075: */
076: public DefaultNaming() {
077: super ();
078: } //-- DefaultNaming
079:
080: /**
081: * Sets the style for this DefaultNaming.
082: * Valid options are as follows
083: * <pre>
084: * DefaultNaming.LOWER_CASE_STYLE
085: * DefaultNaming.MIXED_CASE_STYLE
086: * </pre>
087: * @param style the style to use
088: */
089: public void setStyle(final short style) {
090: switch (style) {
091: case MIXED_CASE_STYLE:
092: case LOWER_CASE_STYLE:
093: _style = style;
094: break;
095: default:
096: throw new IllegalArgumentException(
097: "Invalid option for DefaultNaming#setStyle.");
098: }
099: } //-- setStyle
100:
101: /**
102: * Creates the XML Name for the given class. It would be nearly impossible
103: * for this method to please every one, so I picked common "de-facto" XML
104: * naming conventions. This can be overridden by either extending
105: * org.exolab.castor.xml.Naming and implementing the proper methods, or by
106: * ClassDescriptors for your classes.
107: *
108: * @param c the Class to create the XML Name for
109: * @return the xml name representation of the given String <BR>
110: * <B>examples:</B><BR>
111: * "Blob" becomes "blob" and "DataSource" becomes "data-source".
112: * @see org.exolab.castor.xml.XMLNaming
113: */
114: public String createXMLName(final Class c) {
115: //-- create default XML name
116: String name = c.getName();
117: int idx = name.lastIndexOf('.');
118: if (idx >= 0) {
119: name = name.substring(idx + 1);
120: }
121: return toXMLName(name);
122: } //-- createXMLName
123:
124: /**
125: * Converts the given name to an XML name. It would be nearly impossible for
126: * this method to please every one, so I picked common "de-facto" XML naming
127: * conventions. This can be overridden by either extending
128: * org.exolab.castor.xml.Naming and implementing the proper methods, or by
129: * ClassDescriptors for your classes.
130: *
131: * @param name the String to convert to an XML name
132: * @return the xml name representation of the given String <BR>
133: * <B>examples:</B><BR>
134: * "Blob" becomes "blob" and "DataSource" becomes "data-source".
135: * @see org.exolab.castor.xml.XMLNaming
136: */
137: public String toXMLName(final String name) {
138: if (name == null) {
139: return null;
140: }
141: if (name.length() == 0) {
142: return name;
143: }
144: if (name.length() == 1) {
145: return name.toLowerCase();
146: }
147:
148: //-- Follow the Java beans Introspector::decapitalize
149: //-- convention by leaving alone String that start with
150: //-- 2 uppercase characters.
151: if (Character.isUpperCase(name.charAt(0))
152: && Character.isUpperCase(name.charAt(1))) {
153: return name;
154: }
155:
156: //-- process each character
157: StringBuffer cbuff = new StringBuffer(name);
158: cbuff.setCharAt(0, Character.toLowerCase(cbuff.charAt(0)));
159:
160: boolean ucPrev = false;
161: for (int i = 1; i < cbuff.length(); i++) {
162: char ch = cbuff.charAt(i);
163: if (Character.isUpperCase(ch)) {
164: if (ucPrev) {
165: continue;
166: }
167: ucPrev = true;
168: if (_style == LOWER_CASE_STYLE) {
169: cbuff.insert(i, '-');
170: ++i;
171: cbuff.setCharAt(i, Character.toLowerCase(ch));
172: } else {
173: ++i;
174: }
175: } else if (ch == '.') {
176: //-- do not add '-' if preceeded by '.'
177: ucPrev = true;
178: } else {
179: ucPrev = false;
180: }
181: }
182: return cbuff.toString();
183: } //-- toXMLName
184:
185: } //-- Naming
|