}
@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;
}
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;
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
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);
}
}
- 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
//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));
}