From 2462bed39971790e10ccf496f2f94e1b17a0cac7 Mon Sep 17 00:00:00 2001 From: Katja Luther Date: Thu, 7 Mar 2019 10:08:32 +0100 Subject: [PATCH] ref #8096: use subprogressmonitor for cache updater --- .../LongRunningTasksServiceImpl.java | 1 + .../api/service/IdentifiableServiceBase.java | 72 ++++++++++--------- .../cdm/api/service/util/CacheUpdater.java | 38 +++++----- 3 files changed, 62 insertions(+), 49 deletions(-) diff --git a/cdmlib-services/src/main/java/eu/etaxonomy/cdm/api/longrunningService/LongRunningTasksServiceImpl.java b/cdmlib-services/src/main/java/eu/etaxonomy/cdm/api/longrunningService/LongRunningTasksServiceImpl.java index 7072a0794a..fa556adc11 100755 --- a/cdmlib-services/src/main/java/eu/etaxonomy/cdm/api/longrunningService/LongRunningTasksServiceImpl.java +++ b/cdmlib-services/src/main/java/eu/etaxonomy/cdm/api/longrunningService/LongRunningTasksServiceImpl.java @@ -150,6 +150,7 @@ public class LongRunningTasksServiceImpl implements ILongRunningTasksService{ @Override public Serializable doRun(IRemotingProgressMonitor monitor) { UpdateResult result; + configurator.setMonitor(monitor); result = updater.doInvoke(configurator); diff --git a/cdmlib-services/src/main/java/eu/etaxonomy/cdm/api/service/IdentifiableServiceBase.java b/cdmlib-services/src/main/java/eu/etaxonomy/cdm/api/service/IdentifiableServiceBase.java index 3c24b9f969..628d1f3a7a 100644 --- a/cdmlib-services/src/main/java/eu/etaxonomy/cdm/api/service/IdentifiableServiceBase.java +++ b/cdmlib-services/src/main/java/eu/etaxonomy/cdm/api/service/IdentifiableServiceBase.java @@ -262,47 +262,55 @@ public abstract class IdentifiableServiceBase UpdateResult updateCachesImpl(Class clazz, Integer stepSize, IIdentifiableEntityCacheStrategy cacheStrategy, IProgressMonitor monitor) { + protected UpdateResult updateCachesImpl(Class clazz, Integer stepSize, IIdentifiableEntityCacheStrategy 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 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 orderHints = new ArrayList<>(); - orderHints.add( new OrderHint("id", OrderHint.SortOrder.ASCENDING)); - - - Map, AutoPropertyInitializer> oldAutoInit = switchOfAutoinitializer(); - List list = this.list(clazz, stepSize, i, orderHints, null); - switchOnOldAutoInitializer(oldAutoInit); - - List 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 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 orderHints = new ArrayList<>(); + orderHints.add( new OrderHint("id", OrderHint.SortOrder.ASCENDING)); + + + Map, AutoPropertyInitializer> oldAutoInit = switchOfAutoinitializer(); + List list = this.list(clazz, stepSize, i, orderHints, null); + switchOnOldAutoInitializer(oldAutoInit); + + List 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; } diff --git a/cdmlib-services/src/main/java/eu/etaxonomy/cdm/api/service/util/CacheUpdater.java b/cdmlib-services/src/main/java/eu/etaxonomy/cdm/api/service/util/CacheUpdater.java index c774ed34d3..5f0cebf465 100644 --- a/cdmlib-services/src/main/java/eu/etaxonomy/cdm/api/service/util/CacheUpdater.java +++ b/cdmlib-services/src/main/java/eu/etaxonomy/cdm/api/service/util/CacheUpdater.java @@ -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> classList, IProgressMonitor monitor) { UpdateResult result = new UpdateResult(); + int ticksForSubTasks = 100/classList.size(); for (Class 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 clazz, IProgressMonitor monitor) { + private UpdateResult handleSingleTableClass(Class 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)); } -- 2.34.1