Project

General

Profile

Download (6.19 KB) Statistics
| Branch: | Tag: | Revision:
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.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 ITaxonTreeNode){
80
				return true;
81
			}
82
			
83
			// name updates of the accepted taxon of open editors are relevant
84
			if(eventType == EventType.UPDATE && event.getEntity() instanceof TaxonNameBase){
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
			if (eventType == EventType.DELETE){
103
				return true;
104
			}
105
			
106
			if(eventType == EventType.UPDATE && event.getEntity() instanceof Taxon){
107
				TaxonNameBase name = null;
108
				if(eventEntity instanceof Taxon){
109
					name = ((Taxon) eventEntity).getName();
110
				}else{
111
					continue;
112
				}
113
				
114
				Set<IEditorPart> openEditors = NavigationUtil.getOpenEditors();
115
				/*for(IEditorPart editor : openEditors){
116
					
117
					if(name.equals(((TaxonEditorInput) editor.getEditorInput()).getTaxon().getName())){
118
						return true;
119
					}
120
				}*/
121
			}
122
			
123
//			if(eventType == EventType.UPDATE){
124
//				relevant = true;
125
//				CdmBase entity = event.getEntity();
126
//				if((entity instanceof TaxonNameBase)
127
//						|| (entity instanceof Taxon)
128
//						|| (entity instanceof Synonym)){
129
//					staleObjects.add(entity);
130
//				}
131
//			}
132
		}
133
		
134
		return false;
135
		
136
		// @deprecated
137
		// react on everything except load
138
//		if(events.sizeByEventType(EventType.INSERT) > 0){
139
//			return true;
140
//		}else if(events.sizeByEventType(EventType.UPDATE) > 0){
141
//			return true;
142
//		}else if(events.sizeByEventType(EventType.DELETE) > 0){
143
//			return true;
144
//		}else{
145
//			return false;
146
//		}
147
	}
148

    
149
	/* (non-Javadoc)
150
	 * @see eu.etaxonomy.taxeditor.store.model.IDataChangeBehavior#reactOnDataChange(java.lang.Object, eu.etaxonomy.cdm.persistence.hibernate.CdmCrudEvent)
151
	 */
152
	/** {@inheritDoc} */
153
	@Override
154
	public void reactOnDataChange(CdmDataChangeMap events) {
155
		if(isRelevant(events)){
156

    
157
			final Display display = Display.getCurrent();
158
			Job job = new Job("Updating Taxon Navigator") {
159
				
160
				@Override
161
				protected IStatus run(IProgressMonitor monitor) {
162
					monitor.beginTask("Updating Taxon Navigator", 3);
163
					monitor.worked(1);
164
					
165
					// clear the session completely
166
					monitor.subTask("Clearing Taxon Navigators session");
167
					System.out.println("Clearing Taxon Navigators session");
168
					display.asyncExec(new Runnable() {
169
						 @Override
170
						 public void run() {
171
							 source.getConversationHolder().clear();
172
						 }
173
					});					
174
					// FIXME completely clearing the session is a brute force approach. 
175
					// It would be much more elegant to clear only those elements that have been changed.
176
					// I could not get that to work but we should consider workin on this because we might
177
					// run into serious performance issues, especially when it comes to large trees
178
					//
179
					// at least, we moved this to a job so it can run in a background thred
180
					// seems to improve the situation but not sure if final solution
181
					monitor.worked(1);
182
					
183
					monitor.subTask("Refreshing viewer");
184
					
185
					display.asyncExec(new Runnable() {
186
					    @Override
187
					    public void run() {
188
					    	source.refresh();
189
					    }
190
					});
191
					
192
					
193
					
194
					monitor.worked(1);
195
					monitor.done();
196
					return Status.OK_STATUS;
197
				}
198
			};
199
			
200
			job.setPriority(Job.SHORT);
201
			job.schedule();
202
			
203
		}
204
	}
205
}
(10-10/14)