2 * Copyright (C) 2007 EDIT
3 * European Distributed Institute of Taxonomy
4 * http://www.e-taxonomy.eu
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.
10 package eu
.etaxonomy
.taxeditor
.bulkeditor
.referencingobjects
.e4
;
12 import java
.util
.ArrayList
;
13 import java
.util
.Collections
;
14 import java
.util
.Comparator
;
15 import java
.util
.List
;
17 import java
.util
.UUID
;
19 import javax
.annotation
.PostConstruct
;
20 import javax
.annotation
.PreDestroy
;
22 import org
.apache
.log4j
.Logger
;
23 import org
.eclipse
.core
.runtime
.IProgressMonitor
;
24 import org
.eclipse
.core
.runtime
.IStatus
;
25 import org
.eclipse
.core
.runtime
.Status
;
26 import org
.eclipse
.core
.runtime
.jobs
.Job
;
27 import org
.eclipse
.e4
.ui
.model
.application
.ui
.basic
.MPart
;
28 import org
.eclipse
.e4
.ui
.services
.EMenuService
;
29 import org
.eclipse
.jface
.viewers
.CellEditor
;
30 import org
.eclipse
.jface
.viewers
.ICellModifier
;
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
.layout
.GridData
;
40 import org
.eclipse
.swt
.layout
.GridLayout
;
41 import org
.eclipse
.swt
.widgets
.Composite
;
42 import org
.eclipse
.swt
.widgets
.Display
;
43 import org
.eclipse
.swt
.widgets
.Label
;
44 import org
.eclipse
.swt
.widgets
.Table
;
45 import org
.springframework
.remoting
.RemoteAccessException
;
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
.EventBase
;
66 import eu
.etaxonomy
.cdm
.model
.common
.IdentifiableEntity
;
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
.TaxonName
;
74 import eu
.etaxonomy
.cdm
.model
.occurrence
.SpecimenOrObservationBase
;
75 import eu
.etaxonomy
.cdm
.model
.permission
.Group
;
76 import eu
.etaxonomy
.cdm
.model
.permission
.User
;
77 import eu
.etaxonomy
.cdm
.model
.reference
.Reference
;
78 import eu
.etaxonomy
.cdm
.model
.taxon
.TaxonBase
;
79 import eu
.etaxonomy
.cdm
.model
.taxon
.TaxonNode
;
80 import eu
.etaxonomy
.cdm
.model
.term
.DefinedTermBase
;
81 import eu
.etaxonomy
.cdm
.model
.term
.TermBase
;
82 import eu
.etaxonomy
.cdm
.persistence
.dto
.TermDto
;
83 import eu
.etaxonomy
.taxeditor
.bulkeditor
.referencingobjects
.ReferencingObjectsContentProvider
;
84 import eu
.etaxonomy
.taxeditor
.bulkeditor
.referencingobjects
.ReferencingObjectsLabelProvider
;
85 import eu
.etaxonomy
.taxeditor
.editor
.IReferencingObjectsView
;
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
;
97 public class ReferencingObjectsViewE4
extends AbstractCdmEditorPartE4
implements IReferencingObjectsView
{
99 private static final Logger logger
= Logger
100 .getLogger(ReferencingObjectsViewE4
.class);
102 private Label contentDescription
;
104 private String referencedObjectTitleCache
;
105 private ConversationHolder conversation
;
106 private UUID actualUuid
;
107 List
<CdmBase
> referencingObjects
= null;
108 Set
<CdmBase
> referencingObjectsSet
= null;
109 IProgressMonitor actualMonitor
= null;
110 private Job currentJob
= null;
113 public void create(Composite parent
, EMenuService menuService
) {
114 if (CdmStore
.isActive()){
115 if(conversation
== null){
116 conversation
= CdmStore
.createConversation();
122 parent
.setLayout(new GridLayout());
123 contentDescription
= new Label(parent
, SWT
.NONE
);
124 contentDescription
.setLayoutData(new GridData(SWT
.FILL
, SWT
.TOP
, true, false));
125 TableViewer tableViewer
= new TableViewer(parent
, SWT
.MULTI
| SWT
.H_SCROLL
126 | SWT
.V_SCROLL
| SWT
.FULL_SELECTION
);
127 createColumns(tableViewer
);
128 tableViewer
.setContentProvider(new ReferencingObjectsContentProvider());
129 tableViewer
.setLabelProvider(new ReferencingObjectsLabelProvider());
130 tableViewer
.getControl().setLayoutData(new GridData(SWT
.FILL
, SWT
.FILL
, true, true));
132 tableViewer
.setCellModifier(new ICellModifier() {
134 public void modify(Object element
, String property
, Object value
) {
138 public Object
getValue(Object element
, String property
) {
139 ITableLabelProvider tableLabelProvider
= null;
140 if(tableViewer
.getLabelProvider() instanceof ITableLabelProvider
){
141 tableLabelProvider
= (ITableLabelProvider
) tableViewer
.getLabelProvider();
143 Object
[] columnProperties
= tableViewer
.getColumnProperties();
144 for (int i
=0;i
<columnProperties
.length
;i
++) {
145 if(columnProperties
[i
].equals(property
) && tableLabelProvider
!=null){
146 return tableLabelProvider
.getColumnText(element
, i
);
153 public boolean canModify(Object element
, String property
) {
158 viewer
= tableViewer
;
160 // Propagate selection from viewer
161 selectionChangedListener
= (event
-> selService
.setSelection(AbstractUtility
.getElementsFromSelectionChangedEvent(event
)));
162 viewer
.addSelectionChangedListener(selectionChangedListener
);
164 //create context menu
165 menuService
.registerContextMenu(viewer
.getControl(), "eu.etaxonomy.taxeditor.bulkeditor.popupmenu.referencingobjectsview");
170 * Create the columns for the table
173 private void createColumns(TableViewer viewer
) {
174 Table table
= viewer
.getTable();
175 String
[] titles
= {"Class", "Description", "UUID", "Object ID" };
176 int[] bounds
= { 100, 200, 100, 70};
178 CellEditor
[] editors
= new CellEditor
[titles
.length
];
180 for (int i
= 0; i
< titles
.length
; i
++) {
181 TableViewerColumn column
= new TableViewerColumn(viewer
, SWT
.NONE
);
182 editors
[i
] = new TextCellEditor(table
);
183 column
.getColumn().setText(titles
[i
]);
184 column
.getColumn().setWidth(bounds
[i
]);
185 column
.getColumn().setResizable(true);
186 column
.getColumn().setMoveable(true);
188 table
.setHeaderVisible(true);
189 table
.setLinesVisible(true);
191 viewer
.setCellEditors(editors
);
192 viewer
.setColumnProperties(titles
);
196 public void updateReferencingObjects(final UUID entityUUID
, final Class objectClass
) {
197 if (actualUuid
== entityUUID
){
201 if(actualMonitor
!=null && !actualMonitor
.isCanceled()){
202 while(!actualMonitor
.isCanceled()){
203 actualMonitor
.setCanceled(true);
207 currentJob
= new Job("Update Referencing Objects") {
210 protected IStatus
run(final IProgressMonitor monitor
) {
211 monitor
.beginTask("Calculating referencing objects", 100);
212 actualUuid
= entityUUID
;
215 referencingObjects
= new ArrayList
<>();
216 if(monitor
.isCanceled()) {
218 return Status
.CANCEL_STATUS
;
220 if (actualMonitor
!= null){
221 actualMonitor
.setCanceled(true);
224 actualMonitor
= monitor
;
225 if (entityUUID
!= null){
226 referencingObjectsSet
= getReferencingObjects(entityUUID
, objectClass
);
228 if(monitor
.isCanceled()) {
231 return Status
.CANCEL_STATUS
;
234 referencingObjects
= sortReferencing();
235 if (referencingObjects
== null){
236 if (monitor
.isCanceled()){
239 return Status
.CANCEL_STATUS
;
243 if(monitor
.isCanceled()) {
244 return Status
.CANCEL_STATUS
;
251 actualMonitor
= null;
253 return Status
.OK_STATUS
;
258 currentJob
.setUser(true);
260 currentJob
.schedule();
263 private Set
<CdmBase
> getReferencingObjects(UUID entity
, Class objectClass
) {
264 CdmBase referencedObject
= null;
266 if (objectClass
.getSuperclass().equals(TeamOrPersonBase
.class) ){
267 referencedObject
= CdmStore
.getService(IAgentService
.class).load(entity
);
268 } else if (objectClass
.getSuperclass().equals(TaxonName
.class)){
269 referencedObject
= CdmStore
.getService(INameService
.class).load(entity
);
270 } else if (objectClass
.getSuperclass().equals(TaxonBase
.class)){
271 referencedObject
= CdmStore
.getService(ITaxonService
.class).load(entity
);
272 } else if (objectClass
.equals(Reference
.class)){
273 referencedObject
= CdmStore
.getService(IReferenceService
.class).load(entity
);
274 } else if (objectClass
.getSuperclass().equals(SpecimenOrObservationBase
.class)){
275 referencedObject
= CdmStore
.getService(IOccurrenceService
.class).load(entity
);
276 } else if (objectClass
.isAssignableFrom(User
.class)){
277 referencedObject
= CdmStore
.getService(IUserService
.class).load(entity
);
278 } else if (objectClass
.isAssignableFrom(Group
.class)){
279 referencedObject
= CdmStore
.getService(IGroupService
.class).load(entity
);
280 } else if (objectClass
.isAssignableFrom(Media
.class)){
281 referencedObject
= CdmStore
.getService(IMediaService
.class).load(entity
);
282 } else if (DescriptionBase
.class.isAssignableFrom(objectClass
)){
283 referencedObject
= CdmStore
.getService(IDescriptionService
.class).load(entity
);
284 } else if (DescriptionElementBase
.class.isAssignableFrom(objectClass
)){
285 referencedObject
= CdmStore
.getService(IDescriptionService
.class).loadDescriptionElement(entity
, null);
286 } else if (objectClass
.equals(Sequence
.class)){
287 referencedObject
= CdmStore
.getService(ISequenceService
.class).load(entity
, null);
288 } else if (PolytomousKey
.class.isAssignableFrom(objectClass
)){
289 referencedObject
= CdmStore
.getService(IPolytomousKeyService
.class).load(entity
, null);
290 } else if (PolytomousKeyNode
.class.isAssignableFrom(objectClass
)){
291 referencedObject
= CdmStore
.getService(IPolytomousKeyNodeService
.class).load(entity
, null);
292 } else if (DefinedTermBase
.class.isAssignableFrom(objectClass
)){
293 referencedObject
= CdmStore
.getService(ITermService
.class).load(entity
, null);
294 } else if (EventBase
.class.isAssignableFrom(objectClass
)){
295 referencedObject
= CdmStore
.getService(IEventBaseService
.class).load(entity
, null);
296 } else if (User
.class.isAssignableFrom(objectClass
)){
297 referencedObject
= CdmStore
.getService(IUserService
.class).load(entity
, null);
298 } else if (Group
.class.isAssignableFrom(objectClass
)){
299 referencedObject
= CdmStore
.getService(IGroupService
.class).load(entity
, null);
301 else if(CdmBase
.class.isAssignableFrom(objectClass
)){
302 referencedObject
= CdmStore
.getCommonService().find(objectClass
, entity
);
304 //referencedObject =(CdmBase) CdmStore.getService(IIdentifiableEntityService.class).load(referencedObject.getUuid());
305 Set
<CdmBase
> setOfReferencingObjects
= null;
307 if (referencedObject
!= null){
308 if(referencedObject
.isInstanceOf(IdentifiableEntity
.class)){
309 referencedObjectTitleCache
= (HibernateProxyHelper
.deproxy(referencedObject
, IdentifiableEntity
.class)).getTitleCache();
311 else if(referencedObject
.isInstanceOf(DescriptionElementBase
.class)){
312 referencedObjectTitleCache
= DescriptionHelper
.getLabel(referencedObject
);
314 else if (referencedObject
.isInstanceOf(User
.class)){
315 referencedObjectTitleCache
= ((User
)referencedObject
).getUsername();
317 referencedObjectTitleCache
= null;
319 setOfReferencingObjects
= CdmStore
.getCommonService().getReferencingObjects(referencedObject
);
320 return setOfReferencingObjects
;
323 } catch (Exception e
) {
324 logger
.debug("Error retrieving referencing objects", e
);
326 updateDescription("The referencing objects view could not be loaded completely. Some Problems occurred.");
331 private List
<CdmBase
> sortReferencing(){
333 if (referencingObjectsSet
!= null){
334 List
<CdmBase
> referencingObjects
= new ArrayList
<CdmBase
>(referencingObjectsSet
);
336 Collections
.sort(referencingObjects
, new ReferencingClassComparator());
337 }catch (RemoteAccessException e
){
338 logger
.debug(e
.getStackTrace());
341 return referencingObjects
;
348 class ReferencingClassComparator
implements Comparator
<CdmBase
> {
351 public int compare(CdmBase o1
, CdmBase o2
) {
352 String string1
= o1
.getClass().getSimpleName();
353 String string2
= o2
.getClass().getSimpleName();
354 int result
= string1
.compareToIgnoreCase(string2
);
356 string1
= DescriptionHelper
.getObjectDescription(o1
);
357 string2
= DescriptionHelper
.getObjectDescription(o2
);
359 result
= string1
.compareToIgnoreCase(string2
);
361 return o1
.getUuid().compareTo(o2
.getUuid());
368 private void updateView() {
369 Display
.getDefault().asyncExec(new Runnable() {
373 if (viewer
!= null && !viewer
.getControl().isDisposed()){
375 viewer
.setInput(referencingObjects
);
379 //enable/disable table
380 viewer
.getControl().setEnabled(referencingObjects
!=null);
383 logger
.debug(e
.getStackTrace());
384 updateDescription("The referencing objects view could not be loaded completely. Some Problems occurred.");
392 private void updateDescription(final String description
){
393 Display
.getDefault().asyncExec(new Runnable() {
396 if(contentDescription
!=null && !contentDescription
.isDisposed()) {
397 contentDescription
.setText(description
.replace("&", "&&"));
405 public void selectionChanged_internal(Object selection
, MPart activePart
, MPart thisPart
) {
406 if(activePart
==thisPart
){
410 IStructuredSelection structuredSelection
= createSelection(selection
);
411 if(structuredSelection
!=null){
412 //referencedObjectTitleCache = null;
413 showViewer(structuredSelection
, activePart
, viewer
);
419 public void showViewer(IStructuredSelection selection
, MPart activePart
, Viewer viewer
){
422 Object firstElement
= selection
.getFirstElement();
423 if (firstElement
instanceof TermDto
){
424 TermDto termDto
= (TermDto
) firstElement
;
425 updateDescription("'"+termDto
.getRepresentation_L10n() + "' is referenced by:");
426 updateReferencingObjects(termDto
.getUuid(), TermBase
.class );
429 if(firstElement
instanceof TreeNode
){
430 firstElement
= ((TreeNode
) firstElement
).getValue();
432 if (firstElement
instanceof TaxonNode
&& !((TaxonNode
)firstElement
).hasTaxon()){
433 firstElement
= ((TaxonNode
)firstElement
).getClassification();
435 if(firstElement
instanceof CdmBase
){
436 CdmBase referencedCdmObject
= (CdmBase
) firstElement
;
437 if (referencedCdmObject
.getUuid() == actualUuid
){
440 if (referencedCdmObject
!= null){
441 if(referencedCdmObject
.isInstanceOf(IdentifiableEntity
.class)){
442 referencedObjectTitleCache
= (HibernateProxyHelper
.deproxy(referencedCdmObject
, IdentifiableEntity
.class)).getTitleCache();
444 else if(referencedCdmObject
.isInstanceOf(DescriptionElementBase
.class)){
445 referencedObjectTitleCache
= DescriptionHelper
.getLabel(referencedCdmObject
);
447 else if (referencedCdmObject
.isInstanceOf(User
.class)){
448 referencedObjectTitleCache
= ((User
)referencedCdmObject
).getUsername();
449 }else if (referencedCdmObject
.isInstanceOf(TaxonNode
.class)){
450 referencedObjectTitleCache
= "TaxonNode of "+(HibernateProxyHelper
.deproxy(referencedCdmObject
, TaxonNode
.class)).getTaxon().getTitleCache();
453 if (referencedObjectTitleCache
!= null){
454 updateDescription(referencedCdmObject
.getUserFriendlyTypeName() + " '" + referencedObjectTitleCache
+ "' is referenced by:");
456 updateDescription("");
459 updateReferencingObjects(referencedCdmObject
.getUuid(),firstElement
.getClass() );
462 else if (firstElement
!= null){
464 updateDescription("");
470 public void dispose() {
471 if(conversation
!=null){
472 conversation
.close();
479 public void changed(Object object
) {
480 // no editing in this view
485 public boolean onComplete() {
490 protected String
getViewName() {
491 return "Referencing Objects";