package org.beanfuse.persist.hibernate;
import java.io.IOException;
import java.io.InputStream;
import java.net.URL;
import java.util.ArrayList;
import java.util.Collections;
import java.util.Enumeration;
import java.util.HashMap;
import java.util.Iterator;
import java.util.List;
import java.util.Map;
import java.util.Properties;
import org.apache.commons.lang.StringUtils;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
/**
*根据报名动态设置schema,prefix名字
*
* @author chaostone
*
*/
public class TableNameByModuleStrategy {
private static final Logger logger = LoggerFactory.getLogger(TableNameByModuleStrategy.class);
private final List patterns = new ArrayList();
private final Map packagePatterns = new HashMap();
static final TableNameByModuleStrategy instance = new TableNameByModuleStrategy();
static {
instance.loadProperties();
}
/**
* load tablename-default.properties then load tablename.properties
*/
public void loadProperties() {
try {
Enumeration em = TableNameByModuleStrategy.class.getClassLoader().getResources(
"META-INF/table.properties");
while (em.hasMoreElements()) {
loadProperties((URL) em.nextElement());
}
em = TableNameByModuleStrategy.class.getClassLoader().getResources("table.properties");
while (em.hasMoreElements()) {
loadProperties((URL) em.nextElement());
}
} catch (IOException e) {
logger.error("load properties error", e);
}
Collections.sort(patterns);
for (Iterator iter = patterns.iterator(); iter.hasNext();) {
logger.info("table name pattern {}", iter.next());
}
}
private void loadProperties(URL url) {
try {
logger.info("loading {}", url);
InputStream is = url.openStream();
Properties props = new Properties();
if (null != is) {
props.load(is);
}
for (Iterator iter = props.keySet().iterator(); iter.hasNext();) {
String packageName = (String) iter.next();
String schemaPrefix = props.getProperty(packageName).trim();
String schema = null;
String prefix = 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, ",");
}
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);
}
}
is.close();
} catch (IOException e) {
logger.error("property load error", e);
}
}
public static String getSchema(String packageName) {
String schemaName = null;
for (Iterator iter = instance.getPatterns().iterator(); iter.hasNext();) {
TableNamePattern packageSchema = (TableNamePattern) iter.next();
if (packageName.indexOf(packageSchema.getPackageName()) == 0) {
schemaName = packageSchema.getSchema();
}
}
return schemaName;
}
public static String getPrefix(String packageName) {
String prefix = null;
for (Iterator iter = instance.getPatterns().iterator(); iter.hasNext();) {
TableNamePattern packageSchema = (TableNamePattern) iter.next();
if (packageName.indexOf(packageSchema.getPackageName()) == 0) {
prefix = packageSchema.getPrefix();
}
}
return prefix;
}
public List getPatterns() {
return patterns;
}
}
/**
* 表命名模式
*
* @author chaostone
*
*/
class TableNamePattern implements Comparable {
// 报名
String packageName;
// 模式名
String schema;
// 前缀名
String prefix;
public TableNamePattern(String packageName, String schemaName, String prefix) {
this.packageName = packageName;
this.schema = schemaName;
this.prefix = prefix;
}
public int compareTo(Object arg0) {
TableNamePattern other = (TableNamePattern) arg0;
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(']');
return sb.toString();
}
}