2 * Copyright (C) 2007 EDIT
3 * European Distributed Institute of Taxonomy
4 * http://www.e-taxonomy.eu
6 * The contents of this file are subject to the Mozilla Public License Version 1.1
7 * See LICENSE.TXT at the top of this package for the full license terms.
10 package eu
.etaxonomy
.taxeditor
.navigation
.navigator
;
12 import java
.util
.HashSet
;
15 import org
.eclipse
.core
.runtime
.IProgressMonitor
;
16 import org
.eclipse
.core
.runtime
.IStatus
;
17 import org
.eclipse
.core
.runtime
.Status
;
18 import org
.eclipse
.core
.runtime
.jobs
.Job
;
19 import org
.eclipse
.swt
.widgets
.Display
;
20 import org
.eclipse
.ui
.IEditorPart
;
22 import eu
.etaxonomy
.cdm
.hibernate
.HibernateProxyHelper
;
23 import eu
.etaxonomy
.cdm
.model
.common
.CdmBase
;
24 import eu
.etaxonomy
.cdm
.model
.name
.TaxonName
;
25 import eu
.etaxonomy
.cdm
.model
.taxon
.ITaxonTreeNode
;
26 import eu
.etaxonomy
.cdm
.model
.taxon
.Taxon
;
27 import eu
.etaxonomy
.cdm
.persistence
.hibernate
.CdmDataChangeEvent
;
28 import eu
.etaxonomy
.cdm
.persistence
.hibernate
.CdmDataChangeEvent
.EventType
;
29 import eu
.etaxonomy
.cdm
.persistence
.hibernate
.CdmDataChangeMap
;
30 import eu
.etaxonomy
.taxeditor
.model
.AbstractDataChangeBehaviour
;
31 import eu
.etaxonomy
.taxeditor
.model
.IDataChangeBehavior
;
32 import eu
.etaxonomy
.taxeditor
.navigation
.NavigationUtil
;
33 import eu
.etaxonomy
.taxeditor
.navigation
.l10n
.Messages
;
36 * <p>TaxonNavigatorDataChangeBehavior class.</p>
42 public class TaxonNavigatorDataChangeBehavior
extends AbstractDataChangeBehaviour
implements
45 private static final String UPDATING_TAXON_NAVIGATOR
= Messages
.TaxonNavigatorDataChangeBehavior_UPDATE_NAVIGATOR
;
47 private final TaxonNavigator source
;
49 private Set
<CdmBase
> staleObjects
;
52 * <p>Constructor for TaxonNavigatorDataChangeBehavior.</p>
54 * @param taxonNavigator a {@link eu.etaxonomy.taxeditor.navigation.navigator.TaxonNavigator} object.
56 public TaxonNavigatorDataChangeBehavior(TaxonNavigator taxonNavigator
) {
57 source
= taxonNavigator
;
61 * @see eu.etaxonomy.taxeditor.store.model.IDataChangeBehavior#isRelevant(java.lang.Object, eu.etaxonomy.cdm.persistence.hibernate.CdmCrudEvent)
66 * @param events a {@link eu.etaxonomy.cdm.persistence.hibernate.CdmDataChangeMap} object.
69 public boolean isRelevant(CdmDataChangeMap events
) {
71 // TODO react only on insert/update/delete of taxon and synonym objects
72 // and on update of name objects
73 boolean relevant
= false;
74 staleObjects
= new HashSet
<CdmBase
>();
76 for(CdmDataChangeEvent event
: events
.getAllEvents()){
77 EventType eventType
= event
.getEventType();
78 CdmBase eventEntity
= event
.getEntity();
80 Set
<CdmBase
> affectedObjects
= event
.getAffectedObjects();
81 if(affectedObjects
!= null) {
82 for(CdmBase cb
: affectedObjects
) {
83 staleObjects
.add(HibernateProxyHelper
.deproxy(cb
));
87 // all tree node changes are relevant
88 if((eventType
== EventType
.INSERT
|| eventType
== EventType
.DELETE
|| eventType
== EventType
.UPDATE
)
89 && event
.getEntity() instanceof ITaxonTreeNode
){
93 // name updates of the accepted taxon of open editors are relevant
94 if(eventType
== EventType
.UPDATE
&& event
.getEntity() instanceof TaxonName
){
95 TaxonName name
= null;
96 if(eventEntity
instanceof TaxonName
){
97 name
= (TaxonName
) eventEntity
;
98 }else if(eventEntity
instanceof Taxon
){
99 name
= ((Taxon
) eventEntity
).getName();
104 Set
<IEditorPart
> openEditors
= NavigationUtil
.getOpenEditors();
105 /*for(IEditorPart editor : openEditors){
107 if(name.equals(((TaxonEditorInput) editor.getEditorInput()).getTaxon().getName())){
112 if (eventType
== EventType
.DELETE
){
118 if(eventType
== EventType
.UPDATE
&& event
.getEntity() instanceof Taxon
){
119 TaxonName name
= null;
120 if(eventEntity
instanceof Taxon
){
121 name
= ((Taxon
) eventEntity
).getName();
126 // Set<IEditorPart> openEditors = NavigationUtil.getOpenEditors();
127 /*for(IEditorPart editor : openEditors){
129 if(name.equals(((TaxonEditorInput) editor.getEditorInput()).getTaxon().getName())){
135 // if(eventType == EventType.UPDATE){
137 // CdmBase entity = event.getEntity();
138 // if((entity instanceof TaxonNameBase)
139 // || (entity instanceof Taxon)
140 // || (entity instanceof Synonym)){
141 // staleObjects.add(entity);
149 // react on everything except load
150 // if(events.sizeByEventType(EventType.INSERT) > 0){
152 // }else if(events.sizeByEventType(EventType.UPDATE) > 0){
154 // }else if(events.sizeByEventType(EventType.DELETE) > 0){
163 public void reactOnDataChange(CdmDataChangeMap events
) {
164 if(isRelevant(events
)){
166 final Display display
= Display
.getCurrent();
167 Job job
= new Job(UPDATING_TAXON_NAVIGATOR
) {
170 protected IStatus
run(IProgressMonitor monitor
) {
171 monitor
.beginTask(UPDATING_TAXON_NAVIGATOR
, 3);
174 // clear the session completely
175 monitor
.subTask(Messages
.TaxonNavigatorDataChangeBehavior_CLEAR_SESSION
);
176 display
.asyncExec(new Runnable() {
179 source
.getConversationHolder().clear();
182 // FIXME completely clearing the session is a brute force approach.
183 // It would be much more elegant to clear only those elements that have been changed.
184 // I could not get that to work but we should consider workin on this because we might
185 // run into serious performance issues, especially when it comes to large trees
187 // at least, we moved this to a job so it can run in a background thred
188 // seems to improve the situation but not sure if final solution
191 monitor
.subTask(Messages
.TaxonNavigatorDataChangeBehavior_REFRESH_VIEWER
);
193 display
.asyncExec(new Runnable() {
196 if(staleObjects
!= null && staleObjects
.size() > 0) {
197 source
.refresh(staleObjects
);
208 return Status
.OK_STATUS
;
212 job
.setPriority(Job
.SHORT
);