${database.allClassCopyright}package ${glPackageBaseCommon}; import java.util.Collections; import java.util.Map; import java.util.HashMap; import java.util.Set; import java.lang.reflect.Method; import org.seasar.dbflute.dbmeta.DBMeta; import org.seasar.dbflute.dbmeta.DBMetaProvider; import org.seasar.dbflute.exception.DBMetaNotFoundException; import org.seasar.dbflute.helper.StringKeyMap; import org.seasar.dbflute.util.DfAssertUtil; /** * The handler of the instance of DB meta. * @author ${database.classAuthor} */ public class ${glDBMetaInstanceHandler} implements DBMetaProvider { // =================================================================================== // Resource Map // ============ /** Table DB-name instance map. */ protected static final Map _tableDbNameInstanceMap = newHashMap(); /** The map of table DB name and class name. This is for initialization. */ protected static final Map _tableDbNameClassNameMap; static { final Map tmpMap = newHashMap(); #foreach ($table in $database.tables) tmpMap.put("${table.name}", "${table.DBMetaFullClassName}"); #end _tableDbNameClassNameMap = Collections.unmodifiableMap(tmpMap); } /** The flexible map of table DB name. This is for conversion at finding. */ protected static final Map _tableDbNameFlexibleMap = StringKeyMap.createAsFlexible(); static { final Set tableDbNameSet = _tableDbNameClassNameMap.keySet(); for (String tableDbName : tableDbNameSet) { _tableDbNameFlexibleMap.put(tableDbName, tableDbName); } } /** * Get the unmodifiable map of DB meta. * @return The unmodifiable map that contains all instances of DB meta. (NotNull & NotEmpty) */ public static Map getUnmodifiableDBMetaMap() { initializeDBMetaMap(); synchronized (_tableDbNameInstanceMap) { return Collections.unmodifiableMap(_tableDbNameInstanceMap); } } /** * Initialize the map of DB meta. */ protected static void initializeDBMetaMap() { if (isInitialized()) { return; } synchronized (_tableDbNameInstanceMap) { final Set tableDbNameSet = _tableDbNameClassNameMap.keySet(); for (String tableDbName : tableDbNameSet) { findDBMeta(tableDbName); // Initialize! } if (!isInitialized()) { String msg = "Failed to initialize tableDbNameInstanceMap:"; msg = msg + " tableDbNameInstanceMap=" + _tableDbNameInstanceMap; throw new IllegalStateException(msg); } } } protected static boolean isInitialized() { return _tableDbNameInstanceMap.size() == _tableDbNameClassNameMap.size(); } // =================================================================================== // Provider Singleton // ================== protected static final DBMetaProvider _provider = new ${glDBMetaInstanceHandler}(); public static DBMetaProvider getProvider() { return _provider; } /** * @param tableFlexibleName The flexible name of table. (NotNull) * @return The instance of DB meta. (Nullable: If the DB meta is not found, it returns null) */ public DBMeta provideDBMeta(String tableFlexibleName) { return byTableFlexibleName(tableFlexibleName); } /** * @param tableFlexibleName The flexible name of table. (NotNull) * @return The instance of DB meta. (NotNull) * @exception org.seasar.dbflute.exception.DBMetaNotFoundException When the DB meta is not found. */ public DBMeta provideDBMetaChecked(String tableFlexibleName) { return findDBMeta(tableFlexibleName); } // =================================================================================== // Find DBMeta // =========== /** * Find DB meta by table flexible name. (accept quoted name and schema prefix) * @param tableFlexibleName The flexible name of table. (NotNull) * @return The instance of DB meta. (NotNull) * @exception org.seasar.dbflute.exception.DBMetaNotFoundException When the DB meta is not found. */ public static DBMeta findDBMeta(String tableFlexibleName) { DBMeta dbmeta = byTableFlexibleName(tableFlexibleName); if (dbmeta == null) { String msg = "The DB meta was not found by the table flexible name: " + tableFlexibleName; msg = msg + " key=" + tableFlexibleName + " instanceMap=" + _tableDbNameInstanceMap; throw new DBMetaNotFoundException(msg); } return dbmeta; } // =================================================================================== // By Table Name // ============= /** * @param tableFlexibleName The flexible name of table. (NotNull) * @return The instance of DB meta. (Nullable: If the DB meta is not found, it returns null) */ protected static DBMeta byTableFlexibleName(String tableFlexibleName) { assertStringNotNullAndNotTrimmedEmpty("tableFlexibleName", tableFlexibleName); tableFlexibleName = removeSchemaIfExists(tableFlexibleName); tableFlexibleName = removeQuoteIfExists(tableFlexibleName); final String tableDbName = _tableDbNameFlexibleMap.get(tableFlexibleName); if (tableDbName != null) { return byTableDbName(tableDbName); } return null; } protected static String removeSchemaIfExists(String name) { final int dotLastIndex = name.lastIndexOf("."); if (dotLastIndex >= 0) { name = name.substring(dotLastIndex + ".".length()); } return name; } protected static String removeQuoteIfExists(String name) { if (name.startsWith("\"") && name.endsWith("\"")) { name = name.substring(1); name = name.substring(0, name.length() - 1); } else if (name.startsWith("[") && name.endsWith("]")) { name = name.substring(1); name = name.substring(0, name.length() - 1); } return name; } /** * @param tableDbName The DB name of table. (NotNull) * @return The instance of DB meta. (Nullable: If the DB meta is not found, it returns null) */ protected static DBMeta byTableDbName(String tableDbName) { assertStringNotNullAndNotTrimmedEmpty("tableDbName", tableDbName); return getCachedDBMeta(tableDbName); } // =================================================================================== // Cached DBMeta // ============= protected static DBMeta getCachedDBMeta(String tableDbName) { // lazy-load (thank you koyak!) DBMeta dbmeta = _tableDbNameInstanceMap.get(tableDbName); if (dbmeta != null) { return dbmeta; } synchronized (_tableDbNameInstanceMap) { dbmeta = _tableDbNameInstanceMap.get(tableDbName); if (dbmeta != null) { return dbmeta; } String entityName = _tableDbNameClassNameMap.get(tableDbName); _tableDbNameInstanceMap.put(tableDbName, getDBMeta(entityName)); return _tableDbNameInstanceMap.get(tableDbName); } } protected static DBMeta getDBMeta(String className) { try { Class clazz = Class.forName(className); Method methoz = clazz.getMethod("getInstance", (Class[])null); Object result = methoz.invoke(null, (Object[])null); return (DBMeta)result; } catch (Exception e) { throw new RuntimeException(e); } } // =================================================================================== // General Helper // ============== protected static HashMap newHashMap() { return new HashMap(); } // ----------------------------------------------------- // Assert Object // ------------- protected static void assertObjectNotNull(String variableName, Object value) { DfAssertUtil.assertObjectNotNull(variableName, value); } // ----------------------------------------------------- // Assert String // ------------- protected static void assertStringNotNullAndNotTrimmedEmpty(String variableName, String value) { DfAssertUtil.assertStringNotNullAndNotTrimmedEmpty(variableName, value); } }