From: Cherian Mathew Date: Mon, 14 Sep 2015 14:21:43 +0000 (+0200) Subject: #5242, #5223 Improve performance of derivate loading and editing X-Git-Tag: remoting-3.9.0~3 X-Git-Url: https://dev.e-taxonomy.eu/gitweb/taxeditor.git/commitdiff_plain/c9f13bde09d3c996809b213f1bddf3c14d803536 #5242, #5223 Improve performance of derivate loading and editing --- 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 664035344..150e3b1aa 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 @@ -60,7 +60,7 @@ public abstract class AbstractBulkEditorInput extends CdmEnt private static Class serviceClass; public AbstractBulkEditorInput() { - + super(true); } /** diff --git a/eu.etaxonomy.taxeditor.editor/src/main/java/eu/etaxonomy/taxeditor/editor/TaxonEditorInput.java b/eu.etaxonomy.taxeditor.editor/src/main/java/eu/etaxonomy/taxeditor/editor/TaxonEditorInput.java index c59e0f2fe..7fbb22736 100644 --- a/eu.etaxonomy.taxeditor.editor/src/main/java/eu/etaxonomy/taxeditor/editor/TaxonEditorInput.java +++ b/eu.etaxonomy.taxeditor.editor/src/main/java/eu/etaxonomy/taxeditor/editor/TaxonEditorInput.java @@ -67,6 +67,7 @@ public class TaxonEditorInput extends CdmEntitySessionInput implements IEditorI } private TaxonEditorInput(UUID uuid, CdmType type) { + super(true); this.conversation = CdmStore.createConversation(); switch(type) { case PARENT_TAXON_NODE: diff --git a/eu.etaxonomy.taxeditor.editor/src/main/java/eu/etaxonomy/taxeditor/editor/group/authority/CdmAuthorityEditorInput.java b/eu.etaxonomy.taxeditor.editor/src/main/java/eu/etaxonomy/taxeditor/editor/group/authority/CdmAuthorityEditorInput.java index 92b9ec996..5dad6bd57 100644 --- a/eu.etaxonomy.taxeditor.editor/src/main/java/eu/etaxonomy/taxeditor/editor/group/authority/CdmAuthorityEditorInput.java +++ b/eu.etaxonomy.taxeditor.editor/src/main/java/eu/etaxonomy/taxeditor/editor/group/authority/CdmAuthorityEditorInput.java @@ -37,6 +37,7 @@ public class CdmAuthorityEditorInput extends CdmEntitySessionInput implements IE private Group group; protected CdmAuthorityEditorInput(ConversationHolder conversation, Group group) { + super(true); this.conversation = conversation; this.group = group; diff --git a/eu.etaxonomy.taxeditor.editor/src/main/java/eu/etaxonomy/taxeditor/editor/key/AbstractIdentificationEditorInput.java b/eu.etaxonomy.taxeditor.editor/src/main/java/eu/etaxonomy/taxeditor/editor/key/AbstractIdentificationEditorInput.java index 0a1f60ffe..15c755559 100644 --- a/eu.etaxonomy.taxeditor.editor/src/main/java/eu/etaxonomy/taxeditor/editor/key/AbstractIdentificationEditorInput.java +++ b/eu.etaxonomy.taxeditor.editor/src/main/java/eu/etaxonomy/taxeditor/editor/key/AbstractIdentificationEditorInput.java @@ -23,6 +23,7 @@ public abstract class AbstractIdentificationEditorInput derivateUUIDs = ((DerivateViewEditorInput) editorInput).getDerivateUUIDs(); - if(derivateUUIDs.size()==1){ - SpecimenOrObservationBase specimen = CdmStore.getService(IOccurrenceService.class).load(derivateUUIDs.iterator().next()); - if(specimen!=null){ + Set> derivateEntities = ((DerivateViewEditorInput) editorInput).getDerivateEntities(); + if(derivateEntities.size()==1){ + SpecimenOrObservationBase specimen = derivateEntities.iterator().next(); + if(specimen != null){ viewer.setSelection(new StructuredSelection(new TreeNode(specimen))); } } @@ -149,7 +141,7 @@ public class DerivateView extends EditorPart implements IPartContentHasFactualDa // commit the conversation and start a new transaction immediately conversation.commit(true); - CdmStore.getService(IOccurrenceService.class).merge(getRootEntities()); + ((DerivateViewEditorInput) getEditorInput()).merge(); monitor.worked(1); this.setDirty(false); @@ -207,7 +199,7 @@ public class DerivateView extends EditorPart implements IPartContentHasFactualDa if(!conversation.isBound()){ conversation.bind(); } - cdmEntitySession.bind(); + ((DerivateViewEditorInput) getEditorInput()).bind(); } @Override @@ -306,34 +298,10 @@ public class DerivateView extends EditorPart implements IPartContentHasFactualDa @Override public void dispose() { - cdmEntitySession.dispose(); + ((DerivateViewEditorInput) getEditorInput()).dispose(); super.dispose(); } - /* (non-Javadoc) - * @see eu.etaxonomy.taxeditor.session.ICdmEntitySessionEnabled#getCdmEntitySession() - */ - @Override - public ICdmEntitySession getCdmEntitySession() { - return cdmEntitySession; - } - - /* (non-Javadoc) - * @see eu.etaxonomy.taxeditor.session.ICdmEntitySessionEnabled#getRootEntities() - */ - @Override - public List getRootEntities() { - return contentProvider.getRootElements(); - } - - /* (non-Javadoc) - * @see eu.etaxonomy.taxeditor.session.ICdmEntitySessionEnabled#getPropertyPathsMap() - */ - @Override - public Map> getPropertyPathsMap() { - // TODO Auto-generated method stub - return null; - } @Override public boolean canAttachMedia() { diff --git a/eu.etaxonomy.taxeditor.editor/src/main/java/eu/etaxonomy/taxeditor/editor/view/derivate/DerivateViewEditorInput.java b/eu.etaxonomy.taxeditor.editor/src/main/java/eu/etaxonomy/taxeditor/editor/view/derivate/DerivateViewEditorInput.java index 3527fe5ed..ced5ad3fa 100644 --- a/eu.etaxonomy.taxeditor.editor/src/main/java/eu/etaxonomy/taxeditor/editor/view/derivate/DerivateViewEditorInput.java +++ b/eu.etaxonomy.taxeditor.editor/src/main/java/eu/etaxonomy/taxeditor/editor/view/derivate/DerivateViewEditorInput.java @@ -9,7 +9,12 @@ */ package eu.etaxonomy.taxeditor.editor.view.derivate; +import java.util.ArrayList; +import java.util.Arrays; +import java.util.HashMap; import java.util.HashSet; +import java.util.List; +import java.util.Map; import java.util.Set; import java.util.UUID; @@ -17,11 +22,13 @@ import org.eclipse.jface.resource.ImageDescriptor; import org.eclipse.ui.IEditorInput; import org.eclipse.ui.IPersistableElement; +import eu.etaxonomy.cdm.api.application.CdmApplicationState; import eu.etaxonomy.cdm.api.conversation.ConversationHolder; import eu.etaxonomy.cdm.api.service.IOccurrenceService; import eu.etaxonomy.cdm.model.occurrence.DerivedUnit; import eu.etaxonomy.cdm.model.occurrence.FieldUnit; import eu.etaxonomy.cdm.model.occurrence.SpecimenOrObservationBase; +import eu.etaxonomy.taxeditor.editor.CdmEntitySessionInput; import eu.etaxonomy.taxeditor.editor.EditorUtil; import eu.etaxonomy.taxeditor.editor.Messages; import eu.etaxonomy.taxeditor.model.MessagingUtils; @@ -36,19 +43,36 @@ import eu.etaxonomy.taxeditor.view.derivateSearch.DerivateLabelProvider; * @date 25.11.2013 * */ -public class DerivateViewEditorInput implements IEditorInput{ +public class DerivateViewEditorInput extends CdmEntitySessionInput implements IEditorInput { /** * The selected derivate {@link UUID}s */ - private final Set derivateUUIDs; + private final Set> derivateEntities; /** * List of the {@link UUID}s of the root elements of the hierarchy (may be the same objects as the derivates) */ + private Set> rootEntities; private Set rootUUIDs; private final ConversationHolder conversationHolder; + private static final List SPECIMEN_INIT_STRATEGY = Arrays.asList(new String[] { + "descriptions", + "annotations", + "markers", + "credits", + "extensions", + "rights", + "sources", + "derivationEvents.derivatives.annotations", + "derivationEvents.derivatives.markers", + "derivationEvents.derivatives.credits", + "derivationEvents.derivatives.extensions", + "derivationEvents.derivatives.rights", + "derivationEvents.derivatives.sources" + }); + /** * Creates an editor input for the {@link DerivateView} with the currently selected derivates and the * corresponding {@link FieldUnit}s (both may be the same object). @@ -56,28 +80,37 @@ public class DerivateViewEditorInput implements IEditorInput{ * @param rootUUIDs the root of the hierarchy */ public DerivateViewEditorInput(Set derivateUuids) { - super(); + super(false); + rootUUIDs = derivateUuids; + //FIXME:Remoting temporary hack for making the sessions work + //This should ideally be changed to initializing the + //super class with a collection of (id) objects which can + //then be used for the hashCode, equals methods + initSession(); this.conversationHolder = CdmStore.createConversation(); - this.derivateUUIDs = derivateUuids; - this.rootUUIDs = new HashSet(); + this.derivateEntities = new HashSet>(); + this.rootEntities = new HashSet>(); for (UUID uuid : derivateUuids) { - SpecimenOrObservationBase derivate = CdmStore.getService(IOccurrenceService.class).load(uuid); + SpecimenOrObservationBase derivate = CdmStore.getService(IOccurrenceService.class).load(uuid, SPECIMEN_INIT_STRATEGY); + derivateEntities.add(derivate); if(derivate instanceof FieldUnit){ - rootUUIDs.add(uuid); + rootEntities.add(derivate); } else if(derivate instanceof DerivedUnit){ SpecimenOrObservationBase topMostDerivate = EditorUtil.getTopMostDerivate(derivate); if(topMostDerivate!=null){ - rootUUIDs.add(topMostDerivate.getUuid()); + rootEntities.add(topMostDerivate); } } } - if(rootUUIDs.isEmpty()){ - rootUUIDs = derivateUUIDs; + if(rootEntities.isEmpty()){ + rootEntities = derivateEntities; } - if(rootUUIDs.isEmpty()){ + if(rootEntities.isEmpty()){ MessagingUtils.messageDialog(Messages.DerivateViewEditorInput_FAIL_INIT, DerivateViewEditorInput.class, Messages.DerivateViewEditorInput_NO_ROOT); } + + } /* (non-Javadoc) @@ -132,8 +165,7 @@ public class DerivateViewEditorInput implements IEditorInput{ private String getEditorName() { String name = null; - for(UUID uuid:rootUUIDs){ - SpecimenOrObservationBase specimen = CdmStore.getService(IOccurrenceService.class).load(uuid); + for( SpecimenOrObservationBase specimen : rootEntities){ if(specimen!=null){ if(name==null){ name = DerivateLabelProvider.getDerivateText(specimen, conversationHolder); @@ -146,16 +178,17 @@ public class DerivateViewEditorInput implements IEditorInput{ return name; } - public Set getRootUUIDs() { - return rootUUIDs; + @Override + public Set> getRootEntities() { + return rootEntities; } - public Set getDerivateUUIDs() { - return derivateUUIDs; + public Set> getDerivateEntities() { + return derivateEntities; } - public void addRootUuid(UUID root){ - rootUUIDs.add(root); + public void addRootEntity(SpecimenOrObservationBase root){ + rootEntities.add(root); } @@ -199,5 +232,35 @@ public class DerivateViewEditorInput implements IEditorInput{ return true; } + /* (non-Javadoc) + * @see eu.etaxonomy.taxeditor.editor.CdmEntitySessionInput#merge() + */ + @Override + public void merge() { + List mergedEntities = CdmApplicationState.getCurrentAppConfig().getOccurrenceService().merge(new ArrayList(getRootEntities())); + + } + + /* (non-Javadoc) + * @see eu.etaxonomy.taxeditor.session.ICdmEntitySessionEnabled#getPropertyPathsMap() + */ + @Override + public Map> getPropertyPathsMap() { + List specimenPropertyPaths = Arrays.asList(new String[] { + "descriptions", + "derivationEvents.derivates", + "annotations", + "markers", + "credits", + "extensions", + "rights", + "sources" + }); + Map> specimenPropertyPathMap = + new HashMap>(); + specimenPropertyPathMap.put(SpecimenOrObservationBase.class,specimenPropertyPaths); + return specimenPropertyPathMap; + } + } diff --git a/eu.etaxonomy.taxeditor.editor/src/main/java/eu/etaxonomy/taxeditor/editor/view/derivate/handler/CreateFieldUnitHandler.java b/eu.etaxonomy.taxeditor.editor/src/main/java/eu/etaxonomy/taxeditor/editor/view/derivate/handler/CreateFieldUnitHandler.java index e57cbfbf7..5129e44c5 100644 --- a/eu.etaxonomy.taxeditor.editor/src/main/java/eu/etaxonomy/taxeditor/editor/view/derivate/handler/CreateFieldUnitHandler.java +++ b/eu.etaxonomy.taxeditor.editor/src/main/java/eu/etaxonomy/taxeditor/editor/view/derivate/handler/CreateFieldUnitHandler.java @@ -5,6 +5,7 @@ import org.eclipse.core.commands.ExecutionEvent; import org.eclipse.core.commands.ExecutionException; import eu.etaxonomy.cdm.api.service.IOccurrenceService; +import eu.etaxonomy.cdm.model.common.CdmBase; import eu.etaxonomy.cdm.model.occurrence.FieldUnit; import eu.etaxonomy.taxeditor.editor.view.derivate.DerivateView; import eu.etaxonomy.taxeditor.editor.view.derivate.DerivateViewEditorInput; @@ -23,10 +24,10 @@ public class CreateFieldUnitHandler extends AbstractHandler { return null; } FieldUnit fieldUnit = FieldUnit.NewInstance(); - CdmStore.getService(IOccurrenceService.class).save(fieldUnit); + fieldUnit = CdmBase.deproxy(CdmStore.getService(IOccurrenceService.class).save(fieldUnit), FieldUnit.class); derivateView.getConversationHolder().commit(); DerivateViewEditorInput input = (DerivateViewEditorInput) derivateView.getEditorInput(); - input.addRootUuid(fieldUnit.getUuid()); + input.addRootEntity(fieldUnit); derivateView.refreshTree(); } return null; diff --git a/eu.etaxonomy.taxeditor.store/src/main/java/eu/etaxonomy/taxeditor/editor/CdmEntitySessionInput.java b/eu.etaxonomy.taxeditor.store/src/main/java/eu/etaxonomy/taxeditor/editor/CdmEntitySessionInput.java index 7b83c4bce..8b9362d18 100644 --- a/eu.etaxonomy.taxeditor.store/src/main/java/eu/etaxonomy/taxeditor/editor/CdmEntitySessionInput.java +++ b/eu.etaxonomy.taxeditor.store/src/main/java/eu/etaxonomy/taxeditor/editor/CdmEntitySessionInput.java @@ -23,9 +23,15 @@ import eu.etaxonomy.taxeditor.store.CdmStore; */ public abstract class CdmEntitySessionInput implements ICdmEntitySessionEnabled { - private final ICdmEntitySession cdmEntitySession; + private ICdmEntitySession cdmEntitySession; - public CdmEntitySessionInput() { + public CdmEntitySessionInput(boolean init) { + if(init) { + initSession(); + } + } + + protected void initSession() { cdmEntitySession = CdmStore.getCurrentSessionManager().newSession(this, true); } diff --git a/eu.etaxonomy.taxeditor.store/src/main/java/eu/etaxonomy/taxeditor/ui/element/LanguageStringWithLabelElement.java b/eu.etaxonomy.taxeditor.store/src/main/java/eu/etaxonomy/taxeditor/ui/element/LanguageStringWithLabelElement.java index 084e57634..8c3993f43 100644 --- a/eu.etaxonomy.taxeditor.store/src/main/java/eu/etaxonomy/taxeditor/ui/element/LanguageStringWithLabelElement.java +++ b/eu.etaxonomy.taxeditor.store/src/main/java/eu/etaxonomy/taxeditor/ui/element/LanguageStringWithLabelElement.java @@ -75,6 +75,14 @@ public class LanguageStringWithLabelElement extends TextWithLabelElement { return languageString; } + public LanguageString updateLanguageString(LanguageString ls) { + if(ls == null){ + ls = LanguageString.NewInstance("", CdmStore.getDefaultLanguage()); + } + ls.setText(text.getText()); + return ls; + } + /** {@inheritDoc} */ @Override public void modifyText(ModifyEvent e) { diff --git a/eu.etaxonomy.taxeditor.store/src/main/java/eu/etaxonomy/taxeditor/ui/section/occurrence/FieldUnitGeneralDetailElement.java b/eu.etaxonomy.taxeditor.store/src/main/java/eu/etaxonomy/taxeditor/ui/section/occurrence/FieldUnitGeneralDetailElement.java index e511bf6eb..b26451ff9 100644 --- a/eu.etaxonomy.taxeditor.store/src/main/java/eu/etaxonomy/taxeditor/ui/section/occurrence/FieldUnitGeneralDetailElement.java +++ b/eu.etaxonomy.taxeditor.store/src/main/java/eu/etaxonomy/taxeditor/ui/section/occurrence/FieldUnitGeneralDetailElement.java @@ -112,7 +112,7 @@ public class FieldUnitGeneralDetailElement extends AbstractCdmDetailElement(); if(inputElement instanceof Set){ for (Object o: (Set)inputElement) { - if(o instanceof UUID){ - UUID uuid = (UUID)o; - SpecimenOrObservationBase rootElement = CdmStore.getService(IOccurrenceService.class).load(uuid); + if(o instanceof SpecimenOrObservationBase){ + SpecimenOrObservationBase rootElement = (SpecimenOrObservationBase)o; if(rootElement!=null){ rootNodes.add(new TreeNode(rootElement)); } diff --git a/eu.etaxonomy.taxeditor.store/src/main/java/eu/etaxonomy/taxeditor/view/derivateSearch/DerivateLabelProvider.java b/eu.etaxonomy.taxeditor.store/src/main/java/eu/etaxonomy/taxeditor/view/derivateSearch/DerivateLabelProvider.java index 99a1d883d..98bf707de 100644 --- a/eu.etaxonomy.taxeditor.store/src/main/java/eu/etaxonomy/taxeditor/view/derivateSearch/DerivateLabelProvider.java +++ b/eu.etaxonomy.taxeditor.store/src/main/java/eu/etaxonomy/taxeditor/view/derivateSearch/DerivateLabelProvider.java @@ -19,7 +19,6 @@ import org.eclipse.swt.graphics.Image; import org.hibernate.LazyInitializationException; import eu.etaxonomy.cdm.api.conversation.ConversationHolder; -import eu.etaxonomy.cdm.api.service.IOccurrenceService; import eu.etaxonomy.cdm.hibernate.HibernateProxyHelper; import eu.etaxonomy.cdm.model.common.CdmBase; import eu.etaxonomy.cdm.model.common.DefinedTerm; @@ -164,10 +163,6 @@ public class DerivateLabelProvider extends ColumnLabelProvider { FieldUnit fieldUnit = (FieldUnit)derivate; if(fieldUnit.getGatheringEvent()!=null){ GatheringEvent gatheringEvent = fieldUnit.getGatheringEvent(); - if(CdmStore.getService(IOccurrenceService.class).exists(fieldUnit.getUuid())){ - fieldUnit = (FieldUnit) CdmStore.getService(IOccurrenceService.class).load(fieldUnit.getUuid()); - gatheringEvent = fieldUnit.getGatheringEvent(); - } label += gatheringEvent.getCountry()!=null?gatheringEvent.getCountry().getLabel()+separator:emptyString; label += gatheringEvent.getLocality()!=null?gatheringEvent.getLocality().getText()+separator:emptyString; label += gatheringEvent.getGatheringDate()!=null?gatheringEvent.getGatheringDate()+separator:emptyString; @@ -220,16 +215,21 @@ public class DerivateLabelProvider extends ColumnLabelProvider { else if(derivate instanceof DerivedUnit){ DerivedUnit derivedUnit = (DerivedUnit)derivate; if(derivedUnit.getRecordBasis()==SpecimenOrObservationType.PreservedSpecimen){ - java.util.Collection fieldUnits = CdmStore.getService(IOccurrenceService.class).getFieldUnits(derivedUnit.getUuid()); - if(fieldUnits!=null && !fieldUnits.isEmpty()){ - FieldUnit fieldUnit = fieldUnits.iterator().next(); - GatheringEvent gatheringEvent = fieldUnit.getGatheringEvent(); -// gatheringEvent = HibernateProxyHelper.deproxy(gatheringEvent, GatheringEvent.class); - if(gatheringEvent!=null){ - label += gatheringEvent.getCollector()!=null?gatheringEvent.getCollector()+separator:emptyString; + //java.util.Collection fieldUnits = CdmStore.getService(IOccurrenceService.class).getFieldUnits(derivedUnit.getUuid()); + //TODO : This is not generic anymore for performance reasons + Set originals = derivedUnit.getOriginals(); + if(originals.size() ==1) { + SpecimenOrObservationBase specimen = originals.iterator().next(); + if(specimen instanceof FieldUnit) { + FieldUnit fieldUnit = (FieldUnit)specimen; + GatheringEvent gatheringEvent = fieldUnit.getGatheringEvent(); + if(gatheringEvent!=null){ + label += gatheringEvent.getCollector()!=null?gatheringEvent.getCollector()+separator:emptyString; + } + label += fieldUnit.getFieldNumber()!=null?fieldUnit.getFieldNumber()+separator:emptyString; } - label += fieldUnit.getFieldNumber()!=null?fieldUnit.getFieldNumber()+separator:emptyString; } + eu.etaxonomy.cdm.model.occurrence.Collection collection = derivedUnit.getCollection(); if(collection!=null){ label += collection.getCode()!=null?"("+collection.getCode()+")"+separator:emptyString;