org.beangle.model.persist.hibernate.support.DefaultTableNameConfig.java Source code

Java tutorial

Introduction

Here is the source code for org.beangle.model.persist.hibernate.support.DefaultTableNameConfig.java

Source

/* Copyright c 2005-2012.
 * Licensed under GNU  LESSER General Public License, Version 3.
 * http://www.gnu.org/licenses
 */
package org.beangle.model.persist.hibernate.support;

import java.io.IOException;
import java.io.InputStream;
import java.net.URL;
import java.util.ArrayList;
import java.util.Collections;
import java.util.Iterator;
import java.util.List;
import java.util.Map;
import java.util.Properties;

import org.apache.commons.lang.StringUtils;
import org.beangle.commons.collection.CollectUtils;
import org.beangle.commons.lang.StrUtils;
import org.beangle.commons.text.inflector.Pluralizer;
import org.beangle.commons.text.inflector.lang.en.EnNounPluralizer;
import org.beangle.spring.config.ConfigResource;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;

/**
 * ????schema,prefix??
 * 
 * @author chaostone
 */
public class DefaultTableNameConfig implements TableNameConfig {

    // ???????
    private static final int MaxLength = 25;
    /**
     * ????
     */
    private boolean enablePluralize = true;

    private Pluralizer pluralizer = new EnNounPluralizer();

    private static final Logger logger = LoggerFactory.getLogger(DefaultTableNameConfig.class);

    private final List<TableNamePattern> patterns = new ArrayList<TableNamePattern>();

    private final Map<String, TableNamePattern> packagePatterns = CollectUtils.newHashMap();

    private ConfigResource resource;

    public void addConfig(URL url) {
        loadProperties(url);
        Collections.sort(patterns);
    }

    private void loadProperties(URL url) {
        try {
            logger.debug("loading {}", url);
            InputStream is = url.openStream();
            Properties props = new Properties();
            if (null != is) {
                props.load(is);
            }
            for (Iterator<Object> iter = props.keySet().iterator(); iter.hasNext();) {
                String packageName = (String) iter.next();
                String schemaPrefix = props.getProperty(packageName).trim();

                String schema = null;
                String prefix = null;
                String abbreviationStr = null;
                int commaIndex = schemaPrefix.indexOf(',');
                if (commaIndex < 0 || (commaIndex + 1 == schemaPrefix.length())) {
                    schema = schemaPrefix;
                } else if (commaIndex == 0) {
                    prefix = schemaPrefix.substring(1);
                } else {
                    schema = StringUtils.substringBefore(schemaPrefix, ",");
                    prefix = StringUtils.substringAfter(schemaPrefix, ",");
                }
                if (StringUtils.contains(prefix, ",")) {
                    abbreviationStr = StringUtils.substringAfter(prefix, ",").toLowerCase();
                    prefix = StringUtils.substringBefore(prefix, ",");
                }
                TableNamePattern pattern = (TableNamePattern) packagePatterns.get(packageName);
                if (null == pattern) {
                    pattern = new TableNamePattern(packageName, schema, prefix);
                    packagePatterns.put(packageName, pattern);
                    patterns.add(pattern);
                } else {
                    pattern.setSchema(schema);
                    pattern.setPrefix(prefix);
                }
                if (null != abbreviationStr) {
                    String[] pairs = StringUtils.split(abbreviationStr, ";");
                    for (String pair : pairs) {
                        String longName = StringUtils.substringBefore(pair, "=");
                        String shortName = StringUtils.substringAfter(pair, "=");
                        pattern.abbreviations.put(longName, shortName);
                    }
                }
            }
            is.close();
        } catch (IOException e) {
            logger.error("property load error", e);
        }
    }

    public String getSchema(String packageName) {
        String schemaName = null;
        for (TableNamePattern packageSchema : patterns) {
            if (packageName.indexOf(packageSchema.getPackageName()) == 0) {
                schemaName = packageSchema.getSchema();
            }
        }
        return schemaName;
    }

    public TableNamePattern getPattern(String packageName) {
        TableNamePattern pattern = null;
        for (TableNamePattern packageSchema : patterns) {
            if (packageName.indexOf(packageSchema.getPackageName()) == 0) {
                pattern = packageSchema;
            }
        }
        return pattern;
    }

    public String getPrefix(String packageName) {
        String prefix = null;
        for (TableNamePattern packageSchema : patterns) {
            if (packageName.indexOf(packageSchema.getPackageName()) == 0) {
                prefix = packageSchema.getPrefix();
            }
        }
        return prefix;
    }

    public List<TableNamePattern> getPatterns() {
        return patterns;
    }

    public ConfigResource getResource() {
        return resource;
    }

    public void setResource(ConfigResource resource) {
        this.resource = resource;
        if (null != resource) {
            for (final URL url : resource.getAllPaths()) {
                addConfig(url);
            }
            if (logger.isInfoEnabled()) {
                logger.info("Table name pattern: -> \n{}", this.toString());
            }
        }
    }

    public String toString() {
        int maxlength = 0;
        for (TableNamePattern pattern : patterns) {
            if (pattern.getPackageName().length() > maxlength) {
                maxlength = pattern.getPackageName().length();
            }
        }
        StringBuilder sb = new StringBuilder();
        for (int i = 0; i < patterns.size(); i++) {
            TableNamePattern pattern = patterns.get(i);
            sb.append(StringUtils.rightPad(pattern.getPackageName(), maxlength)).append(" : [")
                    .append(pattern.getSchema());
            sb.append(" , ").append(pattern.getPrefix()).append(']');
            if (i < patterns.size() - 1)
                sb.append('\n');
        }
        return sb.toString();
    }

    public String classToTableName(String className) {
        if (className.endsWith("Bean")) {
            className = StringUtils.substringBeforeLast(className, "Bean");
        }
        String tableName = addUnderscores(unqualify(className));
        if (enablePluralize) {
            tableName = pluralizer.pluralize(tableName);
        }
        TableNamePattern pattern = getPattern(className);
        if (null != pattern) {
            tableName = pattern.prefix + tableName;
        }
        if (tableName.length() > MaxLength && null != pattern) {
            for (Map.Entry<String, String> pairEntry : pattern.abbreviations.entrySet()) {
                tableName = StringUtils.replace(tableName, pairEntry.getKey(), pairEntry.getValue());
            }
        }
        return tableName;
    }

    public String collectionToTableName(String className, String tableName, String collectionName) {
        TableNamePattern pattern = getPattern(className);
        String collectionTableName = tableName + "_" + addUnderscores(unqualify(collectionName));
        if (collectionTableName.length() > MaxLength && null != pattern) {
            for (Map.Entry<String, String> pairEntry : pattern.abbreviations.entrySet()) {
                collectionTableName = StringUtils.replace(collectionTableName, pairEntry.getKey(),
                        pairEntry.getValue());
            }
        }
        return collectionTableName;
    }

    protected static String unqualify(String qualifiedName) {
        int loc = qualifiedName.lastIndexOf('.');
        return (loc < 0) ? qualifiedName : qualifiedName.substring(loc + 1);
    }

    protected static String addUnderscores(String name) {
        return StrUtils.unCamel(name.replace('.', '_'), '_');
    }

    public Pluralizer getPluralizer() {
        return pluralizer;
    }

    public void setPluralizer(Pluralizer pluralizer) {
        this.pluralizer = pluralizer;
    }

    public boolean isPluralizeTableName() {
        return enablePluralize;
    }

    public void setPluralizeTableName(boolean pluralizeTableName) {
        this.enablePluralize = pluralizeTableName;
    }

}

/**
 * ???
 * 
 * @author chaostone
 */
class TableNamePattern implements Comparable<TableNamePattern> {
    // ??
    String packageName;
    // ???
    String schema;
    // ???
    String prefix;

    Map<String, String> abbreviations = CollectUtils.newHashMap();

    public TableNamePattern(String packageName, String schemaName, String prefix) {
        this.packageName = packageName;
        this.schema = schemaName;
        this.prefix = prefix;
    }

    public int compareTo(TableNamePattern other) {
        return this.packageName.compareTo(other.packageName);
    }

    public String getPackageName() {
        return packageName;
    }

    public void setPackageName(String packageName) {
        this.packageName = packageName;
    }

    public String getSchema() {
        return schema;
    }

    public void setSchema(String schemaName) {
        this.schema = schemaName;
    }

    public String getPrefix() {
        return prefix;
    }

    public void setPrefix(String prefix) {
        this.prefix = prefix;
    }

    public String toString() {
        StringBuilder sb = new StringBuilder();
        sb.append("[package:").append(packageName).append(", schema:").append(schema);
        sb.append(", prefix:").append(prefix).append(']');
        sb.append(", abbreviations:").append(abbreviations).append(']');
        return sb.toString();
    }

}