Project

General

Profile

Download (22.6 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.Arrays;
14
import java.util.Collections;
15
import java.util.Comparator;
16
import java.util.HashMap;
17
import java.util.HashSet;
18
import java.util.List;
19
import java.util.Map;
20
import java.util.Set;
21
import java.util.UUID;
22

    
23
import javax.annotation.PostConstruct;
24
import javax.annotation.PreDestroy;
25

    
26
import org.apache.log4j.Logger;
27
import org.eclipse.core.runtime.IProgressMonitor;
28
import org.eclipse.core.runtime.IStatus;
29
import org.eclipse.core.runtime.Status;
30
import org.eclipse.core.runtime.jobs.Job;
31
import org.eclipse.e4.ui.model.application.ui.basic.MPart;
32
import org.eclipse.e4.ui.services.EMenuService;
33
import org.eclipse.jface.viewers.CellEditor;
34
import org.eclipse.jface.viewers.ICellModifier;
35
import org.eclipse.jface.viewers.IStructuredSelection;
36
import org.eclipse.jface.viewers.ITableLabelProvider;
37
import org.eclipse.jface.viewers.TableViewer;
38
import org.eclipse.jface.viewers.TableViewerColumn;
39
import org.eclipse.jface.viewers.TextCellEditor;
40
import org.eclipse.jface.viewers.TreeNode;
41
import org.eclipse.jface.viewers.Viewer;
42
import org.eclipse.swt.SWT;
43
import org.eclipse.swt.layout.GridData;
44
import org.eclipse.swt.layout.GridLayout;
45
import org.eclipse.swt.widgets.Composite;
46
import org.eclipse.swt.widgets.Display;
47
import org.eclipse.swt.widgets.Label;
48
import org.eclipse.swt.widgets.Table;
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.common.CdmUtils;
66
import eu.etaxonomy.cdm.hibernate.HibernateProxyHelper;
67
import eu.etaxonomy.cdm.model.agent.TeamOrPersonBase;
68
import eu.etaxonomy.cdm.model.common.CdmBase;
69
import eu.etaxonomy.cdm.model.common.EventBase;
70
import eu.etaxonomy.cdm.model.common.IdentifiableEntity;
71
import eu.etaxonomy.cdm.model.description.DescriptionBase;
72
import eu.etaxonomy.cdm.model.description.DescriptionElementBase;
73
import eu.etaxonomy.cdm.model.description.PolytomousKey;
74
import eu.etaxonomy.cdm.model.description.PolytomousKeyNode;
75
import eu.etaxonomy.cdm.model.media.Media;
76
import eu.etaxonomy.cdm.model.molecular.Sequence;
77
import eu.etaxonomy.cdm.model.name.TaxonName;
78
import eu.etaxonomy.cdm.model.occurrence.SpecimenOrObservationBase;
79
import eu.etaxonomy.cdm.model.permission.Group;
80
import eu.etaxonomy.cdm.model.permission.User;
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.cdm.model.term.DefinedTermBase;
85
import eu.etaxonomy.cdm.model.term.TermBase;
86
import eu.etaxonomy.cdm.persistence.dto.ReferencingObjectDto;
87
import eu.etaxonomy.cdm.persistence.dto.TermDto;
88
import eu.etaxonomy.cdm.persistence.dto.UuidAndTitleCache;
89
import eu.etaxonomy.taxeditor.bulkeditor.referencingobjects.ReferencingObjectsContentProvider;
90
import eu.etaxonomy.taxeditor.bulkeditor.referencingobjects.ReferencingObjectsLabelProvider;
91
import eu.etaxonomy.taxeditor.editor.IReferencingObjectsView;
92
import eu.etaxonomy.taxeditor.model.AbstractUtility;
93
import eu.etaxonomy.taxeditor.model.DescriptionHelper;
94
import eu.etaxonomy.taxeditor.store.CdmStore;
95
import eu.etaxonomy.taxeditor.view.e4.AbstractCdmEditorPartE4;
96

    
97
/**
98
 * @author pplitzner
99
 * @since Aug 16, 2017
100
 */
101
public class ReferencingObjectsViewE4 extends AbstractCdmEditorPartE4 implements IReferencingObjectsView{
102

    
103
    private static final Logger logger = Logger.getLogger(ReferencingObjectsViewE4.class);
104

    
105
    public static final String IS_LOADING = "Loading ...";
106
//    public static final String CANCELED = "Canceled ...";
107

    
108
    private Label contentDescription;
109
    private String description;
110

    
111
//	private String referencedObjectTitleCache;
112
	private ConversationHolder conversation;
113
	private UUID actualUuid;
114
	private List<ReferencingObjectDto> referencingObjects = null;
115
	private Set<ReferencingObjectDto> referencingObjectsSet = null;
116
	private IProgressMonitor actualMonitor = null;
117
	private Job currentJob = null;
118

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

    
139
		tableViewer.setCellModifier(new ICellModifier() {
140

    
141
            @Override
142
            public void modify(Object element, String property, Object value) {}
143

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

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

    
165
		viewer = tableViewer;
166

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

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

    
174
	}
175

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

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

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

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

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

    
208
	    if(actualMonitor!=null && !actualMonitor.isCanceled()){
209
	        while(!actualMonitor.isCanceled()){
210
	            actualMonitor.setCanceled(true);
211
	        }
212
	    }
213

    
214
		currentJob = new Job("Update Referencing Objects for " + entityUUID) {
215

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

    
221
				monitor.worked(2);
222
				ReferencingObjectDto loadDto = new ReferencingObjectDto();
223
				loadDto.setTitleCache(IS_LOADING);
224
				referencingObjects = Arrays.asList(loadDto);
225
				updateView();
226
				if(monitor.isCanceled()) {
227
//				    actualUuid = null;
228
                    return Status.CANCEL_STATUS;
229
                }
230
				if (actualMonitor != null){
231
				    actualMonitor.setCanceled(true);
232
				}
233
				actualMonitor = monitor;
234
				if (entityUUID != null){
235
				    monitor.subTask("Load data from server");
236
				    monitor.worked(1);
237
	                Set<ReferencingObjectDto> refObjectsFromServer = loadReferencingObjects(entityUUID, objectClass);
238
	                if (refObjectsFromServer == null){
239
	                    return Status.CANCEL_STATUS;  //TODO is this correct?, null can happen e.g. if server call throws exception
240
	                }
241
	                monitor.worked(25);
242
	                if(monitor.isCanceled()) {
243
//	                  actualUuid = null;
244
	                    return Status.CANCEL_STATUS;
245
	                }
246
	                referencingObjectsSet = refObjectsFromServer;
247

    
248
	                monitor.subTask("Show without description");
249
	                monitor.worked(1);//maybe this helps to update the subtask label
250

    
251
	                //TODO have a status line instead
252
	                int count = referencingObjectsSet == null? 0: referencingObjectsSet.size();
253
	                updateDescriptionLabel(CdmUtils.Nz(description) + "(n="+count+")"); //
254

    
255

    
256
	                List<ReferencingObjectDto> localDtos = sortToList(referencingObjectsSet, monitor);
257
	                monitor.worked(10);
258
	                if(monitor.isCanceled()) {
259
//	                    actualUuid = null;
260
	                    return Status.CANCEL_STATUS;
261
	                }
262
	                referencingObjects = localDtos;
263
	                updateView();
264

    
265
	                monitor.subTask("Initialize");
266
	                monitor.worked(1);//maybe this helps to update the subtask label
267
                    initializeDtos(localDtos, monitor, 50);
268
                    if (monitor.isCanceled()){
269
//                        actualUuid = null;
270
                        //TODO use status line instead
271
//                        referencingObjects = Arrays.asList(CANCELED);
272
                        updateView();
273
//                        monitor.done();
274
                        return Status.CANCEL_STATUS;
275
                    }
276

    
277
	                if(monitor.isCanceled()) {
278
	                    return Status.CANCEL_STATUS;
279
	                }
280
	                monitor.subTask("Update View");
281

    
282
	                updateView();
283
	                monitor.worked(5);
284
				}
285
				monitor.done();
286
				actualMonitor = null;
287

    
288
				return Status.OK_STATUS;
289
			}
290

    
291
		};
292
		currentJob.setUser(true);
293

    
294
		currentJob.schedule();
295
	}
296

    
297
    private List<ReferencingObjectDto> sortToList(Set<ReferencingObjectDto> referencingObjectsSet, IProgressMonitor monitor) {
298
        List<ReferencingObjectDto> result = new ArrayList<>(referencingObjectsSet);
299
        //TODO make singleton
300
        Collections.sort(result, new RefObjectDtoComparator());
301
        return result;
302
    }
303

    
304
    protected boolean initializeDtos(List<ReferencingObjectDto> localDtos, IProgressMonitor monitor, int work) {
305
        IProgressMonitor subMonitor = AbstractUtility.getSubProgressMonitor(monitor, work);
306
        subMonitor.beginTask("Initialize DTOs", localDtos.size());
307

    
308
        int i = 100 - 20;  //the first run should only include 20 records
309

    
310
        Set<ReferencingObjectDto> toInitialize = new HashSet<>();
311
        for (ReferencingObjectDto dto : localDtos){
312
            toInitialize.add(dto);
313

    
314
//            dto.setTitleCache(ReferencingObjectFormatter.format(dto.getReferencedEntity(), CdmStore.getDefaultLanguage() ));
315
            if (monitor.isCanceled()){
316
                return false;
317
            }
318
            subMonitor.worked(1);
319
            if (++i == 100){
320
                initBulk(toInitialize);
321
                updateView();
322
                toInitialize = new HashSet<>();
323
                i = 0;
324
            }
325
        }
326
        initBulk(toInitialize);
327
        return true;
328
    }
329

    
330
    private void initBulk(Set<ReferencingObjectDto> toInitialize) {
331
        Set<ReferencingObjectDto> initialized = CdmStore.getCommonService().initializeReferencingObjectDtos(toInitialize, true, true, true, CdmStore.getDefaultLanguage());
332
        Map<UUID,ReferencingObjectDto> map = new HashMap<>();
333
        initialized.forEach(i->map.put(i.getUuid(), i));
334
        toInitialize.forEach(dto->merge(dto, map.get(dto.getUuid())));
335
        updateView();
336

    
337
    }
338

    
339
    private void merge(ReferencingObjectDto to, ReferencingObjectDto from) {
340
        to.setTitleCache(from.getTitleCache());
341
        to.setOpenInTarget(from.getOpenInTarget());
342
        to.setReferencedEntity(from.getReferencedEntity());
343
    }
344

    
345
    private Set<ReferencingObjectDto> loadReferencingObjects(UUID entity, Class objectClass) {
346
		//TODO why do we need to load the referenced object here
347
        CdmBase referencedObject = null;
348
        try {
349
        	if (objectClass.getSuperclass().equals(TeamOrPersonBase.class) ){
350
	        	referencedObject = CdmStore.getService(IAgentService.class).load(entity);
351
        	} else if (objectClass.getSuperclass().equals(TaxonName.class)){
352
        		referencedObject = CdmStore.getService(INameService.class).load(entity);
353
        	} else if (objectClass.getSuperclass().equals(TaxonBase.class)){
354
        		referencedObject = CdmStore.getService(ITaxonService.class).load(entity);
355
        	} else if (objectClass.equals(Reference.class)){
356
        		referencedObject = CdmStore.getService(IReferenceService.class).load(entity);
357
        	} else if (objectClass.getSuperclass().equals(SpecimenOrObservationBase.class)){
358
        		referencedObject = CdmStore.getService(IOccurrenceService.class).load(entity);
359
        	} else if (objectClass.isAssignableFrom(User.class)){
360
        		referencedObject = CdmStore.getService(IUserService.class).load(entity);
361
        	} else if (objectClass.isAssignableFrom(Group.class)){
362
        		referencedObject = CdmStore.getService(IGroupService.class).load(entity);
363
        	} else if (objectClass.isAssignableFrom(Media.class)){
364
        	    referencedObject = CdmStore.getService(IMediaService.class).load(entity);
365
        	} else if (DescriptionBase.class.isAssignableFrom(objectClass)){
366
        	    referencedObject = CdmStore.getService(IDescriptionService.class).load(entity);
367
        	} else if (DescriptionElementBase.class.isAssignableFrom(objectClass)){
368
                referencedObject = CdmStore.getService(IDescriptionService.class).loadDescriptionElement(entity, null);
369
            } else if (objectClass.equals(Sequence.class)){
370
                referencedObject = CdmStore.getService(ISequenceService.class).load(entity, null);
371
            } else if (PolytomousKey.class.isAssignableFrom(objectClass)){
372
                referencedObject = CdmStore.getService(IPolytomousKeyService.class).load(entity, null);
373
            } else if (PolytomousKeyNode.class.isAssignableFrom(objectClass)){
374
                referencedObject = CdmStore.getService(IPolytomousKeyNodeService.class).load(entity, null);
375
            } else if (DefinedTermBase.class.isAssignableFrom(objectClass)){
376
                referencedObject = CdmStore.getService(ITermService.class).load(entity, null);
377
            } else if (EventBase.class.isAssignableFrom(objectClass)){
378
                referencedObject = CdmStore.getService(IEventBaseService.class).load(entity, null);
379
            } else if (User.class.isAssignableFrom(objectClass)){
380
                referencedObject = CdmStore.getService(IUserService.class).load(entity, null);
381
            } else if (Group.class.isAssignableFrom(objectClass)){
382
                referencedObject = CdmStore.getService(IGroupService.class).load(entity, null);
383
            }
384
            else if(CdmBase.class.isAssignableFrom(objectClass)){
385
                referencedObject = CdmStore.getCommonService().find(objectClass, entity);
386
            }
387
	        	//referencedObject =(CdmBase) CdmStore.getService(IIdentifiableEntityService.class).load(referencedObject.getUuid());
388
        	Set<ReferencingObjectDto> setOfReferencingObjects = null;
389

    
390
        	if (referencedObject != null){
391
//        	    if(referencedObject.isInstanceOf(IdentifiableEntity.class)){
392
//        	        referencedObjectTitleCache = (HibernateProxyHelper.deproxy(referencedObject, IdentifiableEntity.class)).getTitleCache();
393
//        	    }
394
//        	    else if(referencedObject.isInstanceOf(DescriptionElementBase.class)){
395
//        	        referencedObjectTitleCache = DescriptionHelper.getLabel(referencedObject);
396
//        	    }
397
//        	    else if (referencedObject.isInstanceOf(User.class)){
398
//        	        referencedObjectTitleCache = ((User)referencedObject).getUsername();
399
//        	    }else{
400
//        	        referencedObjectTitleCache = DescriptionHelper.getLabel(referencedObject);
401
//        	    }
402
        		setOfReferencingObjects = CdmStore.getCommonService().getReferencingObjectDtos(referencedObject);
403
        		return setOfReferencingObjects;
404
        	}
405

    
406
        } catch (Exception e) {
407
            logger.debug("Error retrieving referencing objects", e);
408
            e.printStackTrace();
409
            updateDescriptionLabel("The referencing objects view could not be loaded completely. Some problems occurred: " + e.getMessage());
410
        }
411
		return null;
412
	}
413

    
414
	class RefObjectDtoComparator implements Comparator<ReferencingObjectDto>{
415

    
416
        @Override
417
        public int compare(ReferencingObjectDto dto1, ReferencingObjectDto dto2) {
418
            int result = dto1.getType().getSimpleName().compareToIgnoreCase(dto2.getType().getSimpleName());
419
            if (result == 0) {
420
                result = Integer.compare(dto1.getId(),dto2.getId());
421
            }
422
            return result;
423
        }
424
	}
425

    
426
	private void updateView() {
427
	    Display.getDefault().asyncExec(()->{
428
	        if (viewer != null && !viewer.getControl().isDisposed()){
429
                try{
430
                    viewer.setInput(referencingObjects);
431
                    viewer.refresh();
432

    
433
                    //enable/disable table
434
                    viewer.getControl().setEnabled(referencingObjects!=null);
435
                }catch(Exception e){
436
                    e.printStackTrace();
437
                    logger.debug(e.getStackTrace());
438
                    updateDescriptionLabel("The referencing objects view could not be updated completely. Some Problems occurred: " + e.getMessage());
439
                }
440
            }
441
	    });
442
	}
443

    
444

    
445
	private void updateDescriptionLabel(final String description){
446
	    Display.getDefault().asyncExec(()->{
447
                if(contentDescription!=null && !contentDescription.isDisposed()) {
448
                    contentDescription.setText(description.replace("&", "&&"));
449
                }
450
            }
451
         );
452
	 }
453

    
454
    @Override
455
    public void selectionChanged_internal(Object selection, MPart activePart, MPart thisPart) {
456
        if(activePart==thisPart){
457
            return;
458
        }
459

    
460
        IStructuredSelection structuredSelection = createSelection(selection);
461
        if(structuredSelection!=null){
462
        	//referencedObjectTitleCache = null;
463
        	showViewer(structuredSelection, activePart, viewer);
464
        }
465
	}
466

    
467
	@Override
468
	public void showViewer(IStructuredSelection selection, MPart activePart, Viewer viewer){
469
	//	this.part = part;
470

    
471
		Object firstElement = selection.getFirstElement();
472
		if (firstElement instanceof TermDto){
473
		   TermDto termDto = (TermDto) firstElement;
474
		   description = "'"+termDto.getRepresentation_L10n() + "' is referenced by:";
475
		   updateDescriptionLabel(description);
476
		   updateReferencingObjects(termDto.getUuid(), TermBase.class );
477
		   return;
478
		}
479
		if(firstElement instanceof TreeNode){
480
		    firstElement = ((TreeNode) firstElement).getValue();
481
		}
482
		if (firstElement instanceof TaxonNode && !((TaxonNode)firstElement).hasTaxon()){
483
			firstElement = ((TaxonNode)firstElement).getClassification();
484
		}
485
		if(firstElement instanceof CdmBase){
486
		    firstElement= CdmBase.deproxy(firstElement, CdmBase.class);
487
		    CdmBase referencedCdmObject = (CdmBase)firstElement;
488
		    if (referencedCdmObject.getUuid() == actualUuid){
489
		        return;
490
		    }
491
		    String referencedObjectTitleCache = null;
492
	        if(referencedCdmObject.isInstanceOf(IdentifiableEntity.class)){
493
                referencedObjectTitleCache = (HibernateProxyHelper.deproxy(referencedCdmObject, IdentifiableEntity.class)).getTitleCache();
494
            }
495
            else if(referencedCdmObject.isInstanceOf(DescriptionElementBase.class)){
496
                referencedObjectTitleCache = DescriptionHelper.getLabel(referencedCdmObject);
497
            }
498
            else if (referencedCdmObject.isInstanceOf(User.class)){
499
                referencedObjectTitleCache = ((User)referencedCdmObject).getUsername();
500
            }else if (referencedCdmObject.isInstanceOf(TaxonNode.class)){
501
                referencedObjectTitleCache = "TaxonNode of "+(HibernateProxyHelper.deproxy(referencedCdmObject, TaxonNode.class)).getTaxon().getTitleCache();
502
            }
503
	        if (CdmUtils.isBlank(referencedObjectTitleCache)){
504
	            referencedObjectTitleCache = "#"+referencedCdmObject.getId();
505
	        }
506
	        description = referencedCdmObject.getUserFriendlyTypeName() + " '" + referencedObjectTitleCache + "' is referenced by:";
507
	        updateDescriptionLabel(description);
508

    
509
		    updateReferencingObjects(referencedCdmObject.getUuid(),firstElement.getClass() );
510

    
511
		}else if  (firstElement instanceof UuidAndTitleCache<?>){
512
		    UuidAndTitleCache<?> element = (UuidAndTitleCache<?>) firstElement;
513
		    description = element.getType().getSimpleName() + " '" + element.getTitleCache() + "' is referenced by:";
514
	        updateDescriptionLabel(description);
515
            updateReferencingObjects(element.getUuid(),element.getType());
516
		}
517
		else if (firstElement != null){
518
		    updateView();
519
            description = "undefined:";
520
		    updateDescriptionLabel(description);
521
		}
522
	}
523

    
524
	@PreDestroy
525
	public void dispose() {
526
	    if(conversation!=null){
527
	        conversation.close();
528
	        conversation = null;
529
	    }
530
	}
531

    
532
	@Override
533
	public void changed(Object object) {
534
		// no editing in this view
535
	}
536

    
537
	@Override
538
	public boolean onComplete() {
539
		return false;
540
	}
541

    
542
	@Override
543
	protected String getViewName() {
544
		return "Referencing Objects";
545
	}
546
}
    (1-1/1)