Project

General

Profile

Download (18.8 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
	private Job currentJob = null;
103

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

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

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

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

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

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

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

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

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

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

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

    
186
	public void updateReferencingObjects(final UUID entityUUID, final Class objectClass) {
187
	    if (actualUuid == entityUUID){
188
	        return ;
189
	    }
190
	    showEmptyPage();
191
	    if(actualMonitor!=null && !actualMonitor.isCanceled()){
192
//	        boolean success = false;
193
//	        //wait for cancel to be done
194
//	        while(!success){
195
//	            success = currentJob.cancel();
196
//	        }
197
//	        currentJob = null;
198
	        while(!actualMonitor.isCanceled()){
199
	            actualMonitor.setCanceled(true);
200
	        }
201

    
202
	    }
203
		currentJob = new Job("Update Referencing Objects " + entityUUID) {
204

    
205
			@Override
206
			protected IStatus run(IProgressMonitor monitor) {
207
				monitor.beginTask("Calculating referencing objects", 100);
208
				actualUuid = entityUUID;
209

    
210
				monitor.worked(5);
211
				referencingObjects = new ArrayList<>();
212
				if(monitor.isCanceled()) {
213
				    actualUuid = null;
214
                    return Status.CANCEL_STATUS;
215
                }
216
				if (actualMonitor != null){
217
				    actualMonitor.setCanceled(true);
218

    
219
				}
220
				actualMonitor = monitor;
221
				if (entityUUID != null){
222
				    ICdmEntitySession previousCdmEntitySession = CdmStore.getCurrentSessionManager().getActiveSession();
223
	                cdmEntitySession.bind();
224
	                referencingObjectsSet = getReferencingObjects(entityUUID, objectClass);
225

    
226
	                if(monitor.isCanceled()) {
227
	                    actualUuid = null;
228

    
229
	                    return Status.CANCEL_STATUS;
230
	                }
231
	                monitor.worked(30);
232
	                referencingObjects = sortReferencing();
233
	                if (referencingObjects == null){
234
	                    if (monitor.isCanceled()){
235
	                        actualUuid = null;
236

    
237
	                        return Status.CANCEL_STATUS;
238
	                    }
239
	                }
240

    
241
	                if(monitor.isCanceled()) {
242
	                    if(previousCdmEntitySession != null) {
243
	                        previousCdmEntitySession.bind();
244
	                    }
245

    
246
	                    return Status.CANCEL_STATUS;
247
	                }
248
	                monitor.worked(80);
249
                    updateView();
250

    
251
	                if(previousCdmEntitySession != null) {
252
	                    previousCdmEntitySession.bind();
253
	                }
254
	               // actualUuid = entityUUID;
255
				}
256
				monitor.done();
257

    
258

    
259
				return Status.OK_STATUS;
260

    
261

    
262
			}
263
		};
264
		currentJob.setUser(true);
265

    
266
		currentJob.schedule();
267
//		final IJobChangeListener listener;
268
//		listener =  new JobChangeAdapter() {
269
//            @Override
270
//            public void done(IJobChangeEvent event) {
271
//                System.err.println("Job is done" + entityUUID);
272
//                //event.getJob().cancel();
273
//            }
274
//
275
//        };
276
//        currentJob.addJobChangeListener(listener);
277

    
278

    
279

    
280

    
281
	}
282

    
283
	private Set<CdmBase> getReferencingObjects(UUID entity, Class objectClass) {
284
		CdmBase referencedObject = null;
285
        try {
286
        	if (objectClass.getSuperclass().equals(TeamOrPersonBase.class) ){
287
	        	referencedObject = CdmStore.getService(IAgentService.class).load(entity);
288
        	} else if (objectClass.getSuperclass().equals(NonViralName.class)){
289
        		referencedObject = CdmStore.getService(INameService.class).load(entity);
290
        	} else if (objectClass.getSuperclass().equals(TaxonBase.class)){
291
        		referencedObject = CdmStore.getService(ITaxonService.class).load(entity);
292
        	} else if (objectClass.equals(Reference.class)){
293
        		referencedObject = CdmStore.getService(IReferenceService.class).load(entity);
294
        	} else if (objectClass.getSuperclass().equals(SpecimenOrObservationBase.class)){
295
        		referencedObject = CdmStore.getService(IOccurrenceService.class).load(entity);
296
        	} else if (objectClass.isAssignableFrom(User.class)){
297
        		referencedObject = CdmStore.getService(IUserService.class).load(entity);
298
        	} else if (objectClass.isAssignableFrom(Group.class)){
299
        		referencedObject = CdmStore.getService(IGroupService.class).load(entity);
300
        	} else if (objectClass.isAssignableFrom(Media.class)){
301
        	    referencedObject = CdmStore.getService(IMediaService.class).load(entity);
302
        	} else if (DescriptionBase.class.isAssignableFrom(objectClass)){
303
        	    referencedObject = CdmStore.getService(IDescriptionService.class).load(entity);
304
        	} else if (DescriptionElementBase.class.isAssignableFrom(objectClass)){
305
                referencedObject = CdmStore.getService(IDescriptionService.class).loadDescriptionElement(entity, null);
306
            } else if (objectClass.equals(Sequence.class)){
307
                referencedObject = CdmStore.getService(ISequenceService.class).load(entity, null);
308
            } else if (PolytomousKey.class.isAssignableFrom(objectClass)){
309
                referencedObject = CdmStore.getService(IPolytomousKeyService.class).load(entity, null);
310
            } else if (PolytomousKeyNode.class.isAssignableFrom(objectClass)){
311
                referencedObject = CdmStore.getService(IPolytomousKeyNodeService.class).load(entity, null);
312
            } else if (DefinedTermBase.class.isAssignableFrom(objectClass)){
313
                referencedObject = CdmStore.getService(ITermService.class).load(entity, null);
314
            } else if (EventBase.class.isAssignableFrom(objectClass)){
315
                referencedObject = CdmStore.getService(IEventBaseService.class).load(entity, null);
316
            } else if (User.class.isAssignableFrom(objectClass)){
317
                referencedObject = CdmStore.getService(IUserService.class).load(entity, null);
318
            } else if (Group.class.isAssignableFrom(objectClass)){
319
                referencedObject = CdmStore.getService(IGroupService.class).load(entity, null);
320
            }
321
            else if(CdmBase.class.isAssignableFrom(objectClass)){
322
                referencedObject = CdmStore.getCommonService().find(objectClass, entity);
323
            }
324
	        	//referencedObject =(CdmBase) CdmStore.getService(IIdentifiableEntityService.class).load(referencedObject.getUuid());
325
        	Set<CdmBase> setOfReferencingObjects = null;
326

    
327
        	if (referencedObject != null){
328
        	    if(referencedObject.isInstanceOf(IdentifiableEntity.class)){
329
        	        referencedObjectTitleCache = (HibernateProxyHelper.deproxy(referencedObject, IdentifiableEntity.class)).getTitleCache();
330
        	    }
331
        	    else if(referencedObject.isInstanceOf(DescriptionElementBase.class)){
332
        	        referencedObjectTitleCache = DescriptionHelper.getLabel(referencedObject);
333
        	    }
334
        	    else if (referencedObject.isInstanceOf(User.class)){
335
        	        referencedObjectTitleCache = ((User)referencedObject).getUsername();
336
        	    }else{
337
        	        referencedObjectTitleCache = null;
338
        	    }
339
        		setOfReferencingObjects = CdmStore.getCommonService().getReferencingObjects(referencedObject);
340
        		return setOfReferencingObjects;
341
        	}
342

    
343
        } catch (Exception e) {
344
            logger.error("Error retrieving referencing objects", e);
345
            e.printStackTrace();
346
            updateDescription("The referencing objects view could not be loaded completely. Some Problems occured.");
347
        }
348
		return null;
349
	}
350
	private List<CdmBase> sortReferencing(){
351

    
352
	    if (referencingObjectsSet != null){
353
            List<CdmBase> referencingObjects = new ArrayList<CdmBase>(referencingObjectsSet);
354
            try{
355
                Collections.sort(referencingObjects, new ReferencingClassComparator());
356
            }catch (RemoteAccessException e){
357
                logger.debug(e.getStackTrace());
358
                return null;
359
            }
360
            return referencingObjects;
361

    
362
        }
363

    
364
	    return null;
365
	}
366

    
367

    
368
	class ReferencingClassComparator implements Comparator<CdmBase>   {
369

    
370
		@Override
371
        public int compare(CdmBase o1, CdmBase o2) {
372
			String string1 = o1.getClass().getSimpleName();
373
			String string2 = o2.getClass().getSimpleName();
374
			int result = string1.compareToIgnoreCase(string2);
375
			if (result == 0) {
376
				string1 = DescriptionHelper.getObjectDescription(o1);
377
				string2 = DescriptionHelper.getObjectDescription(o2);
378

    
379
				result = string1.compareToIgnoreCase(string2);
380
				if (result == 0){
381
				    return o1.getUuid().compareTo(o2.getUuid());
382
				}
383
			}
384
				return result;
385
		}
386
	}
387

    
388
	private void updateView() {
389
	    Display.getDefault().asyncExec(new Runnable() {
390
            @Override
391
            public void run() {
392
        		if (viewer != null && !viewer.getControl().isDisposed()){
393
        			try{
394
        				viewer.setInput(referencingObjects);
395

    
396
        				showViewer();
397

    
398
        				//enable/disable table
399
        				viewer.getControl().setEnabled(referencingObjects!=null);
400

    
401
        			}catch(Exception e){
402
        			    e.printStackTrace();
403
        			    logger.debug(e.getStackTrace());
404
        			    updateDescription("The referencing objects view could not be loaded completely. Some Problems occured.");
405
        			}
406

    
407
        		}
408
            }
409
            });
410
	}
411

    
412

    
413
	private void updateDescription(final String description){
414
	    Display.getDefault().asyncExec(new Runnable() {
415
            @Override
416
            public void run() {
417
        	    if (referencedObjectTitleCache != null){
418
                    setContentDescription(description);
419
                } else {
420
                    setContentDescription(description);
421
                }
422
            }
423

    
424
         });
425
	 }
426

    
427
	/** {@inheritDoc} */
428
	@Override
429
    public void selectionChanged(IWorkbenchPart part, ISelection selection) {
430
        if(part == this){
431
            return;
432
        }
433

    
434
        if(selection instanceof IStructuredSelection){
435
        	//referencedObjectTitleCache = null;
436
        	showViewer(part, (IStructuredSelection) selection);
437
        }
438
	}
439

    
440
	/** {@inheritDoc} */
441
	@Override
442
	public void showViewer(IWorkbenchPart part, IStructuredSelection selection) {
443
	//	this.part = part;
444

    
445
		Object firstElement = selection.getFirstElement();
446
		if(firstElement instanceof TreeNode){
447
		    firstElement = ((TreeNode) firstElement).getValue();
448
		}
449
		if(firstElement instanceof CdmBase){
450
		    CdmBase referencedCdmObject = (CdmBase) firstElement;
451
		    if (referencedCdmObject.getUuid() == actualUuid){
452
		        return;
453
		    }
454
		    if (referencedCdmObject != null){
455
                if(referencedCdmObject.isInstanceOf(IdentifiableEntity.class)){
456
                    referencedObjectTitleCache = (HibernateProxyHelper.deproxy(referencedCdmObject, IdentifiableEntity.class)).getTitleCache();
457
                }
458
                else if(referencedCdmObject.isInstanceOf(DescriptionElementBase.class)){
459
                    referencedObjectTitleCache = DescriptionHelper.getLabel(referencedCdmObject);
460
                }
461
                else if (referencedCdmObject.isInstanceOf(User.class)){
462
                    referencedObjectTitleCache = ((User)referencedCdmObject).getUsername();
463
                }else{
464
                    referencedObjectTitleCache = null;
465
                }
466
		    }
467
		    if (referencedObjectTitleCache != null){
468
		        updateDescription("'" + referencedObjectTitleCache + "' is referenced by:");
469
		    } else{
470
		        updateDescription("");
471
		    }
472

    
473
		    updateReferencingObjects(referencedCdmObject.getUuid(),firstElement.getClass() );
474

    
475
		}
476
		else if (firstElement != null){
477
		    updateView();
478
            updateDescription("");
479
		}
480
	}
481

    
482
	/** {@inheritDoc} */
483
	@Override
484
	public void dispose() {
485
		conversation.close();
486
		selectionService.removePostSelectionListener(this);
487
		selectionService.removeSelectionListener(this);
488
		cdmEntitySession.dispose();
489
		super.dispose();
490

    
491
	}
492

    
493
	/** {@inheritDoc} */
494
	@Override
495
	public Viewer getViewer() {
496
		return viewer;
497
	}
498

    
499
	/** {@inheritDoc} */
500
	@Override
501
	public void changed(Object object) {
502
		// no editing in this view
503
	}
504

    
505
	/** {@inheritDoc} */
506
	@Override
507
	public boolean onComplete() {
508
		return false;
509
	}
510

    
511
	public void refresh(){
512
		selectionService.removePostSelectionListener(this);
513
		selectionService.removeSelectionListener(this);
514
		selectionService.addPostSelectionListener(this);
515
		selectionService.addSelectionListener(this);
516

    
517
	}
518

    
519
	@Override
520
	protected String getViewName() {
521
		return "Referencing Objects";
522
	}
523

    
524
}
(3-3/3)