/*
* Copyright 2008 biaoping.yin
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
package com.frameworkset.orm.engine.model;
/*
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
import java.util.List;
import java.util.StringTokenizer;
import org.apache.commons.lang.StringUtils;
import com.frameworkset.orm.engine.EngineException;
/**
* A <code>NameGenerator</code> implementation for Java-esque names.
*
* @author <a href="mailto:dlr@finemaltcoding.com>Daniel Rall</a>
* @author <a href="mailto:byron_foster@byron_foster@yahoo.com>Byron Foster</a>
* @version $Id: JavaNameGenerator.java,v 1.4 2005/02/23 17:32:09 tfischer Exp $
*/
public class JavaNameGenerator implements NameGenerator
{
/**
* <code>inputs</code> should consist of two elements, the
* original name of the database element and the method for
* generating the name. There are currently three methods:
* <code>CONV_METHOD_NOCHANGE</code> - xml names are converted
* directly to java names without modification.
* <code>CONV_METHOD_UNDERSCORE</code> will capitalize the first
* letter, remove underscores, and capitalize each letter before
* an underscore. All other letters are lowercased. "javaname"
* works the same as the <code>CONV_METHOD_JAVANAME</code> method
* but will not lowercase any characters.
*
* @param inputs list expected to contain two parameters, element
* 0 contains name to convert, element 1 contains method for conversion.
* @return The generated name.
* @see com.frameworkset.orm.engine.model.NameGenerator
*/
public String generateName(List inputs)
{
String schemaName = (String) inputs.get(0);
String method = (String) inputs.get(1);
String javaName = null;
if (CONV_METHOD_UNDERSCORE.equals(method))
{
javaName = underscoreMethod(schemaName,false);
}
else if (CONV_METHOD_UNDERSCORE_OMIT_SCHEMA.equals(method))
{
javaName = underscoreOmitSchemaMethod(schemaName, false);
}
else if (CONV_METHOD_JAVANAME.equals(method))
{
javaName = javanameMethod(schemaName,false);
}
else if (CONV_METHOD_NOCHANGE.equals(method))
{
javaName = nochangeMethod(schemaName,false);
}
else if (CONV_METHOD_JAVAFIELDNAME.equals(method))
{
javaName = this.javanameField(schemaName, false);
}
else
{
// if for some reason nothing is defined then we default
// to the traditional method.
javaName = underscoreMethod(schemaName,false);
}
return javaName;
}
public String generateName(List inputs,boolean IGNORE_FIRST_TOKEN) throws EngineException
{
String schemaName = (String) inputs.get(0);
String method = (String) inputs.get(1);
String javaName = null;
if (CONV_METHOD_UNDERSCORE.equals(method))
{
javaName = underscoreMethod(schemaName,IGNORE_FIRST_TOKEN);
}
else if (CONV_METHOD_UNDERSCORE_OMIT_SCHEMA.equals(method))
{
javaName = underscoreOmitSchemaMethod(schemaName,IGNORE_FIRST_TOKEN);
}
else if (CONV_METHOD_JAVANAME.equals(method))
{
javaName = javanameMethod(schemaName,IGNORE_FIRST_TOKEN);
}
else if (CONV_METHOD_NOCHANGE.equals(method))
{
javaName = nochangeMethod(schemaName,IGNORE_FIRST_TOKEN);
}
else if (CONV_METHOD_JAVAFIELDNAME.equals(method))
{
javaName = this.javanameField(schemaName,IGNORE_FIRST_TOKEN);
}
else
{
// if for some reason nothing is defined then we default
// to the traditional method.
javaName = underscoreMethod(schemaName,IGNORE_FIRST_TOKEN);
}
return javaName;
}
/**
* Converts a database schema name to java object name. Removes
* <code>STD_SEPARATOR_CHAR</code> and <code>SCHEMA_SEPARATOR_CHAR</code>,
* capitilizes first letter of name and each letter after the
* <code>STD_SEPERATOR</code> and <code>SCHEMA_SEPARATOR_CHAR</code>,
* converts the rest of the letters to lowercase.
*
* @param schemaName name to be converted.
* @return converted name.
* @see com.frameworkset.orm.engine.model.NameGenerator
* @see #underscoreMethod(String)
*/
protected String underscoreMethod(String schemaName,boolean IGNORE_FIRST_TOKEN)
{
StringBuffer name = new StringBuffer();
// remove the STD_SEPARATOR_CHARs and capitalize
// the tokens
StringTokenizer tok = new StringTokenizer
(schemaName, String.valueOf(STD_SEPARATOR_CHAR));
while (tok.hasMoreTokens())
{
String namePart = ((String) tok.nextElement()).toLowerCase();
name.append(StringUtils.capitalize(namePart));
}
// remove the SCHEMA_SEPARATOR_CHARs and capitalize
// the tokens
schemaName = name.toString();
name = new StringBuffer();
tok = new StringTokenizer
(schemaName, String.valueOf(SCHEMA_SEPARATOR_CHAR));
while (tok.hasMoreTokens())
{
String namePart = (String) tok.nextElement();
name.append(StringUtils.capitalize(namePart));
}
return name.toString();
}
/**
* Converts a database schema name to java object name.
* First, it removes all characters before the last occurence of
* .<code>SCHEMA_SEPARATOR_CHAR</code>. Then, in a second step, removes
* <code>STD_SEPARATOR_CHAR</code>, capitilizes first letter of
* name and each letter after the <code>STD_SEPERATOR</code>,
* and converts the rest of the letters to lowercase.
*
* @param schemaName name to be converted.
* @return converted name.
* @see com.frameworkset.orm.engine.model.NameGenerator
* @see #underscoreOmitSchemaMethod(String)
*/
protected String underscoreOmitSchemaMethod(String schemaName,boolean IGNORE_FIRST_TOKEN)
{
// take only part after last dot
int lastDotPos = schemaName.lastIndexOf(SCHEMA_SEPARATOR_CHAR);
if (lastDotPos != -1) {
schemaName = schemaName.substring(lastDotPos + 1);
}
StringBuffer name = new StringBuffer();
StringTokenizer tok = new StringTokenizer
(schemaName, String.valueOf(STD_SEPARATOR_CHAR));
while (tok.hasMoreTokens())
{
String namePart = ((String) tok.nextElement()).toLowerCase();
name.append(StringUtils.capitalize(namePart));
}
return name.toString();
}
/**
* Converts a database schema name to java object name. Operates
* same as underscoreMethod but does not convert anything to
* lowercase.
*
* @param schemaName name to be converted.
* @return converted name.
* @see com.frameworkset.orm.engine.model.NameGenerator
* @see #underscoreMethod(String)
*/
protected String javanameMethod(String schemaName,boolean IGNORE_FIRST_TOKEN)
{
StringBuffer name = new StringBuffer();
StringTokenizer tok = new StringTokenizer
(schemaName, String.valueOf(STD_SEPARATOR_CHAR));
boolean first = true;
String firstNamepart = null;
while (tok.hasMoreTokens())
{
if(first && IGNORE_FIRST_TOKEN)
{
firstNamepart = (String) tok.nextElement();
first =false;
continue;
}
String namePart = (String) tok.nextElement();
name.append(StringUtils.capitalize(namePart));
}
// remove the SCHEMA_SEPARATOR_CHARs and capitalize
// the tokens
if(name.length() > 0 )
schemaName = name.toString();
else if(IGNORE_FIRST_TOKEN && firstNamepart != null)
schemaName = firstNamepart;
name = new StringBuffer();
tok = new StringTokenizer
(schemaName, String.valueOf(SCHEMA_SEPARATOR_CHAR));
while (tok.hasMoreTokens())
{
String namePart = (String) tok.nextElement();
name.append(StringUtils.capitalize(namePart));
}
return name.toString();
}
/**
* Converts a database schema name to java object name. Operates
* same as underscoreMethod but does not convert anything to
* lowercase.
*
* @param schemaName name to be converted.
* @return converted name.
* @see com.frameworkset.orm.engine.model.NameGenerator
* @see #underscoreMethod(String)
*/
protected String javanameField(String schemaName,boolean IGNORE_FIRST_TOKEN)
{
StringBuffer name = new StringBuffer();
StringTokenizer tok = new StringTokenizer
(schemaName, String.valueOf(STD_SEPARATOR_CHAR));
boolean first = true;
while (tok.hasMoreTokens())
{
String namePart = (String) tok.nextElement();
if(!first)
{
name.append(StringUtils.capitalize(namePart));
}
else
{
first = false;
name.append(namePart);
}
}
// remove the SCHEMA_SEPARATOR_CHARs and capitalize
// the tokens
schemaName = name.toString();
name = new StringBuffer();
tok = new StringTokenizer
(schemaName, String.valueOf(SCHEMA_SEPARATOR_CHAR));
first = true;
while (tok.hasMoreTokens())
{
String namePart = (String) tok.nextElement();
if(!first)
{
name.append(StringUtils.capitalize(namePart));
}
else
{
first = false;
name.append(namePart);
}
}
return name.toString();
}
/**
* Converts a database schema name to java object name. In this
* case no conversion is made.
*
* @param name name to be converted.
* @return The <code>name</code> parameter, unchanged.
*/
protected final String nochangeMethod(String name,boolean IGNORE_FIRST_TOKEN)
{
return name;
}
}