Adrian,

thank you for the review! I am going to followup with you an this shortly as 
soon as I'll have a free moment.

Jacopo

On Sep 23, 2014, at 8:05 PM, Adrian Crum <[email protected]> 
wrote:

> The configurable thread count (maxWorkerPoolSize) is a useful feature. It is 
> a shame to see it removed.
> 
> Adrian Crum
> Sandglass Software
> www.sandglass-software.com
> 
> On 9/23/2014 6:04 PM, [email protected] wrote:
>> Author: jacopoc
>> Date: Tue Sep 23 17:04:20 2014
>> New Revision: 1627092
>> 
>> URL: http://svn.apache.org/r1627092
>> Log:
>> Moved the thread pool executor object from GenericDAO to the DatabaseUtil 
>> class where it was actually used: this change simplifies the API and allows 
>> to shutdown the pool when it is no more needed.
>> Removed a series of methods that are no more needed after this refactoring 
>> or were not used.
>> 
>> Modified:
>>     
>> ofbiz/trunk/framework/base/src/org/ofbiz/base/concurrent/ExecutionPool.java
>>     
>> ofbiz/trunk/framework/catalina/src/org/ofbiz/catalina/container/CatalinaContainer.java
>>     ofbiz/trunk/framework/entity/dtd/entity-config.xsd
>>     ofbiz/trunk/framework/entity/src/org/ofbiz/entity/DelegatorFactory.java
>>     
>> ofbiz/trunk/framework/entity/src/org/ofbiz/entity/config/model/Datasource.java
>>     
>> ofbiz/trunk/framework/entity/src/org/ofbiz/entity/datasource/GenericDAO.java
>>     
>> ofbiz/trunk/framework/entity/src/org/ofbiz/entity/datasource/GenericHelper.java
>>     
>> ofbiz/trunk/framework/entity/src/org/ofbiz/entity/datasource/GenericHelperDAO.java
>>     ofbiz/trunk/framework/entity/src/org/ofbiz/entity/jdbc/DatabaseUtil.java
>> 
>> Modified: 
>> ofbiz/trunk/framework/base/src/org/ofbiz/base/concurrent/ExecutionPool.java
>> URL: 
>> http://svn.apache.org/viewvc/ofbiz/trunk/framework/base/src/org/ofbiz/base/concurrent/ExecutionPool.java?rev=1627092&r1=1627091&r2=1627092&view=diff
>> ==============================================================================
>> --- 
>> ofbiz/trunk/framework/base/src/org/ofbiz/base/concurrent/ExecutionPool.java 
>> (original)
>> +++ 
>> ofbiz/trunk/framework/base/src/org/ofbiz/base/concurrent/ExecutionPool.java 
>> Tue Sep 23 17:04:20 2014
>> @@ -44,7 +44,7 @@ public final class ExecutionPool {
>>      public static final String module = ExecutionPool.class.getName();
>>      public static final ExecutorService GLOBAL_BATCH = new 
>> ThreadPoolExecutor(0, Integer.MAX_VALUE, 5, TimeUnit.SECONDS, new 
>> SynchronousQueue<Runnable>(), new ExecutionPoolThreadFactory(null, 
>> "OFBiz-batch"));
>>      public static final ForkJoinPool GLOBAL_FORK_JOIN = new ForkJoinPool();
>> -    private static final ExecutorService pulseExecutionPool = 
>> Executors.newFixedThreadPool(autoAdjustThreadCount(-1), new 
>> ExecutionPoolThreadFactory(null, "OFBiz-ExecutionPoolPulseWorker"));
>> +    private static final ExecutorService pulseExecutionPool = 
>> Executors.newFixedThreadPool(Runtime.getRuntime().availableProcessors(), new 
>> ExecutionPoolThreadFactory(null, "OFBiz-ExecutionPoolPulseWorker"));
>> 
>>      protected static class ExecutionPoolThreadFactory implements 
>> ThreadFactory {
>>          private final ThreadGroup group;
>> @@ -65,22 +65,8 @@ public final class ExecutionPool {
>>          }
>>      }
>> 
>> -    private static int autoAdjustThreadCount(int threadCount) {
>> -        if (threadCount == 0) {
>> -            return 1;
>> -        } else if (threadCount < 0) {
>> -            int numCpus = Runtime.getRuntime().availableProcessors();
>> -            return Math.abs(threadCount) * numCpus;
>> -        } else {
>> -            return threadCount;
>> -        }
>> -    }
>> -
>> -    public static ScheduledExecutorService getScheduledExecutor(ThreadGroup 
>> group, String namePrefix, int threadCount, boolean preStart) {
>> -        return getScheduledExecutor(group, namePrefix, threadCount, 0, 
>> preStart);
>> -    }
>>      public static ScheduledExecutorService getScheduledExecutor(ThreadGroup 
>> group, String namePrefix, int threadCount, long keepAliveSeconds, boolean 
>> preStart) {
>> -        ScheduledThreadPoolExecutor executor = new 
>> ScheduledThreadPoolExecutor(autoAdjustThreadCount(threadCount), new 
>> ExecutionPoolThreadFactory(group, namePrefix));
>> +        ScheduledThreadPoolExecutor executor = new 
>> ScheduledThreadPoolExecutor(threadCount, new 
>> ExecutionPoolThreadFactory(group, namePrefix));
>>          if (keepAliveSeconds > 0) {
>>              executor.setKeepAliveTime(keepAliveSeconds, TimeUnit.SECONDS);
>>              executor.allowCoreThreadTimeOut(true);
>> @@ -114,7 +100,7 @@ public final class ExecutionPool {
>>      }
>> 
>>      static {
>> -        int numberOfExecutionPoolPulseWorkers = autoAdjustThreadCount(-1);
>> +        int numberOfExecutionPoolPulseWorkers = 
>> Runtime.getRuntime().availableProcessors();
>>          for (int i = 0; i < numberOfExecutionPoolPulseWorkers; i++) {
>>              pulseExecutionPool.execute(new ExecutionPoolPulseWorker());
>>          }
>> 
>> Modified: 
>> ofbiz/trunk/framework/catalina/src/org/ofbiz/catalina/container/CatalinaContainer.java
>> URL: 
>> http://svn.apache.org/viewvc/ofbiz/trunk/framework/catalina/src/org/ofbiz/catalina/container/CatalinaContainer.java?rev=1627092&r1=1627091&r2=1627092&view=diff
>> ==============================================================================
>> --- 
>> ofbiz/trunk/framework/catalina/src/org/ofbiz/catalina/container/CatalinaContainer.java
>>  (original)
>> +++ 
>> ofbiz/trunk/framework/catalina/src/org/ofbiz/catalina/container/CatalinaContainer.java
>>  Tue Sep 23 17:04:20 2014
>> @@ -616,7 +616,7 @@ public class CatalinaContainer implement
>>              return;
>>          }
>> 
>> -        ScheduledExecutorService executor = 
>> ExecutionPool.getScheduledExecutor(CATALINA_THREAD_GROUP, 
>> "catalina-startup", -1, true);
>> +        ScheduledExecutorService executor = 
>> ExecutionPool.getScheduledExecutor(CATALINA_THREAD_GROUP, 
>> "catalina-startup", Runtime.getRuntime().availableProcessors(), 0, true);
>>          try {
>>              List<Future<Context>> futures = new 
>> ArrayList<Future<Context>>();
>> 
>> 
>> Modified: ofbiz/trunk/framework/entity/dtd/entity-config.xsd
>> URL: 
>> http://svn.apache.org/viewvc/ofbiz/trunk/framework/entity/dtd/entity-config.xsd?rev=1627092&r1=1627091&r2=1627092&view=diff
>> ==============================================================================
>> --- ofbiz/trunk/framework/entity/dtd/entity-config.xsd (original)
>> +++ ofbiz/trunk/framework/entity/dtd/entity-config.xsd Tue Sep 23 17:04:20 
>> 2014
>> @@ -411,7 +411,6 @@ under the License.
>>          <xs:attribute type="xs:string" name="table-type"/>
>>          <xs:attribute type="xs:string" name="character-set"/>
>>          <xs:attribute type="xs:string" name="collate"/>
>> -        <xs:attribute type="xs:integer" name="max-worker-pool-size" 
>> default="0"/>
>>      </xs:attributeGroup>
>>      <xs:element name="sql-load-path">
>>          <xs:complexType>
>> 
>> Modified: 
>> ofbiz/trunk/framework/entity/src/org/ofbiz/entity/DelegatorFactory.java
>> URL: 
>> http://svn.apache.org/viewvc/ofbiz/trunk/framework/entity/src/org/ofbiz/entity/DelegatorFactory.java?rev=1627092&r1=1627091&r2=1627092&view=diff
>> ==============================================================================
>> --- ofbiz/trunk/framework/entity/src/org/ofbiz/entity/DelegatorFactory.java 
>> (original)
>> +++ ofbiz/trunk/framework/entity/src/org/ofbiz/entity/DelegatorFactory.java 
>> Tue Sep 23 17:04:20 2014
>> @@ -36,7 +36,7 @@ public abstract class DelegatorFactory i
>>      public static final String module = 
>> DelegatorFactoryImpl.class.getName();
>>      private static final ConcurrentHashMap<String, Future<Delegator>> 
>> delegators = new ConcurrentHashMap<String, Future<Delegator>>();
>>      private static final ThreadGroup DELEGATOR_THREAD_GROUP = new 
>> ThreadGroup("DelegatorFactory");
>> -    private static final ScheduledExecutorService executor = 
>> ExecutionPool.getScheduledExecutor(DELEGATOR_THREAD_GROUP, 
>> "delegator-startup", -1, 10, true);
>> +    private static final ScheduledExecutorService executor = 
>> ExecutionPool.getScheduledExecutor(DELEGATOR_THREAD_GROUP, 
>> "delegator-startup", Runtime.getRuntime().availableProcessors(), 10, true);
>> 
>>      public static Delegator getDelegator(String delegatorName) {
>>          Future<Delegator> future = getDelegatorFuture(delegatorName);
>> 
>> Modified: 
>> ofbiz/trunk/framework/entity/src/org/ofbiz/entity/config/model/Datasource.java
>> URL: 
>> http://svn.apache.org/viewvc/ofbiz/trunk/framework/entity/src/org/ofbiz/entity/config/model/Datasource.java?rev=1627092&r1=1627091&r2=1627092&view=diff
>> ==============================================================================
>> --- 
>> ofbiz/trunk/framework/entity/src/org/ofbiz/entity/config/model/Datasource.java
>>  (original)
>> +++ 
>> ofbiz/trunk/framework/entity/src/org/ofbiz/entity/config/model/Datasource.java
>>  Tue Sep 23 17:04:20 2014
>> @@ -74,7 +74,6 @@ public final class Datasource {
>>      private final String tableType; // type = xs:string
>>      private final String characterSet; // type = xs:string
>>      private final String collate; // type = xs:string
>> -    private final int maxWorkerPoolSize; // type = xs:integer
>>      private final List<SqlLoadPath> sqlLoadPathList; // <sql-load-path>
>>      private final List<ReadData> readDataList; // <read-data>
>>      private final InlineJdbc inlineJdbc; // <inline-jdbc>
>> @@ -161,22 +160,6 @@ public final class Datasource {
>>          this.tableType = element.getAttribute("table-type").intern();
>>          this.characterSet = element.getAttribute("character-set").intern();
>>          this.collate = element.getAttribute("collate").intern();
>> -        String maxWorkerPoolSize = 
>> element.getAttribute("max-worker-pool-size").intern();
>> -        if (maxWorkerPoolSize.isEmpty()) {
>> -            this.maxWorkerPoolSize = 1;
>> -        } else {
>> -            try {
>> -                int maxWorkerPoolSizeInt = 
>> Integer.parseInt(maxWorkerPoolSize);
>> -                if (maxWorkerPoolSizeInt == 0) {
>> -                    maxWorkerPoolSizeInt = 1;
>> -                } else if (maxWorkerPoolSizeInt < -2) {
>> -                    maxWorkerPoolSizeInt = -2;
>> -                }
>> -                this.maxWorkerPoolSize = maxWorkerPoolSizeInt;
>> -            } catch (Exception e) {
>> -                throw new GenericEntityConfException("<datasource> element 
>> max-worker-pool-size attribute is invalid" + lineNumberText);
>> -            }
>> -        }
>>          List<? extends Element> sqlLoadPathElementList = 
>> UtilXml.childElementList(element, "sql-load-path");
>>          if (sqlLoadPathElementList.isEmpty()) {
>>              this.sqlLoadPathList = Collections.emptyList();
>> @@ -384,11 +367,6 @@ public final class Datasource {
>>          return this.collate;
>>      }
>> 
>> -    /** Returns the value of the <code>max-worker-pool-size</code> 
>> attribute. */
>> -    public int getMaxWorkerPoolSize() {
>> -        return this.maxWorkerPoolSize;
>> -    }
>> -
>>      /** Returns the <code>&lt;sql-load-path&gt;</code> child elements. */
>>      public List<SqlLoadPath> getSqlLoadPathList() {
>>          return this.sqlLoadPathList;
>> 
>> Modified: 
>> ofbiz/trunk/framework/entity/src/org/ofbiz/entity/datasource/GenericDAO.java
>> URL: 
>> http://svn.apache.org/viewvc/ofbiz/trunk/framework/entity/src/org/ofbiz/entity/datasource/GenericDAO.java?rev=1627092&r1=1627091&r2=1627092&view=diff
>> ==============================================================================
>> --- 
>> ofbiz/trunk/framework/entity/src/org/ofbiz/entity/datasource/GenericDAO.java 
>> (original)
>> +++ 
>> ofbiz/trunk/framework/entity/src/org/ofbiz/entity/datasource/GenericDAO.java 
>> Tue Sep 23 17:04:20 2014
>> @@ -31,12 +31,8 @@ import java.util.List;
>>  import java.util.Map;
>>  import java.util.Set;
>>  import java.util.TreeSet;
>> -import java.util.concurrent.Callable;
>>  import java.util.concurrent.ConcurrentHashMap;
>> -import java.util.concurrent.ExecutorService;
>> -import java.util.concurrent.Future;
>> 
>> -import org.ofbiz.base.concurrent.ExecutionPool;
>>  import org.ofbiz.base.util.Debug;
>>  import org.ofbiz.base.util.UtilValidate;
>>  import org.ofbiz.entity.Delegator;
>> @@ -78,7 +74,6 @@ public class GenericDAO {
>>      private final GenericHelperInfo helperInfo;
>>      private final ModelFieldTypeReader modelFieldTypeReader;
>>      private final Datasource datasource;
>> -    private final ExecutorService executor;
>> 
>>      public static GenericDAO getGenericDAO(GenericHelperInfo helperInfo) {
>>          String cacheKey = helperInfo.getHelperFullName();
>> @@ -94,11 +89,6 @@ public class GenericDAO {
>>          this.helperInfo = helperInfo;
>>          this.modelFieldTypeReader = 
>> ModelFieldTypeReader.getModelFieldTypeReader(helperInfo.getHelperBaseName());
>>          this.datasource = 
>> EntityConfig.getDatasource(helperInfo.getHelperBaseName());
>> -        this.executor = 
>> ExecutionPool.getScheduledExecutor(GENERIC_DAO_THREAD_GROUP, 
>> "OFBiz-entity-datasource(" + helperInfo.getHelperFullName() + ")", 
>> datasource.getMaxWorkerPoolSize(), false);
>> -    }
>> -
>> -    public <T> Future<T> submitWork(Callable<T> callable) throws 
>> GenericEntityException {
>> -        return this.executor.submit(callable);
>>      }
>> 
>>      private void addFieldIfMissing(List<ModelField> fieldsToSave, String 
>> fieldName, ModelEntity modelEntity) {
>> @@ -1228,13 +1218,13 @@ public class GenericDAO {
>>      /* 
>> ====================================================================== */
>> 
>>      public void checkDb(Map<String, ModelEntity> modelEntities, 
>> List<String> messages, boolean addMissing) {
>> -        DatabaseUtil dbUtil = new DatabaseUtil(this.helperInfo, 
>> this.executor);
>> +        DatabaseUtil dbUtil = new DatabaseUtil(this.helperInfo);
>>          dbUtil.checkDb(modelEntities, messages, addMissing);
>>      }
>> 
>>      /** Creates a list of ModelEntity objects based on meta data from the 
>> database */
>>      public List<ModelEntity> induceModelFromDb(Collection<String> messages) 
>> {
>> -        DatabaseUtil dbUtil = new DatabaseUtil(this.helperInfo, 
>> this.executor);
>> +        DatabaseUtil dbUtil = new DatabaseUtil(this.helperInfo);
>>          return dbUtil.induceModelFromDb(messages);
>>      }
>>  }
>> 
>> Modified: 
>> ofbiz/trunk/framework/entity/src/org/ofbiz/entity/datasource/GenericHelper.java
>> URL: 
>> http://svn.apache.org/viewvc/ofbiz/trunk/framework/entity/src/org/ofbiz/entity/datasource/GenericHelper.java?rev=1627092&r1=1627091&r2=1627092&view=diff
>> ==============================================================================
>> --- 
>> ofbiz/trunk/framework/entity/src/org/ofbiz/entity/datasource/GenericHelper.java
>>  (original)
>> +++ 
>> ofbiz/trunk/framework/entity/src/org/ofbiz/entity/datasource/GenericHelper.java
>>  Tue Sep 23 17:04:20 2014
>> @@ -49,8 +49,6 @@ public interface GenericHelper {
>>       */
>>      public String getHelperName();
>> 
>> -    public <T> Future<T> submitWork(Callable<T> callable) throws 
>> GenericEntityException;
>> -
>>      /** Creates a Entity in the form of a GenericValue and write it to the 
>> database
>>       *@return GenericValue instance containing the new instance
>>       */
>> 
>> Modified: 
>> ofbiz/trunk/framework/entity/src/org/ofbiz/entity/datasource/GenericHelperDAO.java
>> URL: 
>> http://svn.apache.org/viewvc/ofbiz/trunk/framework/entity/src/org/ofbiz/entity/datasource/GenericHelperDAO.java?rev=1627092&r1=1627091&r2=1627092&view=diff
>> ==============================================================================
>> --- 
>> ofbiz/trunk/framework/entity/src/org/ofbiz/entity/datasource/GenericHelperDAO.java
>>  (original)
>> +++ 
>> ofbiz/trunk/framework/entity/src/org/ofbiz/entity/datasource/GenericHelperDAO.java
>>  Tue Sep 23 17:04:20 2014
>> @@ -57,10 +57,6 @@ public class GenericHelperDAO implements
>>          return this.helperInfo.getHelperFullName();
>>      }
>> 
>> -    public <T> Future<T> submitWork(Callable<T> callable) throws 
>> GenericEntityException {
>> -        return genericDAO.submitWork(callable);
>> -    }
>> -
>>      /** Creates a Entity in the form of a GenericValue and write it to the 
>> database
>>       *@return GenericValue instance containing the new instance
>>       */
>> 
>> Modified: 
>> ofbiz/trunk/framework/entity/src/org/ofbiz/entity/jdbc/DatabaseUtil.java
>> URL: 
>> http://svn.apache.org/viewvc/ofbiz/trunk/framework/entity/src/org/ofbiz/entity/jdbc/DatabaseUtil.java?rev=1627092&r1=1627091&r2=1627092&view=diff
>> ==============================================================================
>> --- ofbiz/trunk/framework/entity/src/org/ofbiz/entity/jdbc/DatabaseUtil.java 
>> (original)
>> +++ ofbiz/trunk/framework/entity/src/org/ofbiz/entity/jdbc/DatabaseUtil.java 
>> Tue Sep 23 17:04:20 2014
>> @@ -40,6 +40,7 @@ import java.util.Set;
>>  import java.util.TreeSet;
>>  import java.util.concurrent.Callable;
>>  import java.util.concurrent.ExecutorService;
>> +import java.util.concurrent.Executors;
>>  import java.util.concurrent.Future;
>>  import java.util.concurrent.FutureTask;
>> 
>> @@ -47,7 +48,6 @@ import org.ofbiz.base.concurrent.Executi
>>  import org.ofbiz.base.util.Debug;
>>  import org.ofbiz.base.util.UtilTimer;
>>  import org.ofbiz.base.util.UtilValidate;
>> -import org.ofbiz.base.util.UtilXml;
>>  import org.ofbiz.entity.GenericEntityException;
>>  import org.ofbiz.entity.config.model.Datasource;
>>  import org.ofbiz.entity.config.model.EntityConfig;
>> @@ -62,8 +62,6 @@ import org.ofbiz.entity.model.ModelRelat
>>  import org.ofbiz.entity.model.ModelViewEntity;
>>  import org.ofbiz.entity.transaction.TransactionFactoryLoader;
>>  import org.ofbiz.entity.transaction.TransactionUtil;
>> -import org.w3c.dom.Document;
>> -import org.w3c.dom.Element;
>> 
>>  /**
>>   * Utilities for Entity Database Maintenance
>> @@ -85,18 +83,12 @@ public class DatabaseUtil {
>>      protected String password = null;
>> 
>>      boolean isLegacy = false;
>> -    protected ExecutorService executor;
>> 
>>      // OFBiz DatabaseUtil
>>      public DatabaseUtil(GenericHelperInfo helperInfo) {
>> -        this(helperInfo, null);
>> -    }
>> -
>> -    public DatabaseUtil(GenericHelperInfo helperInfo, ExecutorService 
>> executor) {
>>          this.helperInfo = helperInfo;
>>          this.modelFieldTypeReader = 
>> ModelFieldTypeReader.getModelFieldTypeReader(helperInfo.getHelperBaseName());
>>          this.datasourceInfo = 
>> EntityConfig.getDatasource(helperInfo.getHelperBaseName());
>> -        this.executor = executor;
>>      }
>> 
>>      // Legacy DatabaseUtil
>> @@ -108,31 +100,6 @@ public class DatabaseUtil {
>>          this.isLegacy = true;
>>      }
>> 
>> -    protected <T> Future<T> submitWork(Callable<T> callable) {
>> -        if (this.executor == null) {
>> -            FutureTask<T> task = new FutureTask<T>(callable);
>> -            task.run();
>> -            return task;
>> -        }
>> -        return this.executor.submit(callable);
>> -    }
>> -
>> -    protected <T> List<Future<T>> submitAll(Collection<? extends 
>> Callable<T>> tasks) {
>> -        List<Future<T>> futures = new ArrayList<Future<T>>(tasks.size());
>> -        if (this.executor == null) {
>> -            for (Callable<T> callable: tasks) {
>> -                FutureTask<T> task = new FutureTask<T>(callable);
>> -                task.run();
>> -                futures.add(task);
>> -            }
>> -            return futures;
>> -        }
>> -        for (Callable<T> callable: tasks) {
>> -            futures.add(this.executor.submit(callable));
>> -        }
>> -        return futures;
>> -    }
>> -
>>      protected Connection getConnection() throws SQLException, 
>> GenericEntityException {
>>          Connection connection = null;
>>          if (!isLegacy) {
>> @@ -216,6 +183,9 @@ public class DatabaseUtil {
>>          if (isLegacy) {
>>              throw new RuntimeException("Cannot run checkDb on a legacy 
>> database connection; configure a database helper (entityengine.xml)");
>>          }
>> +
>> +        ExecutorService executor = 
>> Executors.newFixedThreadPool(Runtime.getRuntime().availableProcessors());
>> +
>>          UtilTimer timer = new UtilTimer();
>>          timer.timerString("Start - Before Get Database Meta Data");
>> 
>> @@ -233,7 +203,7 @@ public class DatabaseUtil {
>>          timer.timerString("After Get All Table Names");
>> 
>>          // get ALL column info, put into hashmap by table name
>> -        Map<String, Map<String, ColumnCheckInfo>> colInfo = 
>> this.getColumnInfo(tableNames, checkPks, messages);
>> +        Map<String, Map<String, ColumnCheckInfo>> colInfo = 
>> getColumnInfo(tableNames, checkPks, messages, executor);
>>          if (colInfo == null) {
>>              String message = "Could not get column information from the 
>> database, aborting.";
>>              if (messages != null) messages.add(message);
>> @@ -455,7 +425,7 @@ public class DatabaseUtil {
>> 
>>                  if (addMissing) {
>>                      // create the table
>> -                    tableFutures.add(submitWork(new 
>> CreateTableCallable(entity, modelEntities, tableName)));
>> +                    tableFutures.add(executor.submit(new 
>> CreateTableCallable(entity, modelEntities, tableName)));
>>                  }
>>              }
>>          }
>> @@ -478,7 +448,7 @@ public class DatabaseUtil {
>>              List<Future<AbstractCountingCallable>> fkIndicesFutures = new 
>> LinkedList<Future<AbstractCountingCallable>>();
>>              for (ModelEntity curEntity: entitiesAdded) {
>>                  if (curEntity.getRelationsOneSize() > 0) {
>> -                    fkIndicesFutures.add(submitWork(new 
>> AbstractCountingCallable(curEntity, modelEntities) {
>> +                    fkIndicesFutures.add(executor.submit(new 
>> AbstractCountingCallable(curEntity, modelEntities) {
>>                          public AbstractCountingCallable call() throws 
>> Exception {
>>                              count = createForeignKeyIndices(entity, 
>> datasourceInfo.getConstraintNameClipLength(), messages);
>>                              return this;
>> @@ -507,7 +477,7 @@ public class DatabaseUtil {
>>              List<Future<AbstractCountingCallable>> disFutures = new 
>> LinkedList<Future<AbstractCountingCallable>>();
>>              for (ModelEntity curEntity: entitiesAdded) {
>>                  if (curEntity.getIndexesSize() > 0) {
>> -                    disFutures.add(submitWork(new 
>> AbstractCountingCallable(curEntity,  modelEntities) {
>> +                    disFutures.add(executor.submit(new 
>> AbstractCountingCallable(curEntity,  modelEntities) {
>>                      public AbstractCountingCallable call() throws Exception 
>> {
>>                          count = createDeclaredIndices(entity, messages);
>>                          return this;
>> @@ -755,17 +725,19 @@ public class DatabaseUtil {
>> 
>>          }
>> 
>> -
>> +        executor.shutdown();
>>          timer.timerString("Finished Checking Entity Database");
>>      }
>> 
>>      /** Creates a list of ModelEntity objects based on meta data from the 
>> database */
>>      public List<ModelEntity> induceModelFromDb(Collection<String> messages) 
>> {
>> +        ExecutorService executor = 
>> Executors.newFixedThreadPool(Runtime.getRuntime().availableProcessors());
>> +
>>          // get ALL tables from this database
>>          TreeSet<String> tableNames = this.getTableNames(messages);
>> 
>>          // get ALL column info, put into hashmap by table name
>> -        Map<String, Map<String, ColumnCheckInfo>> colInfo = 
>> this.getColumnInfo(tableNames, true, messages);
>> +        Map<String, Map<String, ColumnCheckInfo>> colInfo = 
>> getColumnInfo(tableNames, true, messages, executor);
>> 
>>          // go through each table and make a ModelEntity object, add to list
>>          // for each entity make corresponding ModelField objects
>> @@ -789,66 +761,10 @@ public class DatabaseUtil {
>>              newEntList.add(newEntity);
>>          }
>> 
>> +        executor.shutdown();
>>          return newEntList;
>>      }
>> 
>> -    public Document induceModelFromDb(String packageName) {
>> -        Document document = UtilXml.makeEmptyXmlDocument("entitymodel");
>> -        Element root = document.getDocumentElement();
>> -        root.appendChild(document.createElement("title"));
>> -        root.appendChild(document.createElement("description"));
>> -        root.appendChild(document.createElement("copyright"));
>> -        root.appendChild(document.createElement("author"));
>> -        root.appendChild(document.createElement("version"));
>> -
>> -        // messages list
>> -        List<String> messages = new ArrayList<String>();
>> -
>> -        // get ALL tables from this database
>> -        TreeSet<String> tableNames = this.getTableNames(messages);
>> -
>> -        // get ALL column info, put into hashmap by table name
>> -        Map<String, Map<String, ColumnCheckInfo>> colInfo = 
>> this.getColumnInfo(tableNames, true, messages);
>> -
>> -        boolean isCaseSensitive = false;
>> -        DatabaseMetaData dbData = this.getDatabaseMetaData(null, messages);
>> -        if (dbData != null) {
>> -            try {
>> -                isCaseSensitive = dbData.supportsMixedCaseIdentifiers();
>> -            } catch (SQLException e) {
>> -                Debug.logError(e, "Error getting db meta data about case 
>> sensitive", module);
>> -            }
>> -        }
>> -
>> -        if (UtilValidate.isNotEmpty(packageName)) {
>> -            String catalogName = null;
>> -            try {
>> -                catalogName = this.getConnection().getCatalog();
>> -            } catch (Exception e) {
>> -                // ignore
>> -            }
>> -            packageName = "org.ofbiz.ext." + (catalogName != null ? 
>> catalogName : "unknown");
>> -        }
>> -
>> -
>> -        // iterate over the table names is alphabetical order
>> -        for (String tableName: new TreeSet<String>(colInfo.keySet())) {
>> -            Map<String, ColumnCheckInfo> colMap = colInfo.get(tableName);
>> -            ModelEntity newEntity = new ModelEntity(tableName, colMap, 
>> modelFieldTypeReader, isCaseSensitive);
>> -            root.appendChild(newEntity.toXmlElement(document, 
>> "org.ofbiz.ext." + packageName));
>> -        }
>> -
>> -        // print the messages to the console
>> -        for (String message: messages) {
>> -            Debug.logInfo(message, module);
>> -        }
>> -        return document;
>> -    }
>> -
>> -    public Document induceModelFromDb() {
>> -        return this.induceModelFromDb("");
>> -    }
>> -
>>      public DatabaseMetaData getDatabaseMetaData(Connection connection, 
>> Collection<String> messages) {
>>          if (connection == null) {
>>              connection = getConnectionLogged(messages);
>> @@ -1129,7 +1045,7 @@ public class DatabaseUtil {
>>          };
>>      }
>> 
>> -    public Map<String, Map<String, ColumnCheckInfo>> 
>> getColumnInfo(Set<String> tableNames, boolean getPks, Collection<String> 
>> messages) {
>> +    private Map<String, Map<String, ColumnCheckInfo>> 
>> getColumnInfo(Set<String> tableNames, boolean getPks, Collection<String> 
>> messages, ExecutorService executor) {
>>          // if there are no tableNames, don't even try to get the columns
>>          if (tableNames.size() == 0) {
>>              return new HashMap<String, Map<String, ColumnCheckInfo>>();
>> @@ -1261,7 +1177,7 @@ public class DatabaseUtil {
>>                          List<Future<AbstractCountingCallable>> 
>> pkFetcherFutures = new LinkedList<Future<AbstractCountingCallable>>();
>>                          for (String curTable: tableNames) {
>>                              curTable = 
>> curTable.substring(curTable.indexOf('.') + 1); //cut off schema name
>> -                            
>> pkFetcherFutures.add(submitWork(createPrimaryKeyFetcher(dbData, 
>> lookupSchemaName, needsUpperCase, colInfo, messages, curTable)));
>> +                            
>> pkFetcherFutures.add(executor.submit(createPrimaryKeyFetcher(dbData, 
>> lookupSchemaName, needsUpperCase, colInfo, messages, curTable)));
>>                          }
>>                          for (AbstractCountingCallable pkFetcherCallable: 
>> ExecutionPool.getAllFutures(pkFetcherFutures)) {
>>                              pkCount += 
>> pkFetcherCallable.updateData(messages);
>> 
>> 

Reply via email to