Project

General

Profile

Download (14.7 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.bulkeditor.referencingobjects;
11

    
12
import java.util.ArrayList;
13
import java.util.Collections;
14
import java.util.Comparator;
15
import java.util.List;
16
import java.util.Set;
17
import java.util.UUID;
18

    
19
import org.apache.log4j.Logger;
20
import org.eclipse.core.runtime.IProgressMonitor;
21
import org.eclipse.core.runtime.IStatus;
22
import org.eclipse.core.runtime.Status;
23
import org.eclipse.core.runtime.jobs.Job;
24
import org.eclipse.jface.action.MenuManager;
25
import org.eclipse.jface.viewers.CellEditor;
26
import org.eclipse.jface.viewers.ICellModifier;
27
import org.eclipse.jface.viewers.ISelection;
28
import org.eclipse.jface.viewers.IStructuredSelection;
29
import org.eclipse.jface.viewers.ITableLabelProvider;
30
import org.eclipse.jface.viewers.TableViewer;
31
import org.eclipse.jface.viewers.TableViewerColumn;
32
import org.eclipse.jface.viewers.TextCellEditor;
33
import org.eclipse.jface.viewers.TreeNode;
34
import org.eclipse.jface.viewers.Viewer;
35
import org.eclipse.swt.SWT;
36
import org.eclipse.swt.widgets.Composite;
37
import org.eclipse.swt.widgets.Control;
38
import org.eclipse.swt.widgets.Display;
39
import org.eclipse.swt.widgets.Menu;
40
import org.eclipse.swt.widgets.Table;
41
import org.eclipse.ui.IWorkbenchPart;
42

    
43
import eu.etaxonomy.cdm.api.conversation.ConversationHolder;
44
import eu.etaxonomy.cdm.api.service.IAgentService;
45
import eu.etaxonomy.cdm.api.service.IDescriptionService;
46
import eu.etaxonomy.cdm.api.service.IEventBaseService;
47
import eu.etaxonomy.cdm.api.service.IGroupService;
48
import eu.etaxonomy.cdm.api.service.IMediaService;
49
import eu.etaxonomy.cdm.api.service.INameService;
50
import eu.etaxonomy.cdm.api.service.IOccurrenceService;
51
import eu.etaxonomy.cdm.api.service.IPolytomousKeyNodeService;
52
import eu.etaxonomy.cdm.api.service.IPolytomousKeyService;
53
import eu.etaxonomy.cdm.api.service.IReferenceService;
54
import eu.etaxonomy.cdm.api.service.ITaxonService;
55
import eu.etaxonomy.cdm.api.service.ITermService;
56
import eu.etaxonomy.cdm.api.service.IUserService;
57
import eu.etaxonomy.cdm.api.service.molecular.ISequenceService;
58
import eu.etaxonomy.cdm.hibernate.HibernateProxyHelper;
59
import eu.etaxonomy.cdm.model.agent.TeamOrPersonBase;
60
import eu.etaxonomy.cdm.model.common.CdmBase;
61
import eu.etaxonomy.cdm.model.common.DefinedTermBase;
62
import eu.etaxonomy.cdm.model.common.EventBase;
63
import eu.etaxonomy.cdm.model.common.Group;
64
import eu.etaxonomy.cdm.model.common.IdentifiableEntity;
65
import eu.etaxonomy.cdm.model.common.User;
66
import eu.etaxonomy.cdm.model.description.DescriptionBase;
67
import eu.etaxonomy.cdm.model.description.DescriptionElementBase;
68
import eu.etaxonomy.cdm.model.description.PolytomousKey;
69
import eu.etaxonomy.cdm.model.description.PolytomousKeyNode;
70
import eu.etaxonomy.cdm.model.media.Media;
71
import eu.etaxonomy.cdm.model.molecular.Sequence;
72
import eu.etaxonomy.cdm.model.name.NonViralName;
73
import eu.etaxonomy.cdm.model.occurrence.SpecimenOrObservationBase;
74
import eu.etaxonomy.cdm.model.reference.Reference;
75
import eu.etaxonomy.cdm.model.taxon.TaxonBase;
76
import eu.etaxonomy.taxeditor.model.DescriptionHelper;
77
import eu.etaxonomy.taxeditor.session.ICdmEntitySession;
78
import eu.etaxonomy.taxeditor.store.CdmStore;
79
import eu.etaxonomy.taxeditor.view.AbstractCdmViewPart;
80

    
81
/**
82
 * @author p.ciardelli
83
 * @created 08.07.2009
84
 * @version 1.0
85
 */
86
public class ReferencingObjectsView extends AbstractCdmViewPart {
87
	private static final Logger logger = Logger
88
			.getLogger(ReferencingObjectsView.class);
89

    
90
	public static final String ID = "eu.etaxonomy.taxeditor.bulkeditor.view.referencingobjects";
91

    
92
	private TableViewer viewer;
93

    
94
	private String referencedObjectTitleCache;
95
	private ConversationHolder conversation;
96
	private final ICdmEntitySession cdmEntitySession;
97

    
98
	public ReferencingObjectsView() {
99
	    cdmEntitySession = CdmStore.getCurrentSessionManager().bindNullSession();
100
	}
101

    
102
	/** {@inheritDoc} */
103
	@Override
104
	public void createViewer(Composite parent) {
105
		selectionService.addSelectionListener(this);
106
		conversation = CdmStore.createConversation();
107
		viewer = new TableViewer(parent, SWT.MULTI | SWT.H_SCROLL
108
				| SWT.V_SCROLL | SWT.FULL_SELECTION);
109
		createColumns(viewer);
110
		viewer.setContentProvider(new ReferencingObjectsContentProvider());
111
		viewer.setLabelProvider(new ReferencingObjectsLabelProvider());
112
		viewer.setCellModifier(new ICellModifier() {
113
            @Override
114
            public void modify(Object element, String property, Object value) {
115
            }
116

    
117
            @Override
118
            public Object getValue(Object element, String property) {
119
                ITableLabelProvider tableLabelProvider = null;
120
                if(viewer.getLabelProvider() instanceof ITableLabelProvider){
121
                    tableLabelProvider = (ITableLabelProvider) viewer.getLabelProvider();
122
                }
123
                Object[] columnProperties = viewer.getColumnProperties();
124
                for (int i=0;i<columnProperties.length;i++) {
125
                    if(columnProperties[i].equals(property) && tableLabelProvider!=null){
126
                        return tableLabelProvider.getColumnText(element, i);
127
                    }
128
                }
129
                return "";
130
            }
131

    
132
            @Override
133
            public boolean canModify(Object element, String property) {
134
                return true;
135
            }
136
        });
137

    
138
        //create context menu
139
        MenuManager menuManager = new MenuManager();
140
        getSite().registerContextMenu(menuManager, viewer);
141
        Control control = viewer.getControl();
142
        Menu menu = menuManager.createContextMenu(control);
143
        control.setMenu(menu);
144

    
145
        // Propagate selection from viewer
146
        getSite().setSelectionProvider(viewer);
147
	}
148

    
149
	/**
150
	 * Create the columns for the table
151
	 * @param viewer
152
	 */
153
	private void createColumns(TableViewer viewer) {
154
		Table table = viewer.getTable();
155
		String[] titles = {"Class", "Description", "UUID", "Object ID" };
156
		int[] bounds = { 100, 200, 100, 70};
157

    
158
        CellEditor[] editors = new CellEditor[titles.length];
159

    
160
		for (int i = 0; i < titles.length; i++) {
161
			TableViewerColumn column = new TableViewerColumn(viewer, SWT.NONE);
162
			editors[i] = new TextCellEditor(table);
163
			column.getColumn().setText(titles[i]);
164
			column.getColumn().setWidth(bounds[i]);
165
			column.getColumn().setResizable(true);
166
			column.getColumn().setMoveable(true);
167
		}
168
		table.setHeaderVisible(true);
169
		table.setLinesVisible(true);
170

    
171
		viewer.setCellEditors(editors);
172
		viewer.setColumnProperties(titles);
173
	}
174

    
175
	@Override
176
	public void setFocus() {
177
	    cdmEntitySession.bind();
178
	}
179

    
180
	public void updateReferencingObjects(final UUID entityUUID, final Class objectClass) {
181

    
182
		final Display display = Display.getCurrent();
183

    
184
		Job job = new Job("Update Referencing Objects") {
185

    
186
			@Override
187
			protected IStatus run(IProgressMonitor monitor) {
188
				monitor.beginTask("Calculating referencing objects", 10);
189

    
190
				monitor.worked(3);
191

    
192
				display.asyncExec(new Runnable() {
193

    
194
					@Override
195
					public void run() {
196
						if (entityUUID != null){
197
						    ICdmEntitySession previousCdmEntitySession = CdmStore.getCurrentSessionManager().getActiveSession();
198
						    cdmEntitySession.bind();
199
							List<CdmBase> referencingObjects = getReferencingObjects(entityUUID, objectClass);
200
							if(previousCdmEntitySession != null) {
201
							    previousCdmEntitySession.bind();
202
							}
203
							updateView(referencingObjects);
204

    
205
						}
206
					}
207
				});
208

    
209
				monitor.done();
210

    
211

    
212
				return Status.OK_STATUS;
213
			}
214
		};
215

    
216
		job.setPriority(Job.DECORATE);
217
		job.schedule();
218
	}
219

    
220
	private List<CdmBase> getReferencingObjects(UUID entity, Class objectClass) {
221
		CdmBase referencedObject = null;
222
        try {
223
        	if (objectClass.getSuperclass().equals(TeamOrPersonBase.class) ){
224
	        	referencedObject = CdmStore.getService(IAgentService.class).load(entity);
225
        	} else if (objectClass.getSuperclass().equals(NonViralName.class)){
226
        		referencedObject = CdmStore.getService(INameService.class).load(entity);
227
        	} else if (objectClass.getSuperclass().equals(TaxonBase.class)){
228
        		referencedObject = CdmStore.getService(ITaxonService.class).load(entity);
229
        	} else if (objectClass.equals(Reference.class)){
230
        		referencedObject = CdmStore.getService(IReferenceService.class).load(entity);
231
        	} else if (objectClass.getSuperclass().equals(SpecimenOrObservationBase.class)){
232
        		referencedObject = CdmStore.getService(IOccurrenceService.class).load(entity);
233
        	} else if (objectClass.isAssignableFrom(User.class)){
234
        		referencedObject = CdmStore.getService(IUserService.class).load(entity);
235
        	} else if (objectClass.isAssignableFrom(Group.class)){
236
        		referencedObject = CdmStore.getService(IGroupService.class).load(entity);
237
        	} else if (objectClass.isAssignableFrom(Media.class)){
238
        	    referencedObject = CdmStore.getService(IMediaService.class).load(entity);
239
        	} else if (DescriptionBase.class.isAssignableFrom(objectClass)){
240
        	    referencedObject = CdmStore.getService(IDescriptionService.class).load(entity);
241
        	} else if (DescriptionElementBase.class.isAssignableFrom(objectClass)){
242
                referencedObject = CdmStore.getService(IDescriptionService.class).loadDescriptionElement(entity, null);
243
            } else if (objectClass.equals(Sequence.class)){
244
                referencedObject = CdmStore.getService(ISequenceService.class).load(entity, null);
245
            } else if (PolytomousKey.class.isAssignableFrom(objectClass)){
246
                referencedObject = CdmStore.getService(IPolytomousKeyService.class).load(entity, null);
247
            } else if (PolytomousKeyNode.class.isAssignableFrom(objectClass)){
248
                referencedObject = CdmStore.getService(IPolytomousKeyNodeService.class).load(entity, null);
249
            } else if (DefinedTermBase.class.isAssignableFrom(objectClass)){
250
                referencedObject = CdmStore.getService(ITermService.class).load(entity, null);
251
            } else if (EventBase.class.isAssignableFrom(objectClass)){
252
                referencedObject = CdmStore.getService(IEventBaseService.class).load(entity, null);
253
            } else if (User.class.isAssignableFrom(objectClass)){
254
                referencedObject = CdmStore.getService(IUserService.class).load(entity, null);
255
            } else if (Group.class.isAssignableFrom(objectClass)){
256
                referencedObject = CdmStore.getService(IGroupService.class).load(entity, null);
257
            }
258
            else if(CdmBase.class.isAssignableFrom(objectClass)){
259
                referencedObject = CdmStore.getCommonService().find(objectClass, entity);
260
            }
261
	        	//referencedObject =(CdmBase) CdmStore.getService(IIdentifiableEntityService.class).load(referencedObject.getUuid());
262
        	Set<CdmBase> setOfReferencingObjects = null;
263

    
264
        	if (referencedObject != null){
265
        	    if(referencedObject.isInstanceOf(IdentifiableEntity.class)){
266
        	        referencedObjectTitleCache = (HibernateProxyHelper.deproxy(referencedObject, IdentifiableEntity.class)).getTitleCache();
267
        	    }
268
        	    else if(referencedObject.isInstanceOf(DescriptionElementBase.class)){
269
        	        referencedObjectTitleCache = DescriptionHelper.getLabel(referencedObject);
270
        	    }
271
        	    else{
272
        	        referencedObjectTitleCache = null;
273
        	    }
274
        		setOfReferencingObjects = CdmStore.getCommonService().getReferencingObjects(referencedObject);
275
        	}
276
	        if (setOfReferencingObjects != null){
277
		       	List<CdmBase> referencingObjects = new ArrayList<CdmBase>(setOfReferencingObjects);
278

    
279
		    	Collections.sort(referencingObjects, new ReferencingClassComparator());
280

    
281
		    	return referencingObjects;
282

    
283
        	}
284
        } catch (Exception e) {
285
            logger.error("Error retrieving referencing objects", e);
286
            setContentDescription("The referencing objects view could not be loaded completely. Some Problems occured.");
287
        }
288
		return null;
289
	}
290

    
291
	class ReferencingClassComparator implements Comparator<CdmBase> {
292

    
293
		@Override
294
        public int compare(CdmBase o1, CdmBase o2) {
295
			String string1 = o1.getClass().getSimpleName();
296
			String string2 = o2.getClass().getSimpleName();
297
			int classCompare = string1.compareToIgnoreCase(string2);
298
			if (classCompare == 0) {
299
				string1 = DescriptionHelper.getObjectDescription(o1);
300
				string2 = DescriptionHelper.getObjectDescription(o2);
301
				return string1.compareToIgnoreCase(string2);
302
			} else {
303
				return classCompare;
304
			}
305
		}
306
	}
307

    
308
	private void updateView(List<CdmBase> referencingObjects) {
309
		if (viewer != null && !viewer.getControl().isDisposed()){
310
			try{
311
				viewer.setInput(referencingObjects);
312
				if (referencedObjectTitleCache != null){
313
					setContentDescription("'" + referencedObjectTitleCache + "' is referenced by:");
314
				} else {
315
					setContentDescription("");
316
				}
317
				showViewer();
318
				//enable/disable table
319
				viewer.getControl().setEnabled(referencingObjects!=null);
320
			}catch(Exception e){
321
				setContentDescription("The referencing objects view could not be loaded completely. Some Problems occured.");
322
			}
323

    
324
		}
325
	}
326

    
327
	/** {@inheritDoc} */
328
	@Override
329
    public void selectionChanged(IWorkbenchPart part, ISelection selection) {
330
        if(part == this){
331
            return;
332
        }
333
        if(selection instanceof IStructuredSelection){
334
        	referencedObjectTitleCache = null;
335
            showViewer(part, (IStructuredSelection) selection);
336
        }
337
	}
338

    
339
	/** {@inheritDoc} */
340
	@Override
341
	public void showViewer(IWorkbenchPart part, IStructuredSelection selection) {
342
	//	this.part = part;
343

    
344
		Object firstElement = selection.getFirstElement();
345
		if(firstElement instanceof TreeNode){
346
		    firstElement = ((TreeNode) firstElement).getValue();
347
		}
348
		if(firstElement instanceof CdmBase){
349
		    updateReferencingObjects(((CdmBase) firstElement).getUuid(),firstElement.getClass() );
350
		}
351
		else{
352
		    updateView(null);
353
            setContentDescription("");
354
		}
355
	}
356

    
357
	/** {@inheritDoc} */
358
	@Override
359
	public void dispose() {
360
		conversation.close();
361
		selectionService.removePostSelectionListener(this);
362
		selectionService.removeSelectionListener(this);
363
		cdmEntitySession.dispose();
364
		super.dispose();
365

    
366
	}
367

    
368
	/** {@inheritDoc} */
369
	@Override
370
	public Viewer getViewer() {
371
		return viewer;
372
	}
373

    
374
	/** {@inheritDoc} */
375
	@Override
376
	public void changed(Object object) {
377
		// no editing in this view
378
	}
379

    
380
	/** {@inheritDoc} */
381
	@Override
382
	public boolean onComplete() {
383
		return false;
384
	}
385

    
386
	public void refresh(){
387
		selectionService.removePostSelectionListener(this);
388
		selectionService.removeSelectionListener(this);
389
		selectionService.addPostSelectionListener(this);
390
		selectionService.addSelectionListener(this);
391

    
392
	}
393

    
394
	@Override
395
	protected String getViewName() {
396
		return "Referencing Objects";
397
	}
398

    
399
}
(3-3/3)