1 package org.apache.torque.engine.database.model; 2 3 /* 4 * Licensed to the Apache Software Foundation (ASF) under one 5 * or more contributor license agreements. See the NOTICE file 6 * distributed with this work for additional information 7 * regarding copyright ownership. The ASF licenses this file 8 * to you under the Apache License, Version 2.0 (the 9 * "License"); you may not use this file except in compliance 10 * with the License. You may obtain a copy of the License at 11 * 12 * http://www.apache.org/licenses/LICENSE-2.0 13 * 14 * Unless required by applicable law or agreed to in writing, 15 * software distributed under the License is distributed on an 16 * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY 17 * KIND, either express or implied. See the License for the 18 * specific language governing permissions and limitations 19 * under the License. 20 */ 21 22 import java.util.List; 23 import java.util.StringTokenizer; 24 25 import org.apache.commons.lang.StringUtils; 26 27 /** 28 * A <code>NameGenerator</code> implementation for Java-esque names. 29 * 30 * @author <a href="mailto:dlr@finemaltcoding.com>Daniel Rall</a> 31 * @author <a href="mailto:byron_foster@byron_foster@yahoo.com>Byron Foster</a> 32 * @version $Id: JavaNameGenerator.java,v 1.1 2007-10-21 07:57:27 abyrne Exp $ 33 */ 34 public class JavaNameGenerator implements NameGenerator 35 { 36 /** 37 * <code>inputs</code> should consist of two elements, the 38 * original name of the database element and the method for 39 * generating the name. There are currently three methods: 40 * <code>CONV_METHOD_NOCHANGE</code> - xml names are converted 41 * directly to java names without modification. 42 * <code>CONV_METHOD_UNDERSCORE</code> will capitalize the first 43 * letter, remove underscores, and capitalize each letter before 44 * an underscore. All other letters are lowercased. "javaname" 45 * works the same as the <code>CONV_METHOD_JAVANAME</code> method 46 * but will not lowercase any characters. 47 * 48 * @param inputs list expected to contain two parameters, element 49 * 0 contains name to convert, element 1 contains method for conversion. 50 * @return The generated name. 51 * @see org.apache.torque.engine.database.model.NameGenerator 52 */ 53 public String generateName(List inputs) 54 { 55 String schemaName = (String) inputs.get(0); 56 String method = (String) inputs.get(1); 57 String javaName = null; 58 59 if (CONV_METHOD_UNDERSCORE.equals(method)) 60 { 61 javaName = underscoreMethod(schemaName); 62 } 63 else if (CONV_METHOD_UNDERSCORE_OMIT_SCHEMA.equals(method)) 64 { 65 javaName = underscoreOmitSchemaMethod(schemaName); 66 } 67 else if (CONV_METHOD_JAVANAME.equals(method)) 68 { 69 javaName = javanameMethod(schemaName); 70 } 71 else if (CONV_METHOD_NOCHANGE.equals(method)) 72 { 73 javaName = nochangeMethod(schemaName); 74 } 75 else 76 { 77 // if for some reason nothing is defined then we default 78 // to the traditional method. 79 javaName = underscoreMethod(schemaName); 80 } 81 82 return javaName; 83 } 84 85 /** 86 * Converts a database schema name to java object name. Removes 87 * <code>STD_SEPARATOR_CHAR</code> and <code>SCHEMA_SEPARATOR_CHAR</code>, 88 * capitilizes first letter of name and each letter after the 89 * <code>STD_SEPERATOR</code> and <code>SCHEMA_SEPARATOR_CHAR</code>, 90 * converts the rest of the letters to lowercase. 91 * 92 * @param schemaName name to be converted. 93 * @return converted name. 94 * @see org.apache.torque.engine.database.model.NameGenerator 95 * @see #underscoreMethod(String) 96 */ 97 protected String underscoreMethod(String schemaName) 98 { 99 StringBuffer name = new StringBuffer(); 100 101 // remove the STD_SEPARATOR_CHARs and capitalize 102 // the tokens 103 StringTokenizer tok = new StringTokenizer 104 (schemaName, String.valueOf(STD_SEPARATOR_CHAR)); 105 while (tok.hasMoreTokens()) 106 { 107 String namePart = ((String) tok.nextElement()).toLowerCase(); 108 name.append(StringUtils.capitalize(namePart)); 109 } 110 111 // remove the SCHEMA_SEPARATOR_CHARs and capitalize 112 // the tokens 113 schemaName = name.toString(); 114 name = new StringBuffer(); 115 tok = new StringTokenizer 116 (schemaName, String.valueOf(SCHEMA_SEPARATOR_CHAR)); 117 while (tok.hasMoreTokens()) 118 { 119 String namePart = (String) tok.nextElement(); 120 name.append(StringUtils.capitalize(namePart)); 121 } 122 return name.toString(); 123 } 124 125 /** 126 * Converts a database schema name to java object name. 127 * First, it removes all characters before the last occurence of 128 * .<code>SCHEMA_SEPARATOR_CHAR</code>. Then, in a second step, removes 129 * <code>STD_SEPARATOR_CHAR</code>, capitilizes first letter of 130 * name and each letter after the <code>STD_SEPERATOR</code>, 131 * and converts the rest of the letters to lowercase. 132 * 133 * @param schemaName name to be converted. 134 * @return converted name. 135 * @see org.apache.torque.engine.database.model.NameGenerator 136 * @see #underscoreOmitSchemaMethod(String) 137 */ 138 protected String underscoreOmitSchemaMethod(String schemaName) 139 { 140 // take only part after last dot 141 int lastDotPos = schemaName.lastIndexOf(SCHEMA_SEPARATOR_CHAR); 142 if (lastDotPos != -1) 143 { 144 schemaName = schemaName.substring(lastDotPos + 1); 145 } 146 StringBuffer name = new StringBuffer(); 147 StringTokenizer tok = new StringTokenizer 148 (schemaName, String.valueOf(STD_SEPARATOR_CHAR)); 149 while (tok.hasMoreTokens()) 150 { 151 String namePart = ((String) tok.nextElement()).toLowerCase(); 152 name.append(StringUtils.capitalize(namePart)); 153 } 154 return name.toString(); 155 } 156 157 /** 158 * Converts a database schema name to java object name. Operates 159 * same as underscoreMethod but does not convert anything to 160 * lowercase. 161 * 162 * @param schemaName name to be converted. 163 * @return converted name. 164 * @see org.apache.torque.engine.database.model.NameGenerator 165 * @see #underscoreMethod(String) 166 */ 167 protected String javanameMethod(String schemaName) 168 { 169 StringBuffer name = new StringBuffer(); 170 StringTokenizer tok = new StringTokenizer 171 (schemaName, String.valueOf(STD_SEPARATOR_CHAR)); 172 while (tok.hasMoreTokens()) 173 { 174 String namePart = (String) tok.nextElement(); 175 name.append(StringUtils.capitalize(namePart)); 176 } 177 178 // remove the SCHEMA_SEPARATOR_CHARs and capitalize 179 // the tokens 180 schemaName = name.toString(); 181 name = new StringBuffer(); 182 183 tok = new StringTokenizer 184 (schemaName, String.valueOf(SCHEMA_SEPARATOR_CHAR)); 185 while (tok.hasMoreTokens()) 186 { 187 String namePart = (String) tok.nextElement(); 188 name.append(StringUtils.capitalize(namePart)); 189 } 190 return name.toString(); 191 } 192 193 /** 194 * Converts a database schema name to java object name. In this 195 * case no conversion is made. 196 * 197 * @param name name to be converted. 198 * @return The <code>name</code> parameter, unchanged. 199 */ 200 protected final String nochangeMethod(String name) 201 { 202 return name; 203 } 204 }