Many resources are needed to download a project. Please understand that we have to compensate our server costs. Thank you in advance. Project price only 1 $
You can buy this project and download/modify it how often you want.
/*
* Copyright 2012-2016 CodeLibs Project and the Others.
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND,
* either express or implied. See the License for the specific language
* governing permissions and limitations under the License.
*/
package org.codelibs.fess.crawler.db.allcommon;
import java.util.Collections;
import java.util.Map;
import java.util.HashMap;
import java.lang.reflect.Method;
import org.dbflute.Entity;
import org.dbflute.dbmeta.DBMeta;
import org.dbflute.dbmeta.DBMetaProvider;
import org.dbflute.exception.DBMetaNotFoundException;
import org.dbflute.helper.StringKeyMap;
import org.dbflute.util.DfAssertUtil;
/**
* The handler of the instance of DB meta.
* @author DBFlute(AutoGenerator)
*/
public class DBMetaInstanceHandler implements DBMetaProvider {
// ===================================================================================
// Resource Map
// ============
/** The map of DB meta instance by key 'table DB-name'. (NotNull, LazyLoaded) */
protected static final Map _tableDbNameInstanceMap = newHashMap();
/** The map of DB meta instance by key 'entity type'. (NotNull, LazyLoaded) */
protected static final Map, DBMeta> _entityTypeInstanceMap = newHashMap();
/** The map of table DB name and DB meta class name. (NotNull) */
protected static final Map _tableDbNameClassNameMap;
static {
final Map tmpMap = newHashMap();
tmpMap.put("ACCESS_RESULT", "org.codelibs.fess.crawler.db.bsentity.dbmeta.AccessResultDbm");
tmpMap.put("ACCESS_RESULT_DATA", "org.codelibs.fess.crawler.db.bsentity.dbmeta.AccessResultDataDbm");
tmpMap.put("URL_FILTER", "org.codelibs.fess.crawler.db.bsentity.dbmeta.UrlFilterDbm");
tmpMap.put("URL_QUEUE", "org.codelibs.fess.crawler.db.bsentity.dbmeta.UrlQueueDbm");
_tableDbNameClassNameMap = Collections.unmodifiableMap(tmpMap);
}
/** The flexible map of table DB name for conversion in finding process. (NotNull) */
protected static final Map _tableDbNameFlexibleMap = StringKeyMap.createAsFlexible();
static {
for (String tableDbName : _tableDbNameClassNameMap.keySet()) {
_tableDbNameFlexibleMap.put(tableDbName, tableDbName);
}
}
/**
* Get the unmodifiable map of DB meta. map:{tableDbName = DBMeta}
* @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) {
for (String tableDbName : _tableDbNameClassNameMap.keySet()) {
findDBMeta(tableDbName); // initialize
}
if (!isInitialized()) {
String msg = "Failed to initialize tableDbNameInstanceMap: " + _tableDbNameInstanceMap;
throw new IllegalStateException(msg);
}
}
}
protected static boolean isInitialized() {
return _tableDbNameInstanceMap.size() == _tableDbNameClassNameMap.size();
}
// ===================================================================================
// Provider Singleton
// ==================
protected static final DBMetaProvider _provider = new DBMetaInstanceHandler();
public static DBMetaProvider getProvider() {
return _provider;
}
public DBMeta provideDBMeta(String tableFlexibleName) {
return byTableFlexibleName(tableFlexibleName);
}
public DBMeta provideDBMeta(Class> entityType) {
return byEntityType(entityType);
}
public DBMeta provideDBMetaChecked(String tableFlexibleName) {
return findDBMeta(tableFlexibleName);
}
public DBMeta provideDBMetaChecked(Class> entityType) {
return findDBMeta(entityType);
}
// ===================================================================================
// 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)
* @throws org.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: key=" + tableFlexibleName;
throw new DBMetaNotFoundException(msg);
}
return dbmeta;
}
/**
* Find DB meta by entity type.
* @param entityType The entity type of table, which should implement the {@link Entity} interface. (NotNull)
* @return The instance of DB meta. (NotNull)
* @throws org.dbflute.exception.DBMetaNotFoundException When the DB meta is not found.
*/
public static DBMeta findDBMeta(Class> entityType) {
DBMeta dbmeta = byEntityType(entityType);
if (dbmeta == null) {
String msg = "The DB meta was not found by the entity type: key=" + entityType;
throw new DBMetaNotFoundException(msg);
}
return dbmeta;
}
// ===================================================================================
// by Table Name
// =============
/**
* @param tableFlexibleName The flexible name of table. (NotNull)
* @return The instance of DB meta. (NullAllowed: If the DB meta is not found, it returns null)
*/
protected static DBMeta byTableFlexibleName(String tableFlexibleName) {
assertStringNotNullAndNotTrimmedEmpty("tableFlexibleName", tableFlexibleName);
String tableDbName = _tableDbNameFlexibleMap.get(tableFlexibleName);
if (tableDbName == null) {
tableDbName = retryByNormalizedName(tableFlexibleName);
}
return tableDbName != null ? byTableDbName(tableDbName) : null;
}
protected static String retryByNormalizedName(String tableFlexibleName) {
String tableDbName = null;
String pureName = normalizeTableFlexibleName(tableFlexibleName);
String schema = extractSchemaIfExists(tableFlexibleName);
if (schema != null) { // first, find by qualified name
tableDbName = _tableDbNameFlexibleMap.get(schema + "." + pureName);
}
if (tableDbName == null) { // next, find by pure name
tableDbName = _tableDbNameFlexibleMap.get(pureName);
}
return tableDbName;
}
protected static String normalizeTableFlexibleName(String tableFlexibleName) {
return removeQuoteIfExists(removeSchemaIfExists(tableFlexibleName));
}
protected static String removeQuoteIfExists(String name) {
if (name.startsWith("\"") && name.endsWith("\"")) {
return strip(name);
} else if (name.startsWith("[") && name.endsWith("]")) {
return strip(name);
}
return name;
}
protected static String removeSchemaIfExists(String name) {
int dotLastIndex = name.lastIndexOf(".");
return dotLastIndex >= 0 ? name.substring(dotLastIndex + ".".length()) : name;
}
protected static String extractSchemaIfExists(String name) {
int dotLastIndex = name.lastIndexOf(".");
return dotLastIndex >= 0 ? name.substring(0, dotLastIndex) : null;
}
protected static String strip(String name) {
return name.substring(1, name.length() - 1);
}
/**
* @param tableDbName The DB name of table. (NotNull)
* @return The instance of DB meta. (NullAllowed: If the DB meta is not found, it returns null)
*/
protected static DBMeta byTableDbName(String tableDbName) {
assertStringNotNullAndNotTrimmedEmpty("tableDbName", tableDbName);
return getCachedDBMeta(tableDbName);
}
// ===================================================================================
// by Entity Type
// ==============
/**
* @param entityType The entity type of table, which should implement the entity interface. (NotNull)
* @return The instance of DB meta. (NullAllowed: If the DB meta is not found, it returns null)
*/
protected static DBMeta byEntityType(Class> entityType) {
assertObjectNotNull("entityType", entityType);
return getCachedDBMeta(entityType);
}
// ===================================================================================
// 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) {
// an other thread might have initialized
// or reading might failed by same-time writing
return dbmeta;
}
String dbmetaName = _tableDbNameClassNameMap.get(tableDbName);
if (dbmetaName == null) {
return null;
}
_tableDbNameInstanceMap.put(tableDbName, toDBMetaInstance(dbmetaName));
return _tableDbNameInstanceMap.get(tableDbName);
}
}
protected static DBMeta toDBMetaInstance(String dbmetaName) {
try {
Class> dbmetaType = Class.forName(dbmetaName);
Method method = dbmetaType.getMethod("getInstance", (Class[])null);
Object result = method.invoke(null, (Object[])null);
return (DBMeta)result;
} catch (Exception e) {
String msg = "Failed to get the instance: " + dbmetaName;
throw new IllegalStateException(msg, e);
}
}
protected static DBMeta getCachedDBMeta(Class> entityType) { // lazy-load same as by-name
DBMeta dbmeta = _entityTypeInstanceMap.get(entityType);
if (dbmeta != null) {
return dbmeta;
}
synchronized (_entityTypeInstanceMap) {
dbmeta = _entityTypeInstanceMap.get(entityType);
if (dbmeta != null) {
// an other thread might have initialized
// or reading might failed by same-time writing
return dbmeta;
}
if (Entity.class.isAssignableFrom(entityType)) { // required
Entity entity = newEntity(entityType);
dbmeta = getCachedDBMeta(entity.asTableDbName());
}
if (dbmeta == null) {
return null;
}
_entityTypeInstanceMap.put(entityType, dbmeta);
return _entityTypeInstanceMap.get(entityType);
}
}
protected static Entity newEntity(Class> entityType) {
try {
return (Entity)entityType.newInstance();
} catch (Exception e) {
String msg = "Failed to new the instance: " + entityType;
throw new IllegalStateException(msg, 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);
}
}