Project

General

Profile

Download (7.35 KB) Statistics
| Branch: | Tag: | Revision:
1
// $Id$
2
/**
3
* Copyright (C) 2007 EDIT
4
* European Distributed Institute of Taxonomy 
5
* http://www.e-taxonomy.eu
6
* 
7
* The contents of this file are subject to the Mozilla Public License Version 1.1
8
* See LICENSE.TXT at the top of this package for the full license terms.
9
*/
10

    
11
package eu.etaxonomy.taxeditor.store;
12

    
13
import java.io.File;
14
import java.io.FileNotFoundException;
15
import java.lang.reflect.InvocationTargetException;
16

    
17
import org.eclipse.core.runtime.IPath;
18
import org.eclipse.core.runtime.IProgressMonitor;
19
import org.eclipse.core.runtime.ListenerList;
20
import org.eclipse.jface.dialogs.ProgressMonitorDialog;
21
import org.eclipse.jface.operation.IRunnableWithProgress;
22
import org.eclipse.ui.IMemento;
23
import org.eclipse.ui.IWorkbench;
24
import org.eclipse.ui.IWorkbenchListener;
25
import org.eclipse.ui.PlatformUI;
26
import org.eclipse.ui.XMLMemento;
27

    
28
import eu.etaxonomy.taxeditor.model.IContextListener;
29
import eu.etaxonomy.taxeditor.model.MementoHelper;
30
import eu.etaxonomy.taxeditor.model.MessagingUtils;
31
import eu.etaxonomy.taxeditor.store.internal.TaxeditorStorePlugin;
32

    
33
/**
34
 * The context manager mediates context start/stop and workbench shutdowns to all registered listeners.
35
 *
36
 * @author n.hoffmann
37
 * @created Sep 30, 2010
38
 * @version 1.0
39
 */
40
public class ContextManager implements IWorkbenchListener{
41
	
42
	private ListenerList contextListeners = new ListenerList();
43

    
44
	private IMemento memento;
45
		
46
	/**
47
	 * <p>Constructor for ContextManager.</p>
48
	 */
49
	protected ContextManager() {
50
		PlatformUI.getWorkbench().addWorkbenchListener(this);
51
	}
52
	
53
	/**
54
	 * <p>addContextListener</p>
55
	 *
56
	 * @param listener a {@link eu.etaxonomy.taxeditor.model.IContextListener} object.
57
	 */
58
	public void addContextListener(IContextListener listener){
59
		contextListeners.add(listener);
60
	}
61
	
62
	/**
63
	 * <p>removeContextListener</p>
64
	 *
65
	 * @param listener a {@link eu.etaxonomy.taxeditor.model.IContextListener} object.
66
	 */
67
	public void removeContextListener(IContextListener listener) {
68
		contextListeners.remove(listener);
69
	}
70
	
71
	/**
72
	 * <p>notifyContextStart</p>
73
	 */
74
	public void notifyContextStart() {
75
		MessagingUtils.info("Notifying context listeners, that the context has started.");
76
		ProgressMonitorDialog dialog = new ProgressMonitorDialog(StoreUtil.getShell());
77
		
78
		try {
79
			dialog.run(false, false, new IRunnableWithProgress() {
80
				/* (non-Javadoc)
81
				 * @see org.eclipse.jface.operation.IRunnableWithProgress#run(org.eclipse.core.runtime.IProgressMonitor)
82
				 */
83
				@Override
84
				public void run(IProgressMonitor monitor)
85
						throws InvocationTargetException, InterruptedException {
86
					monitor.beginTask("Starting context", contextListeners.size());
87
					
88
					
89
					readMemento();				
90
					
91
					for(final Object listener : contextListeners.getListeners()){
92
						((IContextListener) listener).contextStart(memento, monitor);
93
						monitor.worked(1);
94
					}
95
					monitor.done();
96
				}
97
			});
98
		} catch (InvocationTargetException e) {
99
			MessagingUtils.error(getClass(), e);
100
		} catch (InterruptedException e) {
101
			MessagingUtils.error(getClass(), e);
102
		}
103
	}
104
	
105

    
106
	/**
107
	 * 
108
	 */
109
	public void notifyContextRefresh() {
110
		MessagingUtils.info("Notifying context listeners, that the context needs to be refreshed.");
111
		ProgressMonitorDialog dialog = new ProgressMonitorDialog(StoreUtil.getShell());
112
		
113
		try {
114
			dialog.run(false, false, new IRunnableWithProgress() {
115
				/* (non-Javadoc)
116
				 * @see org.eclipse.jface.operation.IRunnableWithProgress#run(org.eclipse.core.runtime.IProgressMonitor)
117
				 */
118
				@Override
119
				public void run(IProgressMonitor monitor)
120
						throws InvocationTargetException, InterruptedException {
121
					monitor.beginTask("Refreshing context", contextListeners.size());			
122
					
123
					for(final Object listener : contextListeners.getListeners()){
124
						((IContextListener) listener).contextRefresh(monitor);
125
						monitor.worked(1);
126
					}
127
					monitor.done();
128
				}
129
			});
130
		} catch (InvocationTargetException e) {
131
			MessagingUtils.error(getClass(), e);
132
		} catch (InterruptedException e) {
133
			MessagingUtils.error(getClass(), e);
134
		}
135
	}
136
	
137
	/**
138
	 * <p>notifyContextAboutToStop</p>
139
	 *
140
	 * @param monitor a {@link org.eclipse.core.runtime.IProgressMonitor} object.
141
	 */
142
	public void notifyContextAboutToStop(final IProgressMonitor monitor){
143

    
144
		IProgressMonitor subMonitor = StoreUtil.getSubProgressMonitor(monitor, 1);
145

    
146
		subMonitor.beginTask("Stoping context", contextListeners.size());
147
		// we are creating the memento here; even if the context is not stopped
148
		createMemento();
149
		
150
		for(final Object listener : contextListeners.getListeners()){
151
			((IContextListener) listener).contextAboutToStop(memento, subMonitor);
152
			subMonitor.worked(1);
153
		}	
154
		
155
		subMonitor.done();
156
	}
157
	
158
	/**
159
	 * <p>notifyContextStop</p>
160
	 *
161
	 * @param monitor a {@link org.eclipse.core.runtime.IProgressMonitor} object.
162
	 */
163
	public void notifyContextStop(IProgressMonitor monitor) {
164
		
165
		IProgressMonitor subMonitor = StoreUtil.getSubProgressMonitor(monitor, 1);
166

    
167
		subMonitor.beginTask("Stoping context", contextListeners.size());
168
		MessagingUtils.info("Notifying context listeners, that the context has stopped.");
169
				
170
		for(Object listener : contextListeners.getListeners()){
171
			((IContextListener) listener).contextStop(memento, subMonitor);
172
			subMonitor.worked(1);
173
		}	
174

    
175
		saveMemento();
176
		subMonitor.done();
177
	}
178
	
179
	/* (non-Javadoc)
180
	 * @see org.eclipse.ui.IWorkbenchListener#preShutdown(org.eclipse.ui.IWorkbench, boolean)
181
	 */
182
	/** {@inheritDoc} */
183
	@Override
184
	public boolean preShutdown(IWorkbench workbench, boolean forced) {
185

    
186
		createMemento();
187
		
188
		IProgressMonitor monitor = null;
189
		
190
		for(Object listener : contextListeners.getListeners()){
191
			((IContextListener) listener).workbenchShutdown(memento, monitor);
192
		}	
193
		
194
		saveMemento();
195
		
196
		// return true in any case, otherwise the application will not stop
197
		return true;
198
	}
199

    
200
	/* (non-Javadoc)
201
	 * @see org.eclipse.ui.IWorkbenchListener#postShutdown(org.eclipse.ui.IWorkbench)
202
	 */
203
	/** {@inheritDoc} */
204
	@Override
205
	public void postShutdown(IWorkbench workbench) {
206
		
207
		
208
	}
209
	
210
	
211
	private void readMemento(){
212
		try {
213
			memento = MementoHelper.readMementoFromFile(getStateFileForCurrentDatabase());
214
		} catch (FileNotFoundException e) {
215
			// no memento -> no previous state
216
			MessagingUtils.info("No state file for datasource");
217
		}
218
	}
219
	
220
	private void createMemento(){
221
		
222
		if (CdmStore.getActiveCdmSource() != null) {
223
			
224
			try {
225
				String name = CdmStore.getActiveCdmSource().getName();
226
				name = name.trim();
227
				name = name.replace(" ", "_");
228
				memento = XMLMemento.createWriteRoot(name);
229
			
230
				MessagingUtils.info("DataSource found. Memento created.");
231
			} catch (Exception e) {
232
				// The memento could not be created, but a not closable editor is avoided for this case.
233
				MessagingUtils.error(this.getClass(), "The memento could not be created", e);
234
			}
235
		} else {
236
			MessagingUtils.info("Not storing state data, because no DataSource present.");
237
		}
238
		
239
	}
240
	
241
	private boolean saveMemento(){
242
		return MementoHelper.saveMementoToFile(memento, getStateFileForCurrentDatabase()) != null;
243
	}
244
	
245
	/**
246
	 * <p>getStateFileForCurrentDatabase</p>
247
	 *
248
	 * @return a {@link java.io.File} object.
249
	 */
250
	protected File getStateFileForCurrentDatabase() {
251
		if(CdmStore.getActiveCdmSource() == null){
252
			return null;
253
		}
254
		
255
		IPath path = TaxeditorStorePlugin.getDefault().getStateLocation();
256
		if (path == null) {
257
			return null;
258
		}
259
		path = path.append("editor_state_" + CdmStore.getActiveCdmSource().getName() + ".xml");
260
		return path.toFile();
261
	}
262

    
263
}
(3-3/9)