Project

General

Profile

Download (17.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
import org.springframework.remoting.RemoteAccessException;
43

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

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

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

    
93
	private TableViewer viewer;
94

    
95
	private String referencedObjectTitleCache;
96
	private ConversationHolder conversation;
97
	private final ICdmEntitySession cdmEntitySession;
98
	private UUID actualUuid;
99
	List<CdmBase> referencingObjects = null;
100
	Set<CdmBase> referencingObjectsSet = null;
101
	IProgressMonitor actualMonitor = null;
102

    
103
	public ReferencingObjectsView() {
104
	    cdmEntitySession = CdmStore.getCurrentSessionManager().bindNullSession();
105
	}
106

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

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

    
137
            @Override
138
            public boolean canModify(Object element, String property) {
139
                return true;
140
            }
141
        });
142

    
143
        //create context menu
144
        MenuManager menuManager = new MenuManager();
145
        getSite().registerContextMenu(menuManager, viewer);
146
        Control control = viewer.getControl();
147
        Menu menu = menuManager.createContextMenu(control);
148
        control.setMenu(menu);
149

    
150
        // Propagate selection from viewer
151
        getSite().setSelectionProvider(viewer);
152
	}
153

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

    
163
        CellEditor[] editors = new CellEditor[titles.length];
164

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

    
176
		viewer.setCellEditors(editors);
177
		viewer.setColumnProperties(titles);
178
	}
179

    
180
	@Override
181
	public void setFocus() {
182
	    cdmEntitySession.bind();
183
	}
184

    
185
	public void updateReferencingObjects(final UUID entityUUID, final Class objectClass) {
186
	    if (actualUuid == entityUUID){
187
	        return ;
188
	    }
189

    
190
		Job job = new Job("Update Referencing Objects " + entityUUID) {
191

    
192
			@Override
193
			protected IStatus run(IProgressMonitor monitor) {
194
				monitor.beginTask("Calculating referencing objects", 100);
195

    
196
				monitor.worked(5);
197
				referencingObjects = new ArrayList<>();
198
				if(monitor.isCanceled()) {
199
                    return Status.CANCEL_STATUS;
200
                }
201
				if (actualMonitor != null){
202
				    actualMonitor.setCanceled(true);
203
				    updateView();
204
				}
205
				actualMonitor = monitor;
206
				if (entityUUID != null){
207
				    ICdmEntitySession previousCdmEntitySession = CdmStore.getCurrentSessionManager().getActiveSession();
208
	                cdmEntitySession.bind();
209
	                referencingObjectsSet = getReferencingObjects(entityUUID, objectClass);
210

    
211
	                if(monitor.isCanceled()) {
212
	                    return Status.CANCEL_STATUS;
213
	                }
214
	                monitor.worked(30);
215
	                referencingObjects = sortReferencing();
216
	                if (referencingObjects == null){
217
	                    if (monitor.isCanceled()){
218
	                        return Status.CANCEL_STATUS;
219
	                    }
220
	                }
221

    
222
	                if(monitor.isCanceled()) {
223

    
224
	                    return Status.CANCEL_STATUS;
225
	                }
226
	                monitor.worked(80);
227
                    updateView();
228

    
229
	                if(previousCdmEntitySession != null) {
230
	                    previousCdmEntitySession.bind();
231
	                }
232
	                actualUuid = entityUUID;
233
				}
234
				monitor.done();
235

    
236

    
237
				return Status.OK_STATUS;
238

    
239

    
240
			}
241
		};
242
		//job.setUser(true);
243

    
244
		job.schedule();
245
//		final IJobChangeListener listener;
246
//		listener =  new JobChangeAdapter() {
247
//            @Override
248
//            public void done(IJobChangeEvent event) {
249
//                System.err.println("Job is done");
250
//                event.getJob().cancel();
251
//            }
252
//
253
//        };
254
//        job.addJobChangeListener(listener);
255

    
256

    
257

    
258

    
259
	}
260

    
261
	private Set<CdmBase> getReferencingObjects(UUID entity, Class objectClass) {
262
		CdmBase referencedObject = null;
263
        try {
264
        	if (objectClass.getSuperclass().equals(TeamOrPersonBase.class) ){
265
	        	referencedObject = CdmStore.getService(IAgentService.class).load(entity);
266
        	} else if (objectClass.getSuperclass().equals(NonViralName.class)){
267
        		referencedObject = CdmStore.getService(INameService.class).load(entity);
268
        	} else if (objectClass.getSuperclass().equals(TaxonBase.class)){
269
        		referencedObject = CdmStore.getService(ITaxonService.class).load(entity);
270
        	} else if (objectClass.equals(Reference.class)){
271
        		referencedObject = CdmStore.getService(IReferenceService.class).load(entity);
272
        	} else if (objectClass.getSuperclass().equals(SpecimenOrObservationBase.class)){
273
        		referencedObject = CdmStore.getService(IOccurrenceService.class).load(entity);
274
        	} else if (objectClass.isAssignableFrom(User.class)){
275
        		referencedObject = CdmStore.getService(IUserService.class).load(entity);
276
        	} else if (objectClass.isAssignableFrom(Group.class)){
277
        		referencedObject = CdmStore.getService(IGroupService.class).load(entity);
278
        	} else if (objectClass.isAssignableFrom(Media.class)){
279
        	    referencedObject = CdmStore.getService(IMediaService.class).load(entity);
280
        	} else if (DescriptionBase.class.isAssignableFrom(objectClass)){
281
        	    referencedObject = CdmStore.getService(IDescriptionService.class).load(entity);
282
        	} else if (DescriptionElementBase.class.isAssignableFrom(objectClass)){
283
                referencedObject = CdmStore.getService(IDescriptionService.class).loadDescriptionElement(entity, null);
284
            } else if (objectClass.equals(Sequence.class)){
285
                referencedObject = CdmStore.getService(ISequenceService.class).load(entity, null);
286
            } else if (PolytomousKey.class.isAssignableFrom(objectClass)){
287
                referencedObject = CdmStore.getService(IPolytomousKeyService.class).load(entity, null);
288
            } else if (PolytomousKeyNode.class.isAssignableFrom(objectClass)){
289
                referencedObject = CdmStore.getService(IPolytomousKeyNodeService.class).load(entity, null);
290
            } else if (DefinedTermBase.class.isAssignableFrom(objectClass)){
291
                referencedObject = CdmStore.getService(ITermService.class).load(entity, null);
292
            } else if (EventBase.class.isAssignableFrom(objectClass)){
293
                referencedObject = CdmStore.getService(IEventBaseService.class).load(entity, null);
294
            } else if (User.class.isAssignableFrom(objectClass)){
295
                referencedObject = CdmStore.getService(IUserService.class).load(entity, null);
296
            } else if (Group.class.isAssignableFrom(objectClass)){
297
                referencedObject = CdmStore.getService(IGroupService.class).load(entity, null);
298
            }
299
            else if(CdmBase.class.isAssignableFrom(objectClass)){
300
                referencedObject = CdmStore.getCommonService().find(objectClass, entity);
301
            }
302
	        	//referencedObject =(CdmBase) CdmStore.getService(IIdentifiableEntityService.class).load(referencedObject.getUuid());
303
        	Set<CdmBase> setOfReferencingObjects = null;
304

    
305
        	if (referencedObject != null){
306
        	    if(referencedObject.isInstanceOf(IdentifiableEntity.class)){
307
        	        referencedObjectTitleCache = (HibernateProxyHelper.deproxy(referencedObject, IdentifiableEntity.class)).getTitleCache();
308
        	    }
309
        	    else if(referencedObject.isInstanceOf(DescriptionElementBase.class)){
310
        	        referencedObjectTitleCache = DescriptionHelper.getLabel(referencedObject);
311
        	    }
312
        	    else if (referencedObject.isInstanceOf(User.class)){
313
        	        referencedObjectTitleCache = ((User)referencedObject).getUsername();
314
        	    }else{
315
        	        referencedObjectTitleCache = null;
316
        	    }
317
        		setOfReferencingObjects = CdmStore.getCommonService().getReferencingObjects(referencedObject);
318
        		return setOfReferencingObjects;
319
        	}
320

    
321
        } catch (Exception e) {
322
            logger.error("Error retrieving referencing objects", e);
323
            e.printStackTrace();
324
            setContentDescription("The referencing objects view could not be loaded completely. Some Problems occured.");
325
        }
326
		return null;
327
	}
328
	private List<CdmBase> sortReferencing(){
329

    
330
	    if (referencingObjectsSet != null){
331
            List<CdmBase> referencingObjects = new ArrayList<CdmBase>(referencingObjectsSet);
332
            try{
333
                Collections.sort(referencingObjects, new ReferencingClassComparator());
334
            }catch (RemoteAccessException e){
335
             return null;
336
            }
337
            return referencingObjects;
338

    
339
        }
340

    
341
	    return null;
342
	}
343

    
344

    
345
	class ReferencingClassComparator implements Comparator<CdmBase>   {
346

    
347
		@Override
348
        public int compare(CdmBase o1, CdmBase o2) {
349
			String string1 = o1.getClass().getSimpleName();
350
			String string2 = o2.getClass().getSimpleName();
351
			int result = string1.compareToIgnoreCase(string2);
352
			if (result == 0) {
353
				string1 = DescriptionHelper.getObjectDescription(o1);
354
				string2 = DescriptionHelper.getObjectDescription(o2);
355

    
356
				result = string1.compareToIgnoreCase(string2);
357
				if (result == 0){
358
				    return o1.getUuid().compareTo(o2.getUuid());
359
				}
360
			}
361
				return result;
362
		}
363
	}
364

    
365
	private void updateView() {
366
	    Display.getDefault().asyncExec(new Runnable() {
367
            @Override
368
            public void run() {
369
        		if (viewer != null && !viewer.getControl().isDisposed()){
370
        			try{
371
        				viewer.setInput(referencingObjects);
372
        				if (referencedObjectTitleCache != null){
373
        					setContentDescription("'" + referencedObjectTitleCache + "' is referenced by:");
374
        				} else {
375
        					setContentDescription("");
376
        				}
377
        				showViewer();
378
        				 getViewSite().getActionBars().getStatusLineManager().
379
        	               setMessage("End Updating Referencing Objects");
380
        				//enable/disable table
381
        				viewer.getControl().setEnabled(referencingObjects!=null);
382

    
383
        			}catch(Exception e){
384
        			    e.printStackTrace();
385
        				setContentDescription("The referencing objects view could not be loaded completely. Some Problems occured.");
386
        			}
387

    
388
        		}
389
            }
390
            });
391
	}
392

    
393
	/** {@inheritDoc} */
394
	@Override
395
    public void selectionChanged(IWorkbenchPart part, ISelection selection) {
396
        if(part == this){
397
            return;
398
        }
399

    
400
        if(selection instanceof IStructuredSelection){
401
        	referencedObjectTitleCache = null;
402
            showViewer(part, (IStructuredSelection) selection);
403
        }
404
	}
405

    
406
	/** {@inheritDoc} */
407
	@Override
408
	public void showViewer(IWorkbenchPart part, IStructuredSelection selection) {
409
	//	this.part = part;
410

    
411
		Object firstElement = selection.getFirstElement();
412
		if(firstElement instanceof TreeNode){
413
		    firstElement = ((TreeNode) firstElement).getValue();
414
		}
415
		if(firstElement instanceof CdmBase){
416
		    CdmBase referencedCdmObject = (CdmBase) firstElement;
417
		    if (referencedCdmObject != null){
418
                if(referencedCdmObject.isInstanceOf(IdentifiableEntity.class)){
419
                    referencedObjectTitleCache = (HibernateProxyHelper.deproxy(referencedCdmObject, IdentifiableEntity.class)).getTitleCache();
420
                }
421
                else if(referencedCdmObject.isInstanceOf(DescriptionElementBase.class)){
422
                    referencedObjectTitleCache = DescriptionHelper.getLabel(referencedCdmObject);
423
                }
424
                else if (referencedCdmObject.isInstanceOf(User.class)){
425
                    referencedObjectTitleCache = ((User)referencedCdmObject).getUsername();
426
                }else{
427
                    referencedObjectTitleCache = null;
428
                }
429
		    }
430
		    updateReferencingObjects(referencedCdmObject.getUuid(),firstElement.getClass() );
431

    
432
		}
433
		else{
434
		    updateView();
435
            setContentDescription("");
436
		}
437
	}
438

    
439
	/** {@inheritDoc} */
440
	@Override
441
	public void dispose() {
442
		conversation.close();
443
		selectionService.removePostSelectionListener(this);
444
		selectionService.removeSelectionListener(this);
445
		cdmEntitySession.dispose();
446
		super.dispose();
447

    
448
	}
449

    
450
	/** {@inheritDoc} */
451
	@Override
452
	public Viewer getViewer() {
453
		return viewer;
454
	}
455

    
456
	/** {@inheritDoc} */
457
	@Override
458
	public void changed(Object object) {
459
		// no editing in this view
460
	}
461

    
462
	/** {@inheritDoc} */
463
	@Override
464
	public boolean onComplete() {
465
		return false;
466
	}
467

    
468
	public void refresh(){
469
		selectionService.removePostSelectionListener(this);
470
		selectionService.removeSelectionListener(this);
471
		selectionService.addPostSelectionListener(this);
472
		selectionService.addSelectionListener(this);
473

    
474
	}
475

    
476
	@Override
477
	protected String getViewName() {
478
		return "Referencing Objects";
479
	}
480

    
481
}
(3-3/3)