X-Git-Url: https://dev.e-taxonomy.eu/gitweb/taxeditor.git/blobdiff_plain/66e51de317589aed3b6c0fcbaa18dc17cfefeb0c..6ce970f79952ed25b2037fbea1a19803b514985a:/eu.etaxonomy.taxeditor.bulkeditor/src/main/java/eu/etaxonomy/taxeditor/bulkeditor/input/AbstractBulkEditorInput.java diff --git a/eu.etaxonomy.taxeditor.bulkeditor/src/main/java/eu/etaxonomy/taxeditor/bulkeditor/input/AbstractBulkEditorInput.java b/eu.etaxonomy.taxeditor.bulkeditor/src/main/java/eu/etaxonomy/taxeditor/bulkeditor/input/AbstractBulkEditorInput.java index 503b8714b..747dc3df6 100644 --- a/eu.etaxonomy.taxeditor.bulkeditor/src/main/java/eu/etaxonomy/taxeditor/bulkeditor/input/AbstractBulkEditorInput.java +++ b/eu.etaxonomy.taxeditor.bulkeditor/src/main/java/eu/etaxonomy/taxeditor/bulkeditor/input/AbstractBulkEditorInput.java @@ -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; @@ -17,6 +18,7 @@ import java.util.Map; import java.util.Map.Entry; import java.util.Set; import java.util.UUID; +import java.util.stream.Collectors; import org.eclipse.core.runtime.ICoreRunnable; import org.eclipse.core.runtime.jobs.Job; @@ -31,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; @@ -50,18 +53,27 @@ import eu.etaxonomy.taxeditor.store.CdmStore; /** * @author p.ciardelli * @created 25.06.2009 - * @version 1.0 - * @param */ -public abstract class AbstractBulkEditorInput extends CdmEntitySessionInput implements - IEntityPersistenceService { +public abstract class AbstractBulkEditorInput + extends CdmEntitySessionInput + implements IEntityPersistenceService { + + + private static final String PROPERTY_PROTECTED_TITLECACHE = "Protect TitleCache"; + private static final String TYPE_PROPERTY = Messages.BulkEditorE4_TYPE; + private static final String ID_PROPERTY = "Id"; //$NON-NLS-1$ + private static final String UUID_PROPERTY = "Uuid"; //$NON-NLS-1$ private UUID entityUuid; private BasicEventList model = new BasicEventList<>(); private Map toDelete = new HashMap<>(); - private Set saveCandidates = new HashSet<>(); + public Map getToDelete() { + return toDelete; + } + + private Set saveCandidates = new HashSet<>(); private Set markedMergeCandidates = new HashSet<>(); @@ -88,13 +100,24 @@ public abstract class AbstractBulkEditorInput 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(){ @@ -111,8 +134,56 @@ public abstract class AbstractBulkEditorInput extends CdmEnti protected abstract T loadEntity(UUID entityUuid); - public Comparator getTitleComparator(){ - return new TitleCacheComparator(); + public List getPropertyKeys(){ + List properties = new ArrayList<>(); + properties.add(getName()); + properties.add(PROPERTY_PROTECTED_TITLECACHE); + properties.addAll(getPropertyKeys_internal()); + properties.add(TYPE_PROPERTY); + properties.add(ID_PROPERTY); + properties.add(UUID_PROPERTY); + return properties; + } + + protected abstract List getPropertyKeys_internal(); + + + public Object getPropertyValue(T cdmBase, String property){ + if(property.equals(getName())){ + return getText(cdmBase); + } + else if(property.equals(PROPERTY_PROTECTED_TITLECACHE) + &&cdmBase.isInstanceOf(IdentifiableEntity.class)){ + return HibernateProxyHelper.deproxy(cdmBase, IdentifiableEntity.class).isProtectedTitleCache(); + } + else if(property.equals(TYPE_PROPERTY)){ + return getTypeText(cdmBase); + } + else if(property.equals(UUID_PROPERTY)){ + return cdmBase.getUuid(); + } + else if(property.equals(ID_PROPERTY)){ + return cdmBase.getId(); + } + return null; + } + + 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 Comparator getTitleComparator(){ + return new TitleCacheComparator(); } public void setMergeTarget(T t){ @@ -145,7 +216,7 @@ public abstract class AbstractBulkEditorInput extends CdmEnti public void addSaveCandidate(T t){ saveCandidates.add(t); } - private void setEntityUuid(UUID entityUuid){ + public void setEntityUuid(UUID entityUuid){ this.entityUuid = entityUuid; } @@ -156,29 +227,39 @@ public abstract class AbstractBulkEditorInput 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(); @@ -202,30 +283,32 @@ public abstract class AbstractBulkEditorInput extends CdmEnti monitor.beginTask(jobLabel, totalWork); int pageNumber = 0; List entities; + + //load previously selected element + UUID selectedUuid = null; + if(selection!=null && selection.getFirstElement() instanceof CdmBase){ + selectedUuid = ((CdmBase) selection.getFirstElement()).getUuid(); + T entity = loadEntity(selectedUuid); + model.add(entity); + } + do { if (monitor.isCanceled()) { break; } configurator.setPageNumber(pageNumber); entities = listEntities(configurator); - /* - * IMPORTANT! - * Entities have to be loaded into the main session because they are - * loaded in a parallel asynchronous thread - */ - getCdmEntitySession().load(entities, true); - - model.addAll(entities); - - //select entity when it is loaded - if(selection!=null && model.containsAll(selection.toList())){ - EventUtility.postAsyncEvent(WorkbenchEventConstants.BULK_EDITOR_SEARCH_FINISHED, selection); - } + + addToModel(entities, selectedUuid); + pageNumber++; monitor.worked(pageSize); long workedLong = pageSize*pageNumber; int loadedCount = workedLong>Integer.MAX_VALUE?Integer.MAX_VALUE:(int)workedLong; monitor.setTaskName(String.format(Messages.AbstractBulkEditorInput_LOADED, loadedCount, totalWork, getName())); + + //Update selection + EventUtility.postAsyncEvent(WorkbenchEventConstants.BULK_EDITOR_SEARCH_FINISHED, selection); } while (!entities.isEmpty()); monitor.done(); EventUtility.postAsyncEvent(WorkbenchEventConstants.BULK_EDITOR_SEARCH_FINISHED, selection); @@ -234,6 +317,22 @@ public abstract class AbstractBulkEditorInput extends CdmEnti } } + private void addToModel(List entities, UUID selectedUuid){ + //filter pre-loaded previously selected element + if(selectedUuid!=null){ + entities = entities.stream().filter(entity->!entity.getUuid().equals(selectedUuid)).collect(Collectors.toList()); + } + /* + * IMPORTANT! + * Entities have to be loaded into the main session because they are + * loaded in a parallel asynchronous thread + */ + if(getCdmEntitySession()!=null){//is null when closing the bulk editor during loading + getCdmEntitySession().load(entities, true); + } + model.addAll(entities); + } + public boolean isMergingEnabled() { return false; } @@ -246,8 +345,6 @@ public abstract class AbstractBulkEditorInput extends CdmEnti return false; } - - /** {@inheritDoc} */ @Override public boolean merge(T entity, T mergeTarget) { if (entity instanceof IMergable) { @@ -279,7 +376,12 @@ public abstract class AbstractBulkEditorInput extends CdmEnti } } if (!saveCandidates.isEmpty()){ - CdmStore.getService(saveCandidates.iterator().next()).merge(new ArrayList<>(saveCandidates), true); + List> results = CdmStore.getService(saveCandidates.iterator().next()).merge(new ArrayList<>(saveCandidates), true); + for (MergeResult result: results){ + if (result.getMergedEntity() != null){ + T entity = result.getMergedEntity(); + } + } } if(resetMerge){ //merge entities @@ -294,8 +396,6 @@ public abstract class AbstractBulkEditorInput extends CdmEnti mergedEntities.clear(); } - - /** {@inheritDoc} */ @Override public T create(T entity) { return save(entity); @@ -315,9 +415,9 @@ public abstract class AbstractBulkEditorInput extends CdmEnti * @return */ public List> getSortProviders(){ - List> sortProviders = new ArrayList>(); + List> sortProviders = new ArrayList<>(); - sortProviders.add(new CdmBaseSortProvider()); + sortProviders.add(new CdmBaseSortProvider<>()); return sortProviders; } @@ -335,8 +435,8 @@ public abstract class AbstractBulkEditorInput extends CdmEnti } public String getText(T entity) { - if(entity instanceof IdentifiableEntity){ - IdentifiableEntity identifiableEntity = (IdentifiableEntity) HibernateProxyHelper.deproxy(entity); + if(entity.isInstanceOf(IdentifiableEntity.class)){ + IdentifiableEntity identifiableEntity = HibernateProxyHelper.deproxy(entity, IdentifiableEntity.class); String text = identifiableEntity.getTitleCache(); return text; } @@ -359,7 +459,7 @@ public abstract class AbstractBulkEditorInput extends CdmEnti } @Override - public List getRootEntities() { + public Collection getRootEntities() { return getModel(); } @@ -385,4 +485,5 @@ public abstract class AbstractBulkEditorInput extends CdmEnti public void setMergedEntities(HashMap> mergedEntities) { this.mergedEntities = mergedEntities; } + }