DefaultNamingRule.java

package com.github.mygreen.sqlmapper.core.naming;


/**
 * {@link NamingRule}の標準実装。
 * <p>エンティティのクラス名、プロパティ名をキャメルケースから、DBのテーブル名、カラム名としてスネークケースに変換する。</p>
 * <p>大文字に変換する。</p>
 *
 * @version 0.3.2
 * @since 0.3
 * @author T.TSUCHIE
 *
 */
public class DefaultNamingRule implements NamingRule {

    /**
     * {@inheritDoc}
     * <p>大文字のスネークケース変換します。({@literal SampleCustomer} {@literal =>} {@literal SAMPLE_CUSTOMER})
     */
    @Override
    public String entityToTable(final String entityName) {

        // パッケージ名の除去
        String simpleName = entityName;
        int index = simpleName.lastIndexOf('.');

        if(index >= 0){
            simpleName = simpleName.substring(index + 1);
        }

        // 内部クラスの場合、クラス名を排除する。
        index = simpleName.lastIndexOf('$');
        if(index >= 0){
            simpleName = simpleName.substring(index + 1);
        }

        StringBuilder sb = new StringBuilder();

        for(int i=0; i < simpleName.length(); i++) {
            char c = simpleName.charAt(i);

            if('A' <= c && c <= 'Z' && sb.length() > 0) {
                // 先頭以外が大文字の場合
                sb.append('_');
            }
            sb.append(String.valueOf(c).toUpperCase());
        }

        return sb.toString();

    }

//    @Override
//    public String tableToEntity(final String tableName) {
//
//        StringBuilder sb = new StringBuilder();
//
//        // TODO 自動生成されたメソッド・スタブ
//        return null;
//    }

    /**
     * {@inheritDoc}
     * <p>大文字のスネークケース変換します。({@literal sampleName} {@literal =>} {@literal SAMPLE_NAME})
     */
    @Override
    public String propertyToColumn(final String propertyName) {
        StringBuilder sb = new StringBuilder();

        for(int i=0; i < propertyName.length(); i++) {
            char c = propertyName.charAt(i);
            if('A' <= c && c <= 'Z') {
                // 大文字の場合
                sb.append('_');
            }

            sb.append(String.valueOf(c).toUpperCase());
        }

        return sb.toString();
    }

    /**
     * {@inheritDoc}
     * <p>スネークケースから先頭が小文字のキャメルケースに変換します。({@literal SAMPLE_NAME} {@literal =>} {@literal sampleName})
     */

    @Override
    public String columnToProperty(final String columnName) {
        StringBuilder sb = new StringBuilder();

        boolean uppercase = false;

        for(int i=0; i < columnName.length(); i++){
            char c = columnName.charAt(i);
            if(c == '_'){
                // 先頭がアンダースコアで始まる場合
                uppercase = true;

            } else {
                if(uppercase){
                    sb.append(String.valueOf(c).toUpperCase());
                    uppercase = false;
                } else {
                    sb.append(String.valueOf(c).toLowerCase());
                }
            }
        }

        return sb.toString();
    }

    /**
     * {@inheritDoc}
     * <p>小文字のスネークケース変換します。({@literal sampleName} {@literal =>} {@literal SAMPLE_NAME})
     */
    @Override
    public String propertyToStoredParam(final String propertyName) {
        StringBuilder sb = new StringBuilder();

        for(int i=0; i < propertyName.length(); i++) {
            char c = propertyName.charAt(i);
            if('A' <= c && c <= 'Z') {
                // 大文字の場合
                sb.append('_');
            }

            sb.append(String.valueOf(c).toLowerCase());
        }

        return sb.toString();
    }

    /**
     * {@inheritDoc}
     * <p>大文字に変換したテーブル名とカラム名を結合します。({@literal SAMPLE_CUSTOMER}, {@literal sample_name} {@literal =>} {@literal SAMPLE_CUSTOMER_SAMPLE_NAME})
     */
    @Override
    public String sequenceNameForTableGenerator(final String tableName, final String columnName) {
        return tableName.toUpperCase() + "_" + columnName.toUpperCase();
    }

    /**
     * {@inheritDoc}
     * <p>大文字に変換したテーブル名とカラム名を結合し、接尾語({@literal SEQ}) を付与します。 ({@literal SAMPLE_CUSTOMER}, {@literal sample_name} {@literal =>} {@literal SAMPLE_CUSTOMER_SAMPLE_NAME})
     */
    @Override
    public String sequenceNameForSequenceGenerator(String tableName, String columnName) {
        return tableName.toUpperCase() + "_" + columnName.toUpperCase() + "_SEQ";
    }

}