Project

General

Profile

Download (18.5 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.e4;
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 javax.annotation.PostConstruct;
20
import javax.annotation.PreDestroy;
21
import javax.inject.Inject;
22

    
23
import org.apache.log4j.Logger;
24
import org.eclipse.core.runtime.IProgressMonitor;
25
import org.eclipse.core.runtime.IStatus;
26
import org.eclipse.core.runtime.Status;
27
import org.eclipse.core.runtime.jobs.Job;
28
import org.eclipse.e4.ui.model.application.ui.basic.MPart;
29
import org.eclipse.e4.ui.services.EMenuService;
30
import org.eclipse.e4.ui.workbench.modeling.ESelectionService;
31
import org.eclipse.jface.viewers.CellEditor;
32
import org.eclipse.jface.viewers.ICellModifier;
33
import org.eclipse.jface.viewers.ISelectionChangedListener;
34
import org.eclipse.jface.viewers.IStructuredSelection;
35
import org.eclipse.jface.viewers.ITableLabelProvider;
36
import org.eclipse.jface.viewers.TableViewer;
37
import org.eclipse.jface.viewers.TableViewerColumn;
38
import org.eclipse.jface.viewers.TextCellEditor;
39
import org.eclipse.jface.viewers.TreeNode;
40
import org.eclipse.jface.viewers.Viewer;
41
import org.eclipse.swt.SWT;
42
import org.eclipse.swt.layout.GridData;
43
import org.eclipse.swt.layout.GridLayout;
44
import org.eclipse.swt.widgets.Composite;
45
import org.eclipse.swt.widgets.Display;
46
import org.eclipse.swt.widgets.Label;
47
import org.eclipse.swt.widgets.Table;
48
import org.springframework.remoting.RemoteAccessException;
49

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

    
91
/**
92
 *
93
 * @author pplitzner
94
 * @since Aug 16, 2017
95
 *
96
 */
97
public class ReferencingObjectsViewE4 extends AbstractCdmEditorPartE4 {
98

    
99
    private static final Logger logger = Logger
100
			.getLogger(ReferencingObjectsViewE4.class);
101

    
102
    private Label contentDescription;
103
	private TableViewer viewer;
104

    
105
	private String referencedObjectTitleCache;
106
	private ConversationHolder conversation;
107
	private UUID actualUuid;
108
	List<CdmBase> referencingObjects = null;
109
	Set<CdmBase> referencingObjectsSet = null;
110
	IProgressMonitor actualMonitor = null;
111
	private Job currentJob = null;
112

    
113
    private ISelectionChangedListener selectionChangedListener;
114

    
115
    @Inject
116
    private ESelectionService selService;
117

    
118
    @PostConstruct
119
    public void create(Composite parent, EMenuService menuService) {
120
        if (CdmStore.isActive()){
121
            if(conversation == null){
122
                conversation = CdmStore.createConversation();
123
            }
124
        }
125
        else{
126
            return;
127
        }
128
        parent.setLayout(new GridLayout());
129
		contentDescription = new Label(parent, SWT.NONE);
130
		contentDescription.setLayoutData(new GridData(SWT.FILL, SWT.TOP, true, false));
131
		TableViewer tableViewer = new TableViewer(parent, SWT.MULTI | SWT.H_SCROLL
132
				| SWT.V_SCROLL | SWT.FULL_SELECTION);
133
		createColumns(tableViewer);
134
		tableViewer.setContentProvider(new ReferencingObjectsContentProvider());
135
		tableViewer.setLabelProvider(new ReferencingObjectsLabelProvider());
136
		tableViewer.getControl().setLayoutData(new GridData(SWT.FILL, SWT.FILL, true, true));
137

    
138
		tableViewer.setCellModifier(new ICellModifier() {
139
            @Override
140
            public void modify(Object element, String property, Object value) {
141
            }
142

    
143
            @Override
144
            public Object getValue(Object element, String property) {
145
                ITableLabelProvider tableLabelProvider = null;
146
                if(tableViewer.getLabelProvider() instanceof ITableLabelProvider){
147
                    tableLabelProvider = (ITableLabelProvider) tableViewer.getLabelProvider();
148
                }
149
                Object[] columnProperties = tableViewer.getColumnProperties();
150
                for (int i=0;i<columnProperties.length;i++) {
151
                    if(columnProperties[i].equals(property) && tableLabelProvider!=null){
152
                        return tableLabelProvider.getColumnText(element, i);
153
                    }
154
                }
155
                return "";
156
            }
157

    
158
            @Override
159
            public boolean canModify(Object element, String property) {
160
                return true;
161
            }
162
        });
163

    
164
		viewer = tableViewer;
165

    
166
        // Propagate selection from viewer
167
        selectionChangedListener = (event -> selService.setSelection(AbstractUtility.getElementsFromSelectionChangedEvent(event)));
168
        viewer.addSelectionChangedListener(selectionChangedListener);
169

    
170
        //create context menu
171
        menuService.registerContextMenu(viewer.getControl(), "eu.etaxonomy.taxeditor.bulkeditor.popupmenu.referencingobjectsview");
172

    
173
	}
174

    
175
	/**
176
	 * Create the columns for the table
177
	 * @param viewer
178
	 */
179
	private void createColumns(TableViewer viewer) {
180
		Table table = viewer.getTable();
181
		String[] titles = {"Class", "Description", "UUID", "Object ID" };
182
		int[] bounds = { 100, 200, 100, 70};
183

    
184
        CellEditor[] editors = new CellEditor[titles.length];
185

    
186
		for (int i = 0; i < titles.length; i++) {
187
			TableViewerColumn column = new TableViewerColumn(viewer, SWT.NONE);
188
			editors[i] = new TextCellEditor(table);
189
			column.getColumn().setText(titles[i]);
190
			column.getColumn().setWidth(bounds[i]);
191
			column.getColumn().setResizable(true);
192
			column.getColumn().setMoveable(true);
193
		}
194
		table.setHeaderVisible(true);
195
		table.setLinesVisible(true);
196

    
197
		viewer.setCellEditors(editors);
198
		viewer.setColumnProperties(titles);
199
	}
200

    
201
	public void updateReferencingObjects(final UUID entityUUID, final Class objectClass) {
202
	    if (actualUuid == entityUUID){
203
	        return ;
204
	    }
205

    
206
	    if(actualMonitor!=null && !actualMonitor.isCanceled()){
207
	        while(!actualMonitor.isCanceled()){
208
	            actualMonitor.setCanceled(true);
209
	        }
210

    
211
	    }
212
		currentJob = new Job("Update Referencing Objects") {
213

    
214
			@Override
215
			protected IStatus run(final IProgressMonitor monitor) {
216
				monitor.beginTask("Calculating referencing objects", 100);
217
				actualUuid = entityUUID;
218

    
219
				monitor.worked(5);
220
				referencingObjects = new ArrayList<>();
221
				if(monitor.isCanceled()) {
222
				    actualUuid = null;
223
                    return Status.CANCEL_STATUS;
224
                }
225
				if (actualMonitor != null){
226
				    actualMonitor.setCanceled(true);
227

    
228
				}
229
				actualMonitor = monitor;
230
				if (entityUUID != null){
231
	                referencingObjectsSet = getReferencingObjects(entityUUID, objectClass);
232

    
233
	                if(monitor.isCanceled()) {
234
	                    actualUuid = null;
235

    
236
	                    return Status.CANCEL_STATUS;
237
	                }
238
	                monitor.worked(30);
239
	                referencingObjects = sortReferencing();
240
	                if (referencingObjects == null){
241
	                    if (monitor.isCanceled()){
242
	                        actualUuid = null;
243

    
244
	                        return Status.CANCEL_STATUS;
245
	                    }
246
	                }
247

    
248
	                if(monitor.isCanceled()) {
249
	                    return Status.CANCEL_STATUS;
250
	                }
251
	                monitor.worked(80);
252

    
253
	                updateView();
254
				}
255
				monitor.done();
256
				actualMonitor = null;
257

    
258
				return Status.OK_STATUS;
259

    
260

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

    
265
		currentJob.schedule();
266
	}
267

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

    
312
        	if (referencedObject != null){
313
        	    if(referencedObject.isInstanceOf(IdentifiableEntity.class)){
314
        	        referencedObjectTitleCache = (HibernateProxyHelper.deproxy(referencedObject, IdentifiableEntity.class)).getTitleCache();
315
        	    }
316
        	    else if(referencedObject.isInstanceOf(DescriptionElementBase.class)){
317
        	        referencedObjectTitleCache = DescriptionHelper.getLabel(referencedObject);
318
        	    }
319
        	    else if (referencedObject.isInstanceOf(User.class)){
320
        	        referencedObjectTitleCache = ((User)referencedObject).getUsername();
321
        	    }else{
322
        	        referencedObjectTitleCache = null;
323
        	    }
324
        		setOfReferencingObjects = CdmStore.getCommonService().getReferencingObjects(referencedObject);
325
        		return setOfReferencingObjects;
326
        	}
327

    
328
        } catch (Exception e) {
329
            logger.debug("Error retrieving referencing objects", e);
330
            e.printStackTrace();
331
            updateDescription("The referencing objects view could not be loaded completely. Some Problems occured.");
332
        }
333
		return null;
334
	}
335

    
336
	private List<CdmBase> sortReferencing(){
337

    
338
	    if (referencingObjectsSet != null){
339
            List<CdmBase> referencingObjects = new ArrayList<CdmBase>(referencingObjectsSet);
340
            try{
341
                Collections.sort(referencingObjects, new ReferencingClassComparator());
342
            }catch (RemoteAccessException e){
343
                logger.debug(e.getStackTrace());
344
                return null;
345
            }
346
            return referencingObjects;
347

    
348
        }
349

    
350
	    return null;
351
	}
352

    
353
	class ReferencingClassComparator implements Comparator<CdmBase>   {
354

    
355
		@Override
356
        public int compare(CdmBase o1, CdmBase o2) {
357
			String string1 = o1.getClass().getSimpleName();
358
			String string2 = o2.getClass().getSimpleName();
359
			int result = string1.compareToIgnoreCase(string2);
360
			if (result == 0) {
361
				string1 = DescriptionHelper.getObjectDescription(o1);
362
				string2 = DescriptionHelper.getObjectDescription(o2);
363

    
364
				result = string1.compareToIgnoreCase(string2);
365
				if (result == 0){
366
				    return o1.getUuid().compareTo(o2.getUuid());
367
				}
368
			}
369
				return result;
370
		}
371
	}
372

    
373
	private void updateView() {
374
	    Display.getDefault().asyncExec(new Runnable() {
375
            @Override
376
            public void run() {
377

    
378
        		if (viewer != null && !viewer.getControl().isDisposed()){
379
        			try{
380
        				viewer.setInput(referencingObjects);
381

    
382
        				viewer.refresh();
383

    
384
        				//enable/disable table
385
        				viewer.getControl().setEnabled(referencingObjects!=null);
386
        			}catch(Exception e){
387
        			    e.printStackTrace();
388
        			    logger.debug(e.getStackTrace());
389
        			    updateDescription("The referencing objects view could not be loaded completely. Some Problems occured.");
390
        			}
391
        		}
392
            }
393
            });
394
	}
395

    
396

    
397
	private void updateDescription(final String description){
398
	    Display.getDefault().asyncExec(new Runnable() {
399
            @Override
400
            public void run() {
401
                if(contentDescription!=null && !contentDescription.isDisposed()) {
402
                    contentDescription.setText(description);
403
                }
404
            }
405

    
406
         });
407
	 }
408

    
409
    @Override
410
    public void selectionChanged_internal(Object selection, MPart activePart, MPart thisPart) {
411
        if(activePart==thisPart){
412
            return;
413
        }
414

    
415
        IStructuredSelection structuredSelection = createSelection(selection);
416
        if(structuredSelection!=null){
417
        	//referencedObjectTitleCache = null;
418
        	showViewer(structuredSelection, activePart, viewer);
419
        }
420
	}
421

    
422
	/** {@inheritDoc} */
423
	@Override
424
	public void showViewer(IStructuredSelection selection, MPart activePart, Viewer viewer){
425
	//	this.part = part;
426

    
427
		Object firstElement = selection.getFirstElement();
428
		if(firstElement instanceof TreeNode){
429
		    firstElement = ((TreeNode) firstElement).getValue();
430
		}
431
		if (firstElement instanceof TaxonNode && !((TaxonNode)firstElement).hasTaxon()){
432
			firstElement = ((TaxonNode)firstElement).getClassification();
433
		}
434
		if(firstElement instanceof CdmBase){
435
		    CdmBase referencedCdmObject = (CdmBase) firstElement;
436
		    if (referencedCdmObject.getUuid() == actualUuid){
437
		        return;
438
		    }
439
		    if (referencedCdmObject != null){
440
                if(referencedCdmObject.isInstanceOf(IdentifiableEntity.class)){
441
                    referencedObjectTitleCache = (HibernateProxyHelper.deproxy(referencedCdmObject, IdentifiableEntity.class)).getTitleCache();
442
                }
443
                else if(referencedCdmObject.isInstanceOf(DescriptionElementBase.class)){
444
                    referencedObjectTitleCache = DescriptionHelper.getLabel(referencedCdmObject);
445
                }
446
                else if (referencedCdmObject.isInstanceOf(User.class)){
447
                    referencedObjectTitleCache = ((User)referencedCdmObject).getUsername();
448
                }else if (referencedCdmObject.isInstanceOf(TaxonNode.class)){
449
                    referencedObjectTitleCache = "TaxonNode of "+(HibernateProxyHelper.deproxy(referencedCdmObject, TaxonNode.class)).getTaxon().getTitleCache();
450
                }
451
		    }
452
		    if (referencedObjectTitleCache != null){
453
		        updateDescription("'" + referencedObjectTitleCache + "' is referenced by:");
454
		    } else{
455
		        updateDescription("");
456
		    }
457

    
458
		    updateReferencingObjects(referencedCdmObject.getUuid(),firstElement.getClass() );
459

    
460
		}
461
		else if (firstElement != null){
462
		    updateView();
463
            updateDescription("");
464
		}
465
	}
466

    
467
	/** {@inheritDoc} */
468
	@PreDestroy
469
	public void dispose() {
470
		conversation.close();
471
	}
472

    
473
	/** {@inheritDoc} */
474
	@Override
475
	public void changed(Object object) {
476
		// no editing in this view
477
	}
478

    
479
	/** {@inheritDoc} */
480
	@Override
481
	public boolean onComplete() {
482
		return false;
483
	}
484

    
485
	@Override
486
	protected String getViewName() {
487
		return "Referencing Objects";
488
	}
489

    
490
}
    (1-1/1)