ref #7699: wait for the thread to stop
[taxeditor.git] / eu.etaxonomy.taxeditor.bulkeditor / src / main / java / eu / etaxonomy / taxeditor / bulkeditor / input / AbstractBulkEditorInput.java
index c8c4c3c1d1f817713100f28428b09270801f74ea..747dc3df644b3d366599870eb49a169cda42dc6f 100644 (file)
@@ -9,6 +9,7 @@
 package eu.etaxonomy.taxeditor.bulkeditor.input;
 
 import java.util.ArrayList;
+import java.util.Collection;
 import java.util.Comparator;
 import java.util.HashMap;
 import java.util.HashSet;
@@ -32,6 +33,7 @@ import eu.etaxonomy.cdm.hibernate.HibernateProxyHelper;
 import eu.etaxonomy.cdm.model.common.CdmBase;
 import eu.etaxonomy.cdm.model.common.IdentifiableEntity;
 import eu.etaxonomy.cdm.model.common.MarkerType;
+import eu.etaxonomy.cdm.persistence.dto.MergeResult;
 import eu.etaxonomy.cdm.strategy.merge.IMergable;
 import eu.etaxonomy.cdm.strategy.merge.MergeException;
 import eu.etaxonomy.taxeditor.annotatedlineeditor.IEntityCreator;
@@ -51,11 +53,10 @@ import eu.etaxonomy.taxeditor.store.CdmStore;
 /**
  * @author p.ciardelli
  * @created 25.06.2009
- * @version 1.0
- * @param <T>
  */
-public abstract class AbstractBulkEditorInput<T extends CdmBase> extends CdmEntitySessionInput implements
-    IEntityPersistenceService<T> {
+public abstract class AbstractBulkEditorInput<T extends CdmBase>
+        extends CdmEntitySessionInput
+        implements IEntityPersistenceService<T> {
 
 
     private static final String PROPERTY_PROTECTED_TITLECACHE = "Protect TitleCache";
@@ -68,7 +69,11 @@ public abstract class AbstractBulkEditorInput<T extends CdmBase> extends CdmEnti
        private BasicEventList<T> model = new BasicEventList<>();
 
        private Map<T, DeleteConfiguratorBase> toDelete = new HashMap<>();
-       private Set<T> saveCandidates = new HashSet<>();
+       public Map<T, DeleteConfiguratorBase> getToDelete() {
+        return toDelete;
+    }
+
+    private Set<T> saveCandidates = new HashSet<>();
 
 
        private Set<T> markedMergeCandidates = new HashSet<>();
@@ -95,13 +100,24 @@ public abstract class AbstractBulkEditorInput<T extends CdmBase> extends CdmEnti
 
                BulkEditorInputType inputType = BulkEditorInputType.getByType(entity.getClass());
 
-               AbstractBulkEditorInput editorInput = NewInstance(inputType);
+               AbstractBulkEditorInput<?> editorInput = NewInstance(inputType);
 
                editorInput.setEntityUuid(entity.getUuid());
 
                return editorInput;
        }
 
+       public static AbstractBulkEditorInput NewInstance(Class clazz, UUID uuid) {
+
+        BulkEditorInputType inputType = BulkEditorInputType.getByType(clazz);
+
+        AbstractBulkEditorInput<?> editorInput = NewInstance(inputType);
+
+        editorInput.setEntityUuid(uuid);
+
+        return editorInput;
+    }
+
     public abstract String getName();
 
     public String getEditorName(){
@@ -152,8 +168,22 @@ public abstract class AbstractBulkEditorInput<T extends CdmBase> extends CdmEnti
         return null;
     }
 
-       public Comparator<T> getTitleComparator(){
-           return new TitleCacheComparator();
+    public boolean isBooleanProperty(String property) {
+        if(property.equals(PROPERTY_PROTECTED_TITLECACHE)){
+            return true;
+        }
+        return false;
+    }
+
+    public boolean isCacheProperty(String property) {
+        if(property.equals(PROPERTY_PROTECTED_TITLECACHE)){
+            return true;
+        }
+        return false;
+    }
+
+       public <T extends IdentifiableEntity> Comparator<T> getTitleComparator(){
+           return new TitleCacheComparator<T>();
        }
 
        public void setMergeTarget(T t){
@@ -186,7 +216,7 @@ public abstract class AbstractBulkEditorInput<T extends CdmBase> extends CdmEnti
     public void addSaveCandidate(T t){
         saveCandidates.add(t);
     }
-       private void setEntityUuid(UUID entityUuid){
+       public void setEntityUuid(UUID entityUuid){
                this.entityUuid = entityUuid;
        }
 
@@ -197,28 +227,39 @@ public abstract class AbstractBulkEditorInput<T extends CdmBase> extends CdmEnti
        public void performSearch(final BulkEditorQuery bulkEditorQuery, IStructuredSelection selection) {
            //cancel previous search job
            if(searchJob!=null && searchJob.getState()!=Job.NONE){
-               searchJob.cancel();
+               boolean isCanceled = searchJob.cancel();
+               if (!isCanceled){
+                   while (!isCanceled){
+                   try {
+                       Thread.sleep(200);
+                   } catch (InterruptedException e) {
+                   }
+                   isCanceled = searchJob.cancel();
+                   }
+               }
                searchJob = null;
-               /*
-                * wait for a little while for the job to finish
-                * to avoid asynchronously loaded results of the
-                * previous search being shown in the next search
-                * (not critical but explicitly waiting for the job to finish
-                * could run into an endless loop by mistake)
-                */
-               try {
-                Thread.sleep(500);
-            } catch (InterruptedException e) {
-            }
+//             /*
+//              * wait for a little while for the job to finish
+//              * to avoid asynchronously loaded results of the
+//              * previous search being shown in the next search
+//              * (not critical but explicitly waiting for the job to finish
+//              * could run into an endless loop by mistake)
+//              */
+//             try {
+//                Thread.sleep(500);
+//            } catch (InterruptedException e) {
+//            }
            }
-           model.clear();
+        model.clear();
+        markedMergeCandidates.clear();
+        markedMergeTarget = null;
 
                if(getEntityUuid() != null){
                        T entity = loadEntity(getEntityUuid());
                        model.add(entity);
                }
                else if(bulkEditorQuery != null){
-            IIdentifiableEntityServiceConfigurator configurator = bulkEditorQuery.getSearchConfigurator();
+            IIdentifiableEntityServiceConfigurator<?> configurator = bulkEditorQuery.getSearchConfigurator();
 
             // check for UUID search
             String titleSearchString = configurator.getTitleSearchString();
@@ -276,7 +317,7 @@ public abstract class AbstractBulkEditorInput<T extends CdmBase> extends CdmEnti
                }
        }
 
-       private void addToModel(List<T> entities, UUID selectedUuid){
+    private void addToModel(List<T> entities, UUID selectedUuid){
            //filter pre-loaded previously selected element
            if(selectedUuid!=null){
                entities = entities.stream().filter(entity->!entity.getUuid().equals(selectedUuid)).collect(Collectors.toList());
@@ -304,8 +345,6 @@ public abstract class AbstractBulkEditorInput<T extends CdmBase> extends CdmEnti
                return false;
        }
 
-
-       /** {@inheritDoc} */
        @Override
     public boolean merge(T entity, T mergeTarget) {
                if (entity instanceof IMergable) {
@@ -337,7 +376,12 @@ public abstract class AbstractBulkEditorInput<T extends CdmBase> extends CdmEnti
             }
            }
            if (!saveCandidates.isEmpty()){
-               CdmStore.getService(saveCandidates.iterator().next()).merge(new ArrayList<>(saveCandidates), true);
+               List<MergeResult<T>> results = CdmStore.getService(saveCandidates.iterator().next()).merge(new ArrayList<>(saveCandidates), true);
+               for (MergeResult<T> result: results){
+                   if (result.getMergedEntity() != null){
+                       T entity = result.getMergedEntity();
+                   }
+               }
         }
            if(resetMerge){
                //merge entities
@@ -352,8 +396,6 @@ public abstract class AbstractBulkEditorInput<T extends CdmBase> extends CdmEnti
            mergedEntities.clear();
        }
 
-
-       /** {@inheritDoc} */
        @Override
     public T create(T entity) {
                return save(entity);
@@ -373,9 +415,9 @@ public abstract class AbstractBulkEditorInput<T extends CdmBase> extends CdmEnti
         * @return
         */
        public List<IBulkEditorSortProvider<T>> getSortProviders(){
-               List<IBulkEditorSortProvider<T>> sortProviders = new ArrayList<IBulkEditorSortProvider<T>>();
+               List<IBulkEditorSortProvider<T>> sortProviders = new ArrayList<>();
 
-               sortProviders.add(new CdmBaseSortProvider<T>());
+               sortProviders.add(new CdmBaseSortProvider<>());
 
                return sortProviders;
        }
@@ -394,7 +436,7 @@ public abstract class AbstractBulkEditorInput<T extends CdmBase> extends CdmEnti
 
        public String getText(T entity) {
                if(entity.isInstanceOf(IdentifiableEntity.class)){
-                       IdentifiableEntity identifiableEntity = HibernateProxyHelper.deproxy(entity, IdentifiableEntity.class);
+                       IdentifiableEntity<?> identifiableEntity = HibernateProxyHelper.deproxy(entity, IdentifiableEntity.class);
                        String text = identifiableEntity.getTitleCache();
                        return text;
                }
@@ -417,7 +459,7 @@ public abstract class AbstractBulkEditorInput<T extends CdmBase> extends CdmEnti
        }
 
     @Override
-    public List<T> getRootEntities() {
+    public Collection<T> getRootEntities() {
         return getModel();
     }