638fac3de3c9202878fb68b343d13f1e8b90fa59
[taxeditor.git] / eu.etaxonomy.taxeditor.navigation / src / main / java / eu / etaxonomy / taxeditor / navigation / navigator / TaxonNavigatorDataChangeBehavior.java
1 /**
2 * Copyright (C) 2007 EDIT
3 * European Distributed Institute of Taxonomy
4 * http://www.e-taxonomy.eu
5 *
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.
8 */
9
10 package eu.etaxonomy.taxeditor.navigation.navigator;
11
12 import java.util.HashSet;
13 import java.util.Set;
14
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;
21
22 import eu.etaxonomy.cdm.model.common.CdmBase;
23 import eu.etaxonomy.cdm.model.name.TaxonNameBase;
24 import eu.etaxonomy.cdm.model.taxon.ITaxonTreeNode;
25 import eu.etaxonomy.cdm.model.taxon.Taxon;
26 import eu.etaxonomy.cdm.persistence.hibernate.CdmDataChangeEvent;
27 import eu.etaxonomy.cdm.persistence.hibernate.CdmDataChangeEvent.EventType;
28 import eu.etaxonomy.cdm.persistence.hibernate.CdmDataChangeMap;
29 import eu.etaxonomy.taxeditor.model.AbstractDataChangeBehaviour;
30 import eu.etaxonomy.taxeditor.model.IDataChangeBehavior;
31 import eu.etaxonomy.taxeditor.navigation.NavigationUtil;
32
33 /**
34 * <p>TaxonNavigatorDataChangeBehavior class.</p>
35 *
36 * @author n.hoffmann
37 * @created 01.04.2009
38 * @version 1.0
39 */
40 public class TaxonNavigatorDataChangeBehavior extends AbstractDataChangeBehaviour implements
41 IDataChangeBehavior {
42
43 private final TaxonNavigator source;
44
45 private Set<CdmBase> staleObjects;
46
47 /**
48 * <p>Constructor for TaxonNavigatorDataChangeBehavior.</p>
49 *
50 * @param taxonNavigator a {@link eu.etaxonomy.taxeditor.navigation.navigator.TaxonNavigator} object.
51 */
52 public TaxonNavigatorDataChangeBehavior(TaxonNavigator taxonNavigator) {
53 source = taxonNavigator;
54 }
55
56 /* (non-Javadoc)
57 * @see eu.etaxonomy.taxeditor.store.model.IDataChangeBehavior#isRelevant(java.lang.Object, eu.etaxonomy.cdm.persistence.hibernate.CdmCrudEvent)
58 */
59 /**
60 * <p>isRelevant</p>
61 *
62 * @param events a {@link eu.etaxonomy.cdm.persistence.hibernate.CdmDataChangeMap} object.
63 * @return a boolean.
64 */
65 public boolean isRelevant(CdmDataChangeMap events) {
66
67 // TODO react only on insert/update/delete of taxon and synonym objects
68 // and on update of name objects
69 boolean relevant = false;
70 staleObjects = new HashSet<CdmBase>();
71
72 for(CdmDataChangeEvent event : events.getAllEvents()){
73 EventType eventType = event.getEventType();
74 CdmBase eventEntity = event.getEntity();
75
76 // all tree node changes are relevant
77 if((eventType == EventType.INSERT || eventType == EventType.DELETE || eventType == EventType.UPDATE)
78 && event.getEntity() instanceof ITaxonTreeNode){
79 return true;
80 }
81
82 // name updates of the accepted taxon of open editors are relevant
83 if(eventType == EventType.UPDATE && event.getEntity() instanceof TaxonNameBase){
84 TaxonNameBase name = null;
85 if(eventEntity instanceof TaxonNameBase){
86 name = (TaxonNameBase) eventEntity;
87 }else if(eventEntity instanceof Taxon){
88 name = ((Taxon) eventEntity).getName();
89 }else{
90 continue;
91 }
92
93 Set<IEditorPart> openEditors = NavigationUtil.getOpenEditors();
94 /*for(IEditorPart editor : openEditors){
95
96 if(name.equals(((TaxonEditorInput) editor.getEditorInput()).getTaxon().getName())){
97 return true;
98 }
99 }*/
100 }
101 if (eventType == EventType.DELETE){
102 return true;
103 }
104
105 if(eventType == EventType.UPDATE && event.getEntity() instanceof Taxon){
106 TaxonNameBase name = null;
107 if(eventEntity instanceof Taxon){
108 name = ((Taxon) eventEntity).getName();
109 }else{
110 continue;
111 }
112
113 // Set<IEditorPart> openEditors = NavigationUtil.getOpenEditors();
114 /*for(IEditorPart editor : openEditors){
115
116 if(name.equals(((TaxonEditorInput) editor.getEditorInput()).getTaxon().getName())){
117 return true;
118 }
119 }*/
120 }
121
122 // if(eventType == EventType.UPDATE){
123 // relevant = true;
124 // CdmBase entity = event.getEntity();
125 // if((entity instanceof TaxonNameBase)
126 // || (entity instanceof Taxon)
127 // || (entity instanceof Synonym)){
128 // staleObjects.add(entity);
129 // }
130 // }
131 }
132
133 return false;
134
135 // @deprecated
136 // react on everything except load
137 // if(events.sizeByEventType(EventType.INSERT) > 0){
138 // return true;
139 // }else if(events.sizeByEventType(EventType.UPDATE) > 0){
140 // return true;
141 // }else if(events.sizeByEventType(EventType.DELETE) > 0){
142 // return true;
143 // }else{
144 // return false;
145 // }
146 }
147
148 /* (non-Javadoc)
149 * @see eu.etaxonomy.taxeditor.store.model.IDataChangeBehavior#reactOnDataChange(java.lang.Object, eu.etaxonomy.cdm.persistence.hibernate.CdmCrudEvent)
150 */
151 /** {@inheritDoc} */
152 @Override
153 public void reactOnDataChange(CdmDataChangeMap events) {
154 if(isRelevant(events)){
155
156 final Display display = Display.getCurrent();
157 Job job = new Job("Updating Taxon Navigator") {
158
159 @Override
160 protected IStatus run(IProgressMonitor monitor) {
161 monitor.beginTask("Updating Taxon Navigator", 3);
162 monitor.worked(1);
163
164 // clear the session completely
165 monitor.subTask("Clearing Taxon Navigators session");
166 display.asyncExec(new Runnable() {
167 @Override
168 public void run() {
169 source.getConversationHolder().clear();
170 }
171 });
172 // FIXME completely clearing the session is a brute force approach.
173 // It would be much more elegant to clear only those elements that have been changed.
174 // I could not get that to work but we should consider workin on this because we might
175 // run into serious performance issues, especially when it comes to large trees
176 //
177 // at least, we moved this to a job so it can run in a background thred
178 // seems to improve the situation but not sure if final solution
179 monitor.worked(1);
180
181 monitor.subTask("Refreshing viewer");
182
183 display.asyncExec(new Runnable() {
184 @Override
185 public void run() {
186 source.refresh();
187 }
188 });
189
190
191
192 monitor.worked(1);
193 monitor.done();
194 return Status.OK_STATUS;
195 }
196 };
197
198 job.setPriority(Job.SHORT);
199 job.schedule();
200
201 }
202 }
203 }