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