Project

General

Profile

Download (18.9 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.IJobChangeEvent;
24
import org.eclipse.core.runtime.jobs.IJobChangeListener;
25
import org.eclipse.core.runtime.jobs.Job;
26
import org.eclipse.core.runtime.jobs.JobChangeAdapter;
27
import org.eclipse.jface.action.MenuManager;
28
import org.eclipse.jface.viewers.CellEditor;
29
import org.eclipse.jface.viewers.ICellModifier;
30
import org.eclipse.jface.viewers.ISelection;
31
import org.eclipse.jface.viewers.IStructuredSelection;
32
import org.eclipse.jface.viewers.ITableLabelProvider;
33
import org.eclipse.jface.viewers.TableViewer;
34
import org.eclipse.jface.viewers.TableViewerColumn;
35
import org.eclipse.jface.viewers.TextCellEditor;
36
import org.eclipse.jface.viewers.TreeNode;
37
import org.eclipse.jface.viewers.Viewer;
38
import org.eclipse.swt.SWT;
39
import org.eclipse.swt.widgets.Composite;
40
import org.eclipse.swt.widgets.Control;
41
import org.eclipse.swt.widgets.Display;
42
import org.eclipse.swt.widgets.Menu;
43
import org.eclipse.swt.widgets.Table;
44
import org.eclipse.ui.IWorkbenchPart;
45
import org.springframework.remoting.RemoteAccessException;
46

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

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

    
94
	public static final String ID = "eu.etaxonomy.taxeditor.bulkeditor.view.referencingobjects";
95

    
96
	private TableViewer viewer;
97

    
98
	private String referencedObjectTitleCache;
99
	private ConversationHolder conversation;
100
	private final ICdmEntitySession cdmEntitySession;
101
	private UUID actualUuid;
102
	List<CdmBase> referencingObjects = null;
103
	Set<CdmBase> referencingObjectsSet = null;
104
	IProgressMonitor actualMonitor = null;
105
	private Job currentJob = null;
106

    
107
	public ReferencingObjectsView() {
108
	    cdmEntitySession = CdmStore.getCurrentSessionManager().bindNullSession();
109
	}
110

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

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

    
141
            @Override
142
            public boolean canModify(Object element, String property) {
143
                return true;
144
            }
145
        });
146

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

    
154
        // Propagate selection from viewer
155
        getSite().setSelectionProvider(viewer);
156
	}
157

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

    
167
        CellEditor[] editors = new CellEditor[titles.length];
168

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

    
180
		viewer.setCellEditors(editors);
181
		viewer.setColumnProperties(titles);
182
	}
183

    
184
	@Override
185
	public void setFocus() {
186
	    cdmEntitySession.bind();
187
	}
188

    
189
	public void updateReferencingObjects(final UUID entityUUID, final Class objectClass) {
190
	    if (actualUuid == entityUUID){
191
	        return ;
192
	    }
193
	    showEmptyPage();
194
	    if(currentJob!=null){
195
	        boolean success = false;
196
	        //wait for cancel to be done
197
	        while(!success){
198
	            success = currentJob.cancel();
199
	        }
200
	        currentJob = null;
201
	    }
202
		currentJob = new Job("Update Referencing Objects " + entityUUID) {
203

    
204
			@Override
205
			protected IStatus run(IProgressMonitor monitor) {
206
				monitor.beginTask("Calculating referencing objects", 100);
207
				actualUuid = entityUUID;
208
				System.out.println("starting job... " + entityUUID);
209
				monitor.worked(5);
210
				referencingObjects = new ArrayList<>();
211
				if(monitor.isCanceled()) {
212
				    actualUuid = null;
213
                    return Status.CANCEL_STATUS;
214
                }
215
				if (actualMonitor != null){
216
				    actualMonitor.setCanceled(true);
217

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

    
225
	                if(monitor.isCanceled()) {
226
	                    actualUuid = null;
227
	                    System.err.println("Job is canceled" + entityUUID);
228
	                    return Status.CANCEL_STATUS;
229
	                }
230
	                monitor.worked(30);
231
	                referencingObjects = sortReferencing();
232
	                if (referencingObjects == null){
233
	                    if (monitor.isCanceled()){
234
	                        actualUuid = null;
235
	                        System.err.println("Job is canceled" + entityUUID);
236
	                        return Status.CANCEL_STATUS;
237
	                    }
238
	                }
239

    
240
	                if(monitor.isCanceled()) {
241
	                    if(previousCdmEntitySession != null) {
242
	                        previousCdmEntitySession.bind();
243
	                    }
244
	                    System.err.println("Job is canceled" + entityUUID);
245
	                    return Status.CANCEL_STATUS;
246
	                }
247
	                monitor.worked(80);
248
                    updateView();
249

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

    
257
				System.out.println("finishing job " + entityUUID);
258
				return Status.OK_STATUS;
259

    
260

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

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

    
274
        };
275
        currentJob.addJobChangeListener(listener);
276

    
277

    
278

    
279

    
280
	}
281

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

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

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

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

    
360
        }
361

    
362
	    return null;
363
	}
364

    
365

    
366
	class ReferencingClassComparator implements Comparator<CdmBase>   {
367

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

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

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

    
394
        				showViewer();
395

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

    
399
        			}catch(Exception e){
400
        			    e.printStackTrace();
401
        				setContentDescription("The referencing objects view could not be loaded completely. Some Problems occured.");
402
        			}
403

    
404
        		}
405
            }
406
            });
407
	}
408

    
409

    
410
	private void updateDescription(){
411
	    Display.getDefault().asyncExec(new Runnable() {
412
            @Override
413
            public void run() {
414
        	    if (referencedObjectTitleCache != null){
415
                    setContentDescription("'" + referencedObjectTitleCache + "' is referenced by:");
416
                } else {
417
                    setContentDescription("");
418
                }
419
            }
420

    
421
         });
422
	 }
423

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

    
431
        if(selection instanceof IStructuredSelection){
432
        	//referencedObjectTitleCache = null;
433
        	showViewer(part, (IStructuredSelection) selection);
434
        }
435
	}
436

    
437
	/** {@inheritDoc} */
438
	@Override
439
	public void showViewer(IWorkbenchPart part, IStructuredSelection selection) {
440
	//	this.part = part;
441

    
442
		Object firstElement = selection.getFirstElement();
443
		if(firstElement instanceof TreeNode){
444
		    firstElement = ((TreeNode) firstElement).getValue();
445
		}
446
		if(firstElement instanceof CdmBase){
447
		    CdmBase referencedCdmObject = (CdmBase) firstElement;
448
		    if (referencedCdmObject.getUuid() == actualUuid){
449
		        return;
450
		    }
451
		    if (referencedCdmObject != null){
452
                if(referencedCdmObject.isInstanceOf(IdentifiableEntity.class)){
453
                    referencedObjectTitleCache = (HibernateProxyHelper.deproxy(referencedCdmObject, IdentifiableEntity.class)).getTitleCache();
454
                }
455
                else if(referencedCdmObject.isInstanceOf(DescriptionElementBase.class)){
456
                    referencedObjectTitleCache = DescriptionHelper.getLabel(referencedCdmObject);
457
                }
458
                else if (referencedCdmObject.isInstanceOf(User.class)){
459
                    referencedObjectTitleCache = ((User)referencedCdmObject).getUsername();
460
                }else{
461
                    referencedObjectTitleCache = null;
462
                }
463
		    }
464
		    updateDescription();
465
		    updateReferencingObjects(referencedCdmObject.getUuid(),firstElement.getClass() );
466

    
467
		}
468
		else if (firstElement != null){
469
		    updateView();
470
            setContentDescription("");
471
		}
472
	}
473

    
474
	/** {@inheritDoc} */
475
	@Override
476
	public void dispose() {
477
		conversation.close();
478
		selectionService.removePostSelectionListener(this);
479
		selectionService.removeSelectionListener(this);
480
		cdmEntitySession.dispose();
481
		super.dispose();
482

    
483
	}
484

    
485
	/** {@inheritDoc} */
486
	@Override
487
	public Viewer getViewer() {
488
		return viewer;
489
	}
490

    
491
	/** {@inheritDoc} */
492
	@Override
493
	public void changed(Object object) {
494
		// no editing in this view
495
	}
496

    
497
	/** {@inheritDoc} */
498
	@Override
499
	public boolean onComplete() {
500
		return false;
501
	}
502

    
503
	public void refresh(){
504
		selectionService.removePostSelectionListener(this);
505
		selectionService.removeSelectionListener(this);
506
		selectionService.addPostSelectionListener(this);
507
		selectionService.addSelectionListener(this);
508

    
509
	}
510

    
511
	@Override
512
	protected String getViewName() {
513
		return "Referencing Objects";
514
	}
515

    
516
}
(3-3/3)