1 /*
2 * $Header: /home/cvs/jakarta-commons/betwixt/src/java/org/apache/commons/betwixt/strategy/HyphenatedNameMapper.java,v 1.6 2003/01/06 22:50:45 rdonkin Exp $
3 * $Revision: 1.6 $
4 * $Date: 2003/01/06 22:50:45 $
5 *
6 * ====================================================================
7 *
8 * The Apache Software License, Version 1.1
9 *
10 * Copyright (c) 1999-2002 The Apache Software Foundation. All rights
11 * reserved.
12 *
13 * Redistribution and use in source and binary forms, with or without
14 * modification, are permitted provided that the following conditions
15 * are met:
16 *
17 * 1. Redistributions of source code must retain the above copyright
18 * notice, this list of conditions and the following disclaimer.
19 *
20 * 2. Redistributions in binary form must reproduce the above copyright
21 * notice, this list of conditions and the following disclaimer in
22 * the documentation and/or other materials provided with the
23 * distribution.
24 *
25 * 3. The end-user documentation included with the redistribution, if
26 * any, must include the following acknowlegement:
27 * "This product includes software developed by the
28 * Apache Software Foundation (http://www.apache.org/)."
29 * Alternately, this acknowlegement may appear in the software itself,
30 * if and wherever such third-party acknowlegements normally appear.
31 *
32 * 4. The names "The Jakarta Project", "Commons", and "Apache Software
33 * Foundation" must not be used to endorse or promote products derived
34 * from this software without prior written permission. For written
35 * permission, please contact apache@apache.org.
36 *
37 * 5. Products derived from this software may not be called "Apache"
38 * nor may "Apache" appear in their names without prior written
39 * permission of the Apache Group.
40 *
41 * THIS SOFTWARE IS PROVIDED ``AS IS'' AND ANY EXPRESSED OR IMPLIED
42 * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
43 * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
44 * DISCLAIMED. IN NO EVENT SHALL THE APACHE SOFTWARE FOUNDATION OR
45 * ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
46 * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
47 * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF
48 * USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
49 * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,
50 * OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT
51 * OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
52 * SUCH DAMAGE.
53 * ====================================================================
54 *
55 * This software consists of voluntary contributions made by many
56 * individuals on behalf of the Apache Software Foundation. For more
57 * information on the Apache Software Foundation, please see
58 * <http://www.apache.org/>.
59 *
60 * $Id: HyphenatedNameMapper.java,v 1.6 2003/01/06 22:50:45 rdonkin Exp $
61 */
62 package org.apache.commons.betwixt.strategy;
63
64
65
66 /***
67 * A name mapper which converts types to a hypenated String. So
68 * a bean type of FooBar will be converted to the element name "foo-bar".
69 * The name mapper can be configured to convert to upper case and to
70 * use a different separator via the <code>separator</code> and
71 * <code>upperCase</code> properties, so that FooBar can be converted
72 * to FOO_BAR if needed, by calling the constructor
73 * <code>new HyphenatedNameMapper(true, "_")</code>.
74 *
75 * @author <a href="mailto:jason@zenplex.com">Jason van Zyl</a>
76 * @author <a href="mailto:jstrachan@apache.org">James Strachan</a>
77 * @version $Revision: 1.6 $
78 */
79 public class HyphenatedNameMapper implements NameMapper {
80
81 /*** the separator used to seperate words, which defaults to '-' */
82 private String separator = "-";
83
84 /*** whether upper or lower case conversions should be performed */
85 private boolean upperCase = false;
86
87 /***
88 * Construct a hyphenated name mapper that converts the name to lower case
89 * and uses the default separator.
90 */
91 public HyphenatedNameMapper() {
92 }
93
94 /***
95 * Construct a hyphenated name mapper with default separator.
96 *
97 * @param upperCase should the type name be converted (entirely) to upper case
98 */
99 public HyphenatedNameMapper(boolean upperCase) {
100 this.upperCase = upperCase;
101 }
102
103 /***
104 * Construct a hyphenated name mapper.
105 *
106 * @param upperCase should the type name be converted (entirely) to upper case
107 * @param separator use this string to separate the words in the name returned.
108 * The words in the bean name are deduced by relying on the standard camel's hump
109 * property naming convention.
110 */
111 public HyphenatedNameMapper(boolean upperCase, String separator) {
112 this.upperCase = upperCase;
113 this.separator = separator;
114 }
115
116 /***
117 * <p>The words within the bean name are deduced assuming the camel's hump naming
118 * convention. For example, the words in <code>FooBar</code> are <code>foo</code>
119 * and <code>bar</code>.</p>
120 *
121 * <p>Next convert all letter in the bean name to either upper case or lower case
122 * based on the {@link #isUpperCase} property value.</p>
123 *
124 * <p>Then the {@link #getSeparator} property value is inserted so that it separates
125 * each word.</p>
126 *
127 * @param typeName the name string to convert
128 * @return the bean name converted to either upper or lower case with words separated
129 * by the separator.
130 */
131 public String mapTypeToElementName(String typeName) {
132
133 int length = typeName.length();
134 if (length == 0) {
135 return "";
136 }
137
138 StringBuffer sb = new StringBuffer();
139
140 sb.append(convertChar(typeName.charAt(0)));
141
142 for (int i = 1; i < length; i++) {
143 if (Character.isUpperCase(typeName.charAt(i))) {
144 sb.append(separator);
145 sb.append(convertChar(typeName.charAt(i)));
146 } else {
147 if ( upperCase ) {
148 sb.append(convertChar(typeName.charAt(i)));
149 } else {
150 sb.append(typeName.charAt(i));
151 }
152 }
153 }
154
155 return sb.toString();
156 }
157
158 // Properties
159 //-------------------------------------------------------------------------
160 /***
161 * This separator will be inserted between the words in the bean name.
162 *
163 * @return the separator used to seperate words, which defaults to '-'
164 */
165 public String getSeparator() {
166 return separator;
167 }
168
169 /***
170 * Sets the separator used to seperate words, which defaults to '-'
171 *
172 * @param separator the string inserted to separate words
173 */
174 public void setSeparator(String separator) {
175 this.separator = separator;
176 }
177
178 /***
179 * Should the bean name be converted to upper case?
180 * Otherwise, it will be converted to lower case.
181 *
182 * @return whether upper or lower case conversions should be performed,
183 * which defaults to false for lower case
184 */
185 public boolean isUpperCase() {
186 return upperCase;
187 }
188
189 /***
190 * Sets whether upper or lower case conversions should be performed,
191 * which defaults to false for lower case.
192 *
193 * @param upperCase whether the name is to be converted to upper case
194 */
195 public void setUpperCase(boolean upperCase) {
196 this.upperCase = upperCase;
197 }
198
199 // Implementation methods
200 //-------------------------------------------------------------------------
201
202 /***
203 * Performs type conversion on the given character based on whether
204 * upper or lower case conversions are being used
205 *
206 * @param ch the character to be converted
207 * @return converted to upper case if {@link isUpperCase} otherwise to lower case
208 */
209 protected char convertChar(char ch) {
210 if ( upperCase ) {
211 return Character.toUpperCase(ch);
212
213 } else {
214 return Character.toLowerCase(ch);
215 }
216 }
217 }
This page was automatically generated by Maven