fix #6321 Implement parallel loading + progress bar for bulk editor
[taxeditor.git] / eu.etaxonomy.taxeditor.bulkeditor / src / main / java / eu / etaxonomy / taxeditor / bulkeditor / input / AbstractBulkEditorInput.java
index 005dbf7ca3251d8e3002777fcf51672dd74fc361..5485203557261a9204f5bf79a8b614b0a6995e92 100644 (file)
@@ -19,6 +19,10 @@ import java.util.Map.Entry;
 import java.util.Set;
 import java.util.UUID;
 
+import org.eclipse.core.runtime.ICoreRunnable;
+import org.eclipse.core.runtime.IProgressMonitor;
+import org.eclipse.core.runtime.jobs.Job;
+
 import ca.odell.glazedlists.BasicEventList;
 import eu.etaxonomy.cdm.api.conversation.ConversationHolder;
 import eu.etaxonomy.cdm.api.service.config.DeleteConfiguratorBase;
@@ -137,24 +141,36 @@ public abstract class AbstractBulkEditorInput<T extends CdmBase> extends CdmEnti
 
        public void performSearch(final BulkEditorQuery bulkEditorQuery) {
            model.clear();
-           BasicEventList<T> entityList = new BasicEventList<>();
 
                if(getEntityUuid() != null){
 
                        T entity = loadEntity(getEntityUuid());
-                       entityList.add(entity);
-                       model.addAll(entityList);
+                       model.add(entity);
                }
                else if(bulkEditorQuery != null){
 
                        IIdentifiableEntityServiceConfigurator configurator = bulkEditorQuery.getSearchConfigurator();
                        Comparator queryComparator = (bulkEditorQuery.getComparator() != null) ? bulkEditorQuery.getComparator() : new TitleCacheComparator();
 
-                       entityList.addAll(listEntities(configurator));
-
-                       Collections.sort(entityList, queryComparator);
+                       String jobLabel = "Load data";
+               Job job = Job.create(jobLabel, (ICoreRunnable) monitor -> {
+                   monitor.beginTask(jobLabel, IProgressMonitor.UNKNOWN);
+                   int pageNumber = 0;
+                   List<T> entities = listEntities(configurator);
+                   while(!entities.isEmpty()){
+                       if(monitor.isCanceled()){
+                           break;
+                       }
+                       configurator.setPageNumber(pageNumber);
+                       entities = listEntities(configurator);
+                       model.addAll(entities);
+                       pageNumber++;
+                       Collections.sort(model, queryComparator);
+                   }
+                   monitor.done();
+               });
+               job.schedule();
                }
-               model.addAll(entityList);
        }
 
        public boolean isMergingEnabled() {