package com.taobao.tddl.optimizer.config.table; import java.util.Collection; import com.taobao.tddl.common.exception.NotSupportException; import com.taobao.tddl.common.exception.TddlException; import com.taobao.tddl.common.model.Group; import com.taobao.tddl.common.model.lifecycle.AbstractLifecycle; import com.taobao.tddl.common.utils.extension.ExtensionLoader; import com.taobao.tddl.optimizer.rule.OptimizerRule; /** * 基于repo的{@linkplain SchemaManager}的委托实现 * * @author jianghang 2013-11-19 下午4:53:08 * @since 5.0.0 */ public class RepoSchemaManager extends AbstractLifecycle implements SchemaManager { private RepoSchemaManager delegate; private boolean isDelegate; private StaticSchemaManager local; private Group group; protected OptimizerRule rule = null; public void setRule(OptimizerRule rule) { this.rule = rule; } public OptimizerRule getRule() { return this.rule; } public static class LogicalAndActualTableName { public String logicalTableName; public String actualTableName; @Override public int hashCode() { return logicalTableName.hashCode(); } @Override public boolean equals(Object o) { return logicalTableName.equals(((LogicalAndActualTableName) o).logicalTableName); } } @Override protected void doInit() throws TddlException { if (local != null) { local.init(); } if (!isDelegate) { delegate = ExtensionLoader.load(RepoSchemaManager.class, group.getType().name()); delegate.setGroup(group); delegate.setDelegate(true); delegate.setRule(rule); delegate.init(); } } @Override public final TableMeta getTable(String tableName) { return getTable(tableName, null); } public final TableMeta getTable(String logicalTableName, String actualTableName) { TableMeta meta = null; if (local != null) {// 本地如果开启了,先找本地 meta = local.getTable(logicalTableName); } if (meta == null) {// 本地没有 meta = delegate.getTable0(logicalTableName, actualTableName); } return meta; } @Override public final void putTable(String tableName, TableMeta tableMeta) { if (local != null) {// 本地如果开启了,先处理本地 local.putTable(tableName, tableMeta); } else { delegate.putTable(tableName, tableMeta); } } @Override public Collection<TableMeta> getAllTables() { if (local != null) {// 本地如果开启了,先处理本地 return local.getAllTables(); } else { throw new UnsupportedOperationException(); } } /** * 需要各Repo来实现 * * @param tableName * @param actualTableName */ protected TableMeta getTable0(String logicalTableName, String actualTableName) { throw new NotSupportException("对应repo需要实现"); } @Override protected void doDestory() throws TddlException { if (local != null && local.isInited()) { local.destory(); } if (!isDelegate) { delegate.destory(); } } public void setGroup(Group group) { this.group = group; } public Group getGroup() { return group; } public void setLocal(StaticSchemaManager local) { this.local = local; } public void setDelegate(boolean isDelegate) { this.isDelegate = isDelegate; } }