Project

General

Profile

Download (18 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.widgets.Composite;
43
import org.eclipse.swt.widgets.Display;
44
import org.eclipse.swt.widgets.Table;
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.TaxonName;
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.cdm.model.taxon.TaxonNode;
81
import eu.etaxonomy.taxeditor.bulkeditor.referencingobjects.ReferencingObjectsContentProvider;
82
import eu.etaxonomy.taxeditor.bulkeditor.referencingobjects.ReferencingObjectsLabelProvider;
83
import eu.etaxonomy.taxeditor.model.AbstractUtility;
84
import eu.etaxonomy.taxeditor.model.DescriptionHelper;
85
import eu.etaxonomy.taxeditor.store.CdmStore;
86
import eu.etaxonomy.taxeditor.view.e4.AbstractCdmEditorPartE4;
87

    
88
/**
89
 *
90
 * @author pplitzner
91
 * @since Aug 16, 2017
92
 *
93
 */
94
public class ReferencingObjectsViewE4 extends AbstractCdmEditorPartE4 {
95

    
96
    private static final Logger logger = Logger
97
			.getLogger(ReferencingObjectsViewE4.class);
98

    
99
	private TableViewer viewer;
100

    
101
	private String referencedObjectTitleCache;
102
	private ConversationHolder conversation;
103
	private UUID actualUuid;
104
	List<CdmBase> referencingObjects = null;
105
	Set<CdmBase> referencingObjectsSet = null;
106
	IProgressMonitor actualMonitor = null;
107
	private Job currentJob = null;
108

    
109
    private ISelectionChangedListener selectionChangedListener;
110

    
111
    @Inject
112
    private ESelectionService selService;
113

    
114
    @PostConstruct
115
    public void create(Composite parent, EMenuService menuService) {
116

    
117
		conversation = CdmStore.createConversation();
118
		TableViewer tableViewer = new TableViewer(parent, SWT.MULTI | SWT.H_SCROLL
119
				| SWT.V_SCROLL | SWT.FULL_SELECTION);
120
		createColumns(tableViewer);
121
		tableViewer.setContentProvider(new ReferencingObjectsContentProvider());
122
		tableViewer.setLabelProvider(new ReferencingObjectsLabelProvider());
123

    
124
		tableViewer.setCellModifier(new ICellModifier() {
125
            @Override
126
            public void modify(Object element, String property, Object value) {
127
            }
128

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

    
144
            @Override
145
            public boolean canModify(Object element, String property) {
146
                return true;
147
            }
148
        });
149

    
150
		viewer = tableViewer;
151

    
152
        // Propagate selection from viewer
153
        selectionChangedListener = (event -> selService.setSelection(AbstractUtility.getElementsFromSelectionChangedEvent(event)));
154
        viewer.addSelectionChangedListener(selectionChangedListener);
155

    
156
        //create context menu
157
        menuService.registerContextMenu(viewer.getControl(), "eu.etaxonomy.taxeditor.bulkeditor.popupmenu.referencingobjectsview");
158

    
159
	}
160

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

    
170
        CellEditor[] editors = new CellEditor[titles.length];
171

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

    
183
		viewer.setCellEditors(editors);
184
		viewer.setColumnProperties(titles);
185
	}
186

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

    
192
	    if(actualMonitor!=null && !actualMonitor.isCanceled()){
193
	        while(!actualMonitor.isCanceled()){
194
	            actualMonitor.setCanceled(true);
195
	        }
196

    
197
	    }
198
		currentJob = new Job("Update Referencing Objects") {
199

    
200
			@Override
201
			protected IStatus run(final IProgressMonitor monitor) {
202
				monitor.beginTask("Calculating referencing objects", 100);
203
				actualUuid = entityUUID;
204

    
205
				monitor.worked(5);
206
				referencingObjects = new ArrayList<>();
207
				if(monitor.isCanceled()) {
208
				    actualUuid = null;
209
                    return Status.CANCEL_STATUS;
210
                }
211
				if (actualMonitor != null){
212
				    actualMonitor.setCanceled(true);
213

    
214
				}
215
				actualMonitor = monitor;
216
				if (entityUUID != null){
217
	                referencingObjectsSet = getReferencingObjects(entityUUID, objectClass);
218

    
219
	                if(monitor.isCanceled()) {
220
	                    actualUuid = null;
221

    
222
	                    return Status.CANCEL_STATUS;
223
	                }
224
	                monitor.worked(30);
225
	                referencingObjects = sortReferencing();
226
	                if (referencingObjects == null){
227
	                    if (monitor.isCanceled()){
228
	                        actualUuid = null;
229

    
230
	                        return Status.CANCEL_STATUS;
231
	                    }
232
	                }
233

    
234
	                if(monitor.isCanceled()) {
235
	                    return Status.CANCEL_STATUS;
236
	                }
237
	                monitor.worked(80);
238

    
239
	                updateView();
240
				}
241
				monitor.done();
242
				actualMonitor = null;
243

    
244
				return Status.OK_STATUS;
245

    
246

    
247
			}
248
		};
249
		currentJob.setUser(true);
250

    
251
		currentJob.schedule();
252
	}
253

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

    
298
        	if (referencedObject != null){
299
        	    if(referencedObject.isInstanceOf(IdentifiableEntity.class)){
300
        	        referencedObjectTitleCache = (HibernateProxyHelper.deproxy(referencedObject, IdentifiableEntity.class)).getTitleCache();
301
        	    }
302
        	    else if(referencedObject.isInstanceOf(DescriptionElementBase.class)){
303
        	        referencedObjectTitleCache = DescriptionHelper.getLabel(referencedObject);
304
        	    }
305
        	    else if (referencedObject.isInstanceOf(User.class)){
306
        	        referencedObjectTitleCache = ((User)referencedObject).getUsername();
307
        	    }else{
308
        	        referencedObjectTitleCache = null;
309
        	    }
310
        		setOfReferencingObjects = CdmStore.getCommonService().getReferencingObjects(referencedObject);
311
        		return setOfReferencingObjects;
312
        	}
313

    
314
        } catch (Exception e) {
315
            logger.debug("Error retrieving referencing objects", e);
316
            e.printStackTrace();
317
            updateDescription("The referencing objects view could not be loaded completely. Some Problems occured.");
318
        }
319
		return null;
320
	}
321

    
322
	private List<CdmBase> sortReferencing(){
323

    
324
	    if (referencingObjectsSet != null){
325
            List<CdmBase> referencingObjects = new ArrayList<CdmBase>(referencingObjectsSet);
326
            try{
327
                Collections.sort(referencingObjects, new ReferencingClassComparator());
328
            }catch (RemoteAccessException e){
329
                logger.debug(e.getStackTrace());
330
                return null;
331
            }
332
            return referencingObjects;
333

    
334
        }
335

    
336
	    return null;
337
	}
338

    
339
	class ReferencingClassComparator implements Comparator<CdmBase>   {
340

    
341
		@Override
342
        public int compare(CdmBase o1, CdmBase o2) {
343
			String string1 = o1.getClass().getSimpleName();
344
			String string2 = o2.getClass().getSimpleName();
345
			int result = string1.compareToIgnoreCase(string2);
346
			if (result == 0) {
347
				string1 = DescriptionHelper.getObjectDescription(o1);
348
				string2 = DescriptionHelper.getObjectDescription(o2);
349

    
350
				result = string1.compareToIgnoreCase(string2);
351
				if (result == 0){
352
				    return o1.getUuid().compareTo(o2.getUuid());
353
				}
354
			}
355
				return result;
356
		}
357
	}
358

    
359
	private void updateView() {
360
	    Display.getDefault().asyncExec(new Runnable() {
361
            @Override
362
            public void run() {
363

    
364
        		if (viewer != null && !viewer.getControl().isDisposed()){
365
        			try{
366
        				viewer.setInput(referencingObjects);
367

    
368
        				viewer.refresh();
369

    
370
        				//enable/disable table
371
        				viewer.getControl().setEnabled(referencingObjects!=null);
372
        			}catch(Exception e){
373
        			    e.printStackTrace();
374
        			    logger.debug(e.getStackTrace());
375
        			    updateDescription("The referencing objects view could not be loaded completely. Some Problems occured.");
376
        			}
377
        		}
378
            }
379
            });
380
	}
381

    
382

    
383
	private void updateDescription(final String description){
384
	    Display.getDefault().asyncExec(new Runnable() {
385
            @Override
386
            public void run() {
387
            	if (referencedObjectTitleCache != null){
388
            	    //FIXME E4 implement
389
//                    setContentDescription(description);
390
                } else {
391
//                    setContentDescription(description);
392
                }
393

    
394
            }
395

    
396
         });
397
	 }
398

    
399
    @Override
400
    public void selectionChanged_internal(Object selection, MPart activePart, MPart thisPart) {
401
        if(activePart==thisPart){
402
            return;
403
        }
404

    
405
        IStructuredSelection structuredSelection = createSelection(selection);
406
        if(structuredSelection!=null){
407
        	//referencedObjectTitleCache = null;
408
        	showViewer(structuredSelection, activePart, viewer);
409
        }
410
	}
411

    
412
	/** {@inheritDoc} */
413
	@Override
414
	public void showViewer(IStructuredSelection selection, MPart activePart, Viewer viewer){
415
	//	this.part = part;
416

    
417
		Object firstElement = selection.getFirstElement();
418
		if(firstElement instanceof TreeNode){
419
		    firstElement = ((TreeNode) firstElement).getValue();
420
		}
421
		if (firstElement instanceof TaxonNode && !((TaxonNode)firstElement).hasTaxon()){
422
			firstElement = ((TaxonNode)firstElement).getClassification();
423
		}
424
		if(firstElement instanceof CdmBase){
425
		    CdmBase referencedCdmObject = (CdmBase) firstElement;
426
		    if (referencedCdmObject.getUuid() == actualUuid){
427
		        return;
428
		    }
429
		    if (referencedCdmObject != null){
430
                if(referencedCdmObject.isInstanceOf(IdentifiableEntity.class)){
431
                    referencedObjectTitleCache = (HibernateProxyHelper.deproxy(referencedCdmObject, IdentifiableEntity.class)).getTitleCache();
432
                }
433
                else if(referencedCdmObject.isInstanceOf(DescriptionElementBase.class)){
434
                    referencedObjectTitleCache = DescriptionHelper.getLabel(referencedCdmObject);
435
                }
436
                else if (referencedCdmObject.isInstanceOf(User.class)){
437
                    referencedObjectTitleCache = ((User)referencedCdmObject).getUsername();
438
                }else if (referencedCdmObject.isInstanceOf(TaxonNode.class)){
439
                    referencedObjectTitleCache = "TaxonNode of "+(HibernateProxyHelper.deproxy(referencedCdmObject, TaxonNode.class)).getTaxon().getTitleCache();
440
                }
441
		    }
442
		    if (referencedObjectTitleCache != null){
443
		        updateDescription("'" + referencedObjectTitleCache + "' is referenced by:");
444
		    } else{
445
		        updateDescription("");
446
		    }
447

    
448
		    updateReferencingObjects(referencedCdmObject.getUuid(),firstElement.getClass() );
449

    
450
		}
451
		else if (firstElement != null){
452
		    updateView();
453
            updateDescription("");
454
		}
455
	}
456

    
457
	/** {@inheritDoc} */
458
	@PreDestroy
459
	public void dispose() {
460
		conversation.close();
461
	}
462

    
463
	/** {@inheritDoc} */
464
	@Override
465
	public void changed(Object object) {
466
		// no editing in this view
467
	}
468

    
469
	/** {@inheritDoc} */
470
	@Override
471
	public boolean onComplete() {
472
		return false;
473
	}
474

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

    
480
}
    (1-1/1)