/**
* Check the datasource to make sure the entity definitions are correct, optionally adding missing entities or fields on the server
*@param modelEntities Map of entityName names and ModelEntity values
*@param messages List to put any result messages in
*@param addMissing Flag indicating whether or not to add missing entities and fields on the server
*
* 檢查數據源確保實體正確定義,選擇性添加沒有的實體和字段
*/
public void checkDataSource(Map<String, ModelEntity> modelEntities, List<String> messages, boolean addMissing) throws GenericEntityException {
genericDAO.checkDb(modelEntities, messages, addMissing);
}
}
值得一提helper的實例化的是GenericHelperDAO 所以checkDb調用的是GenericHeleper中的方法
/**
* @author 鄭小康
*
* 1.從緩存中獲取helperFullName的GenericHelper
*
* 2.如果爲空根據helperBaseName(localmysql)獲取Datasource標籤實例
*
* 3.根據Datasource標籤的helperClass,創造構造器,構建對應實例
*
* 4.以HelperFullName爲k 實例爲v存入到緩存
*
* 5.返回當前實例化的GenericHelper
*
* */
public static GenericHelper getHelper(GenericHelperInfo helperInfo) {
GenericHelper helper = helperCache.get(helperInfo.getHelperFullName());
if (helper == null) { // don't want to block here
synchronized (GenericHelperFactory.class) {
// must check if null again as one of the blocked threads can still enter
helper = helperCache.get(helperInfo.getHelperFullName());
if (helper == null) {
try {
Datasource datasourceInfo = EntityConfig.getDatasource(helperInfo.getHelperBaseName());
if (datasourceInfo == null) {
throw new IllegalStateException("Could not find datasource definition with name " + helperInfo.getHelperBaseName());
}
String helperClassName = datasourceInfo.getHelperClass();
Class<?> helperClass = null;
if (UtilValidate.isNotEmpty(helperClassName)) {
try {
ClassLoader loader = Thread.currentThread().getContextClassLoader();
helperClass = loader.loadClass(helperClassName);
} catch (ClassNotFoundException e) {
Debug.logWarning(e, module);
throw new IllegalStateException("Error loading GenericHelper class \"" + helperClassName + "\": " + e.getMessage());
}
}
Class<?>[] paramTypes = new Class<?>[] {GenericHelperInfo.class};
Object[] params = new Object[] {helperInfo};
java.lang.reflect.Constructor<?> helperConstructor = null;
if (helperClass != null) {
try {
helperConstructor = helperClass.getConstructor(paramTypes);
} catch (NoSuchMethodException e) {
Debug.logWarning(e, module);
throw new IllegalStateException("Error loading GenericHelper class \"" + helperClassName + "\": " + e.getMessage());
}
}
try {
helper = (GenericHelper) helperConstructor.newInstance(params);
} catch (IllegalAccessException e) {
Debug.logWarning(e, module);
throw new IllegalStateException("Error loading GenericHelper class \"" + helperClassName + "\": " + e.getMessage());
} catch (InstantiationException e) {
Debug.logWarning(e, module);
throw new IllegalStateException("Error loading GenericHelper class \"" + helperClassName + "\": " + e.getMessage());
} catch (java.lang.reflect.InvocationTargetException e) {
Debug.logWarning(e, module);
throw new IllegalStateException("Error loading GenericHelper class \"" + helperClassName + "\": " + e.getMessage());
}
if (helper != null)
helperCache.put(helperInfo.getHelperFullName(), helper);
} catch (SecurityException e) {
Debug.logError(e, module);
throw new IllegalStateException("Error loading GenericHelper class: " + e.toString());
}
}
}
}
return helper;
}
/**
* Check the datasource to make sure the entity definitions are correct, optionally adding missing entities or fields on the server
*@param modelEntities Map of entityName names and ModelEntity values
*@param messages List to put any result messages in
*@param addMissing Flag indicating whether or not to add missing entities and fields on the server
*
* 檢查數據源確保實體正確定義,選擇性添加沒有的實體和字段
*/
public void checkDataSource(Map<String, ModelEntity> modelEntities, List<String> messages, boolean addMissing) throws GenericEntityException {
genericDAO.checkDb(modelEntities, messages, addMissing);
}
/**
* @author 鄭小康
* 根據GenericHelperInfo實例創建DatabaseUtil實例
*
* */
public void checkDb(Map<String, ModelEntity> modelEntities, List<String> messages, boolean addMissing) {
DatabaseUtil dbUtil = new DatabaseUtil(this.helperInfo);
dbUtil.checkDb(modelEntities, messages, addMissing);
}
/**
* @author jack
* 1.創建一個線程池,獲取dataSource中的max-worker-pool-size,作爲最大線程限制
*
* 2.tableNames fkTableNames indexTableNames 三個TreeSet<String>在開始都是一樣的
*
* 3.如果表信息爲空,那麼就是沒有對應數據庫
*
* 4.獲取modelEntities的Modelentity集合
*
* 5.獲取數據庫schemaName
*
* 6.將沒有添加的表給加到CreateTableCallable這個線程的對象,通過Future模式創建表
*
* 7.創建新增加的外鍵關係
*
* 8.創建新增加的索引關係
*
* */
public void checkDb(Map<String, ModelEntity> modelEntities, List<String> colWrongSize, List<String> messages, boolean checkPks, boolean checkFks, boolean checkFkIdx, boolean addMissing) {
*******代碼太長
}