ref #8096: use subprogressmonitor for cache updater
authorKatja Luther <k.luther@bgbm.org>
Thu, 7 Mar 2019 09:08:32 +0000 (10:08 +0100)
committerPatrick Plitzner <p.plitzner@bgbm.org>
Mon, 15 Apr 2019 13:53:01 +0000 (15:53 +0200)
cdmlib-services/src/main/java/eu/etaxonomy/cdm/api/longrunningService/LongRunningTasksServiceImpl.java
cdmlib-services/src/main/java/eu/etaxonomy/cdm/api/service/IdentifiableServiceBase.java
cdmlib-services/src/main/java/eu/etaxonomy/cdm/api/service/util/CacheUpdater.java

index 7072a0794ab91c06fa7328b7ece3931b9816d5c0..fa556adc11ef8806972356f26fd426eb2dc3a0db 100755 (executable)
@@ -150,6 +150,7 @@ public class LongRunningTasksServiceImpl implements ILongRunningTasksService{
             @Override
             public Serializable doRun(IRemotingProgressMonitor monitor) {
                 UpdateResult result;
+
                 configurator.setMonitor(monitor);
 
                 result = updater.doInvoke(configurator);
index 3c24b9f96934712c4dee61daf8e7ff2e7a497d4a..628d1f3a7a104909b0fccc4f1d4cfccc3e739eb6 100644 (file)
@@ -262,47 +262,55 @@ public abstract class IdentifiableServiceBase<T extends IdentifiableEntity, DAO
        }
 
        @Transactional(readOnly = false)  //TODO check transactional behavior, e.g. what happens with the session if count is very large
-       protected <S extends T > UpdateResult updateCachesImpl(Class<S> clazz, Integer stepSize, IIdentifiableEntityCacheStrategy<T> cacheStrategy, IProgressMonitor monitor) {
+       protected <S extends T > UpdateResult updateCachesImpl(Class<S> clazz, Integer stepSize, IIdentifiableEntityCacheStrategy<T> cacheStrategy, IProgressMonitor subMonitor) {
                if (stepSize == null){
                        stepSize = UPDATE_TITLE_CACHE_DEFAULT_STEP_SIZE;
                }
-               if (monitor == null){
-                       monitor = DefaultProgressMonitor.NewInstance();
+               if (subMonitor == null){
+                   subMonitor = DefaultProgressMonitor.NewInstance();
                }
                UpdateResult result = new UpdateResult();
                long count = dao.count(clazz);
                long countUpdated = 0;
-               monitor.beginTask("update titles for " + clazz.getSimpleName(), Long.valueOf(count).intValue());
-               int worked = 0;
-               Set<CdmEntityIdentifier> updatedCdmIds = new HashSet();
-               for(int i = 0 ; i < count ; i = i + stepSize){
-                       // not sure if such strict ordering is necessary here, but for safety reasons I do it
-                       ArrayList<OrderHint> orderHints = new ArrayList<>();
-                       orderHints.add( new OrderHint("id", OrderHint.SortOrder.ASCENDING));
-
-
-                       Map<Class<? extends CdmBase>, AutoPropertyInitializer<CdmBase>> oldAutoInit = switchOfAutoinitializer();
-                       List<S> list = this.list(clazz, stepSize, i, orderHints, null);
-                       switchOnOldAutoInitializer(oldAutoInit);
-
-                       List<T> entitiesToUpdate = new ArrayList<>();
-                       for (T entity : list){
-                               entity = HibernateProxyHelper.deproxy(entity);
-                           if (entity.updateCaches(cacheStrategy)){
-                               countUpdated++;
-                               updatedCdmIds.add(new CdmEntityIdentifier(entity.getId(), clazz));
-                           }
-                               worked++;
-                               monitor.internalWorked(1);
-                       }
 
+               try {
+                   subMonitor.beginTask("update titles for " + clazz.getSimpleName(), Long.valueOf(count).intValue());
+
+
+               //SubProgressMonitor subMonitor = monitor.("update titles for " + clazz.getSimpleName(), Long.valueOf(count).intValue());
+               int worked = 0;
+               Set<CdmEntityIdentifier> updatedCdmIds = new HashSet();
+               for(int i = 0 ; i < count ; i = i + stepSize){
+                       // not sure if such strict ordering is necessary here, but for safety reasons I do it
+                       ArrayList<OrderHint> orderHints = new ArrayList<>();
+                       orderHints.add( new OrderHint("id", OrderHint.SortOrder.ASCENDING));
+
+
+                       Map<Class<? extends CdmBase>, AutoPropertyInitializer<CdmBase>> oldAutoInit = switchOfAutoinitializer();
+                       List<S> list = this.list(clazz, stepSize, i, orderHints, null);
+                       switchOnOldAutoInitializer(oldAutoInit);
+
+                       List<T> entitiesToUpdate = new ArrayList<>();
+                       for (T entity : list){
+                               entity = HibernateProxyHelper.deproxy(entity);
+                           if (entity.updateCaches(cacheStrategy)){
+                               countUpdated++;
+                               updatedCdmIds.add(new CdmEntityIdentifier(entity.getId(), clazz));
+                           }
+                               worked++;
+                               subMonitor.internalWorked(1);
+                       }
+
+
+                       if (subMonitor.isCanceled()){
+                               break;
+                       }
+               }
+               result.addUpdatedCdmIds(updatedCdmIds);
+       } finally {
+            subMonitor.done();
+        }
 
-                       if (monitor.isCanceled()){
-                               break;
-                       }
-               }
-               monitor.done();
-               result.addUpdatedCdmIds(updatedCdmIds);
                return result;
        }
 
index c774ed34d3711772183080476af814191804ee18..5f0cebf46588682bf281903fc9a20225bcf278db 100644 (file)
@@ -25,6 +25,7 @@ import eu.etaxonomy.cdm.api.service.IVocabularyService;
 import eu.etaxonomy.cdm.api.service.UpdateResult;
 import eu.etaxonomy.cdm.api.service.config.CacheUpdaterConfigurator;
 import eu.etaxonomy.cdm.common.monitor.IProgressMonitor;
+import eu.etaxonomy.cdm.common.monitor.SubProgressMonitor;
 import eu.etaxonomy.cdm.model.agent.AgentBase;
 import eu.etaxonomy.cdm.model.common.IdentifiableEntity;
 import eu.etaxonomy.cdm.model.description.DescriptionBase;
@@ -97,16 +98,17 @@ public class CacheUpdater implements Serializable {
                        logger.warn("Create class list from boolean values is not yet implemented for cache updater");
                        createClassListFromBoolean();
                }
-
+               config.getMonitor().beginTask("Update Caches", 100);
                //handle class list
                result = handleClassList(config.getClassList(), config.getMonitor());
-
+               config.getMonitor().done();
                return result;
        }
 
 
        private UpdateResult handleClassList(List<Class<? extends IdentifiableEntity>> classList, IProgressMonitor monitor) {
            UpdateResult result = new UpdateResult();
+           int ticksForSubTasks = 100/classList.size();
                for (Class<? extends IdentifiableEntity> clazz : classList){
                        //WE need to separate classes , because hibernate
                        //returns multiple values for service.count() for e.g. IdentifableEntity.class
@@ -114,7 +116,8 @@ public class CacheUpdater implements Serializable {
                    UpdateResult multipleResult = handleMultiTableClasses(clazz, monitor);
 
                        if (multipleResult == null){
-                               result.includeResult(this.handleSingleTableClass(clazz, monitor));
+                           SubProgressMonitor subMonitor= new SubProgressMonitor(monitor, ticksForSubTasks);
+                               result.includeResult(this.handleSingleTableClass(clazz, subMonitor));
                        }else{
                            result.includeResult(multipleResult);
                        }
@@ -146,43 +149,44 @@ public class CacheUpdater implements Serializable {
 
        }
 
-       private UpdateResult handleSingleTableClass(Class<? extends IdentifiableEntity> clazz, IProgressMonitor monitor) {
+       private UpdateResult handleSingleTableClass(Class<? extends IdentifiableEntity> clazz, IProgressMonitor subMonitor) {
 
                UpdateResult result = new UpdateResult();
                if (clazz == null){
             return result;
         }
            logger.info("Updating class " + clazz.getSimpleName() + " ...");
+
                try {
                        //TermBase
                        if (DefinedTermBase.class.isAssignableFrom(clazz)){
 
-                           result.includeResult(termService.updateCaches((Class) clazz, null, null, monitor));
+                           result.includeResult(termService.updateCaches((Class) clazz, null, null, subMonitor));
                        }else if (FeatureTree.class.isAssignableFrom(clazz)){
-                           result.includeResult(featureTreeService.updateCaches((Class) clazz, null, null, monitor));
+                           result.includeResult(featureTreeService.updateCaches((Class) clazz, null, null, subMonitor));
                        }else if (TermVocabulary.class.isAssignableFrom(clazz)){
-                           result.includeResult(vocabularyService.updateCaches((Class) clazz, null, null, monitor));
+                           result.includeResult(vocabularyService.updateCaches((Class) clazz, null, null, subMonitor));
                        }
                        //DescriptionBase
                        else if (DescriptionBase.class.isAssignableFrom(clazz)){
-                           result.includeResult(descriptionService.updateCaches((Class) clazz, null, null, monitor));
+                           result.includeResult(descriptionService.updateCaches((Class) clazz, null, null, subMonitor));
                        }
                        //Media
                        else if (Media.class.isAssignableFrom(clazz)){
-                           result.includeResult(mediaService.updateCaches((Class) clazz, null, null, monitor));
+                           result.includeResult(mediaService.updateCaches((Class) clazz, null, null, subMonitor));
                        }//TaxonBase
                        else if (TaxonBase.class.isAssignableFrom(clazz)){
-                           result.includeResult(taxonService.updateCaches((Class) clazz, null, null, monitor));
+                           result.includeResult(taxonService.updateCaches((Class) clazz, null, null, subMonitor));
                        }
                        //IdentifiableMediaEntity
                        else if (AgentBase.class.isAssignableFrom(clazz)){
-                           result.includeResult(agentService.updateCaches((Class) clazz, null, null, monitor));
+                           result.includeResult(agentService.updateCaches((Class) clazz, null, null, subMonitor));
                        }else if (Collection.class.isAssignableFrom(clazz)){
-                           result.includeResult(collectionService.updateCaches((Class) clazz, null, null, monitor));
+                           result.includeResult(collectionService.updateCaches((Class) clazz, null, null, subMonitor));
                        }else if (Reference.class.isAssignableFrom(clazz)){
-                           result.includeResult(referenceService.updateCaches((Class) clazz, null, null, monitor));
+                           result.includeResult(referenceService.updateCaches((Class) clazz, null, null, subMonitor));
                        }else if (SpecimenOrObservationBase.class.isAssignableFrom(clazz)){
-                           result.includeResult(occurrenceService.updateCaches((Class) clazz, null, null, monitor));
+                           result.includeResult(occurrenceService.updateCaches((Class) clazz, null, null, subMonitor));
 
                        }
 //                     //Sequence  //currently not identifiable and therefore has not caches
@@ -193,15 +197,15 @@ public class CacheUpdater implements Serializable {
                        //TaxonName
                        else if (TaxonName.class.isAssignableFrom(clazz)){
 
-                           result.includeResult(nameService.updateCaches((Class) clazz, null, null, null));
+                           result.includeResult(nameService.updateCaches((Class) clazz, null, null, subMonitor));
                        }
                        //Classification
                        else if (Classification.class.isAssignableFrom(clazz)){
-                           result.includeResult(classificationService.updateCaches((Class) clazz, null, null, null));
+                           result.includeResult(classificationService.updateCaches((Class) clazz, null, null, subMonitor));
                        }
                        //Polytomous Key
             else if (PolytomousKey.class.isAssignableFrom(clazz)){
-                result.includeResult(polytomousKeyService.updateCaches((Class) clazz, null, null, null));
+                result.includeResult(polytomousKeyService.updateCaches((Class) clazz, null, null, subMonitor));
 
             }