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
.Group
;
67 import eu
.etaxonomy
.cdm
.model
.common
.IdentifiableEntity
;
68 import eu
.etaxonomy
.cdm
.model
.common
.User
;
69 import eu
.etaxonomy
.cdm
.model
.description
.DescriptionBase
;
70 import eu
.etaxonomy
.cdm
.model
.description
.DescriptionElementBase
;
71 import eu
.etaxonomy
.cdm
.model
.description
.PolytomousKey
;
72 import eu
.etaxonomy
.cdm
.model
.description
.PolytomousKeyNode
;
73 import eu
.etaxonomy
.cdm
.model
.media
.Media
;
74 import eu
.etaxonomy
.cdm
.model
.molecular
.Sequence
;
75 import eu
.etaxonomy
.cdm
.model
.name
.TaxonName
;
76 import eu
.etaxonomy
.cdm
.model
.occurrence
.SpecimenOrObservationBase
;
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
.model
.AbstractUtility
;
86 import eu
.etaxonomy
.taxeditor
.model
.DescriptionHelper
;
87 import eu
.etaxonomy
.taxeditor
.store
.CdmStore
;
88 import eu
.etaxonomy
.taxeditor
.view
.e4
.AbstractCdmEditorPartE4
;
96 public class ReferencingObjectsViewE4
extends AbstractCdmEditorPartE4
{
98 private static final Logger logger
= Logger
99 .getLogger(ReferencingObjectsViewE4
.class);
101 private Label contentDescription
;
103 private String referencedObjectTitleCache
;
104 private ConversationHolder conversation
;
105 private UUID actualUuid
;
106 List
<CdmBase
> referencingObjects
= null;
107 Set
<CdmBase
> referencingObjectsSet
= null;
108 IProgressMonitor actualMonitor
= null;
109 private Job currentJob
= null;
112 public void create(Composite parent
, EMenuService menuService
) {
113 if (CdmStore
.isActive()){
114 if(conversation
== null){
115 conversation
= CdmStore
.createConversation();
121 parent
.setLayout(new GridLayout());
122 contentDescription
= new Label(parent
, SWT
.NONE
);
123 contentDescription
.setLayoutData(new GridData(SWT
.FILL
, SWT
.TOP
, true, false));
124 TableViewer tableViewer
= new TableViewer(parent
, SWT
.MULTI
| SWT
.H_SCROLL
125 | SWT
.V_SCROLL
| SWT
.FULL_SELECTION
);
126 createColumns(tableViewer
);
127 tableViewer
.setContentProvider(new ReferencingObjectsContentProvider());
128 tableViewer
.setLabelProvider(new ReferencingObjectsLabelProvider());
129 tableViewer
.getControl().setLayoutData(new GridData(SWT
.FILL
, SWT
.FILL
, true, true));
131 tableViewer
.setCellModifier(new ICellModifier() {
133 public void modify(Object element
, String property
, Object value
) {
137 public Object
getValue(Object element
, String property
) {
138 ITableLabelProvider tableLabelProvider
= null;
139 if(tableViewer
.getLabelProvider() instanceof ITableLabelProvider
){
140 tableLabelProvider
= (ITableLabelProvider
) tableViewer
.getLabelProvider();
142 Object
[] columnProperties
= tableViewer
.getColumnProperties();
143 for (int i
=0;i
<columnProperties
.length
;i
++) {
144 if(columnProperties
[i
].equals(property
) && tableLabelProvider
!=null){
145 return tableLabelProvider
.getColumnText(element
, i
);
152 public boolean canModify(Object element
, String property
) {
157 viewer
= tableViewer
;
159 // Propagate selection from viewer
160 selectionChangedListener
= (event
-> selService
.setSelection(AbstractUtility
.getElementsFromSelectionChangedEvent(event
)));
161 viewer
.addSelectionChangedListener(selectionChangedListener
);
163 //create context menu
164 menuService
.registerContextMenu(viewer
.getControl(), "eu.etaxonomy.taxeditor.bulkeditor.popupmenu.referencingobjectsview");
169 * Create the columns for the table
172 private void createColumns(TableViewer viewer
) {
173 Table table
= viewer
.getTable();
174 String
[] titles
= {"Class", "Description", "UUID", "Object ID" };
175 int[] bounds
= { 100, 200, 100, 70};
177 CellEditor
[] editors
= new CellEditor
[titles
.length
];
179 for (int i
= 0; i
< titles
.length
; i
++) {
180 TableViewerColumn column
= new TableViewerColumn(viewer
, SWT
.NONE
);
181 editors
[i
] = new TextCellEditor(table
);
182 column
.getColumn().setText(titles
[i
]);
183 column
.getColumn().setWidth(bounds
[i
]);
184 column
.getColumn().setResizable(true);
185 column
.getColumn().setMoveable(true);
187 table
.setHeaderVisible(true);
188 table
.setLinesVisible(true);
190 viewer
.setCellEditors(editors
);
191 viewer
.setColumnProperties(titles
);
194 public void updateReferencingObjects(final UUID entityUUID
, final Class objectClass
) {
195 if (actualUuid
== entityUUID
){
199 if(actualMonitor
!=null && !actualMonitor
.isCanceled()){
200 while(!actualMonitor
.isCanceled()){
201 actualMonitor
.setCanceled(true);
205 currentJob
= new Job("Update Referencing Objects") {
208 protected IStatus
run(final IProgressMonitor monitor
) {
209 monitor
.beginTask("Calculating referencing objects", 100);
210 actualUuid
= entityUUID
;
213 referencingObjects
= new ArrayList
<>();
214 if(monitor
.isCanceled()) {
216 return Status
.CANCEL_STATUS
;
218 if (actualMonitor
!= null){
219 actualMonitor
.setCanceled(true);
222 actualMonitor
= monitor
;
223 if (entityUUID
!= null){
224 referencingObjectsSet
= getReferencingObjects(entityUUID
, objectClass
);
226 if(monitor
.isCanceled()) {
229 return Status
.CANCEL_STATUS
;
232 referencingObjects
= sortReferencing();
233 if (referencingObjects
== null){
234 if (monitor
.isCanceled()){
237 return Status
.CANCEL_STATUS
;
241 if(monitor
.isCanceled()) {
242 return Status
.CANCEL_STATUS
;
249 actualMonitor
= null;
251 return Status
.OK_STATUS
;
256 currentJob
.setUser(true);
258 currentJob
.schedule();
261 private Set
<CdmBase
> getReferencingObjects(UUID entity
, Class objectClass
) {
262 CdmBase referencedObject
= null;
264 if (objectClass
.getSuperclass().equals(TeamOrPersonBase
.class) ){
265 referencedObject
= CdmStore
.getService(IAgentService
.class).load(entity
);
266 } else if (objectClass
.getSuperclass().equals(TaxonName
.class)){
267 referencedObject
= CdmStore
.getService(INameService
.class).load(entity
);
268 } else if (objectClass
.getSuperclass().equals(TaxonBase
.class)){
269 referencedObject
= CdmStore
.getService(ITaxonService
.class).load(entity
);
270 } else if (objectClass
.equals(Reference
.class)){
271 referencedObject
= CdmStore
.getService(IReferenceService
.class).load(entity
);
272 } else if (objectClass
.getSuperclass().equals(SpecimenOrObservationBase
.class)){
273 referencedObject
= CdmStore
.getService(IOccurrenceService
.class).load(entity
);
274 } else if (objectClass
.isAssignableFrom(User
.class)){
275 referencedObject
= CdmStore
.getService(IUserService
.class).load(entity
);
276 } else if (objectClass
.isAssignableFrom(Group
.class)){
277 referencedObject
= CdmStore
.getService(IGroupService
.class).load(entity
);
278 } else if (objectClass
.isAssignableFrom(Media
.class)){
279 referencedObject
= CdmStore
.getService(IMediaService
.class).load(entity
);
280 } else if (DescriptionBase
.class.isAssignableFrom(objectClass
)){
281 referencedObject
= CdmStore
.getService(IDescriptionService
.class).load(entity
);
282 } else if (DescriptionElementBase
.class.isAssignableFrom(objectClass
)){
283 referencedObject
= CdmStore
.getService(IDescriptionService
.class).loadDescriptionElement(entity
, null);
284 } else if (objectClass
.equals(Sequence
.class)){
285 referencedObject
= CdmStore
.getService(ISequenceService
.class).load(entity
, null);
286 } else if (PolytomousKey
.class.isAssignableFrom(objectClass
)){
287 referencedObject
= CdmStore
.getService(IPolytomousKeyService
.class).load(entity
, null);
288 } else if (PolytomousKeyNode
.class.isAssignableFrom(objectClass
)){
289 referencedObject
= CdmStore
.getService(IPolytomousKeyNodeService
.class).load(entity
, null);
290 } else if (DefinedTermBase
.class.isAssignableFrom(objectClass
)){
291 referencedObject
= CdmStore
.getService(ITermService
.class).load(entity
, null);
292 } else if (EventBase
.class.isAssignableFrom(objectClass
)){
293 referencedObject
= CdmStore
.getService(IEventBaseService
.class).load(entity
, null);
294 } else if (User
.class.isAssignableFrom(objectClass
)){
295 referencedObject
= CdmStore
.getService(IUserService
.class).load(entity
, null);
296 } else if (Group
.class.isAssignableFrom(objectClass
)){
297 referencedObject
= CdmStore
.getService(IGroupService
.class).load(entity
, null);
299 else if(CdmBase
.class.isAssignableFrom(objectClass
)){
300 referencedObject
= CdmStore
.getCommonService().find(objectClass
, entity
);
302 //referencedObject =(CdmBase) CdmStore.getService(IIdentifiableEntityService.class).load(referencedObject.getUuid());
303 Set
<CdmBase
> setOfReferencingObjects
= null;
305 if (referencedObject
!= null){
306 if(referencedObject
.isInstanceOf(IdentifiableEntity
.class)){
307 referencedObjectTitleCache
= (HibernateProxyHelper
.deproxy(referencedObject
, IdentifiableEntity
.class)).getTitleCache();
309 else if(referencedObject
.isInstanceOf(DescriptionElementBase
.class)){
310 referencedObjectTitleCache
= DescriptionHelper
.getLabel(referencedObject
);
312 else if (referencedObject
.isInstanceOf(User
.class)){
313 referencedObjectTitleCache
= ((User
)referencedObject
).getUsername();
315 referencedObjectTitleCache
= null;
317 setOfReferencingObjects
= CdmStore
.getCommonService().getReferencingObjects(referencedObject
);
318 return setOfReferencingObjects
;
321 } catch (Exception e
) {
322 logger
.debug("Error retrieving referencing objects", e
);
324 updateDescription("The referencing objects view could not be loaded completely. Some Problems occurred.");
329 private List
<CdmBase
> sortReferencing(){
331 if (referencingObjectsSet
!= null){
332 List
<CdmBase
> referencingObjects
= new ArrayList
<CdmBase
>(referencingObjectsSet
);
334 Collections
.sort(referencingObjects
, new ReferencingClassComparator());
335 }catch (RemoteAccessException e
){
336 logger
.debug(e
.getStackTrace());
339 return referencingObjects
;
346 class ReferencingClassComparator
implements Comparator
<CdmBase
> {
349 public int compare(CdmBase o1
, CdmBase o2
) {
350 String string1
= o1
.getClass().getSimpleName();
351 String string2
= o2
.getClass().getSimpleName();
352 int result
= string1
.compareToIgnoreCase(string2
);
354 string1
= DescriptionHelper
.getObjectDescription(o1
);
355 string2
= DescriptionHelper
.getObjectDescription(o2
);
357 result
= string1
.compareToIgnoreCase(string2
);
359 return o1
.getUuid().compareTo(o2
.getUuid());
366 private void updateView() {
367 Display
.getDefault().asyncExec(new Runnable() {
371 if (viewer
!= null && !viewer
.getControl().isDisposed()){
373 viewer
.setInput(referencingObjects
);
377 //enable/disable table
378 viewer
.getControl().setEnabled(referencingObjects
!=null);
381 logger
.debug(e
.getStackTrace());
382 updateDescription("The referencing objects view could not be loaded completely. Some Problems occurred.");
390 private void updateDescription(final String description
){
391 Display
.getDefault().asyncExec(new Runnable() {
394 if(contentDescription
!=null && !contentDescription
.isDisposed()) {
395 contentDescription
.setText(description
.replace("&", "&&"));
403 public void selectionChanged_internal(Object selection
, MPart activePart
, MPart thisPart
) {
404 if(activePart
==thisPart
){
408 IStructuredSelection structuredSelection
= createSelection(selection
);
409 if(structuredSelection
!=null){
410 //referencedObjectTitleCache = null;
411 showViewer(structuredSelection
, activePart
, viewer
);
417 public void showViewer(IStructuredSelection selection
, MPart activePart
, Viewer viewer
){
420 Object firstElement
= selection
.getFirstElement();
421 if (firstElement
instanceof TermDto
){
422 TermDto termDto
= (TermDto
) firstElement
;
423 updateDescription("'"+termDto
.getRepresentation_L10n() + "' is referenced by:");
424 updateReferencingObjects(termDto
.getUuid(), TermBase
.class );
427 if(firstElement
instanceof TreeNode
){
428 firstElement
= ((TreeNode
) firstElement
).getValue();
430 if (firstElement
instanceof TaxonNode
&& !((TaxonNode
)firstElement
).hasTaxon()){
431 firstElement
= ((TaxonNode
)firstElement
).getClassification();
433 if(firstElement
instanceof CdmBase
){
434 CdmBase referencedCdmObject
= (CdmBase
) firstElement
;
435 if (referencedCdmObject
.getUuid() == actualUuid
){
438 if (referencedCdmObject
!= null){
439 if(referencedCdmObject
.isInstanceOf(IdentifiableEntity
.class)){
440 referencedObjectTitleCache
= (HibernateProxyHelper
.deproxy(referencedCdmObject
, IdentifiableEntity
.class)).getTitleCache();
442 else if(referencedCdmObject
.isInstanceOf(DescriptionElementBase
.class)){
443 referencedObjectTitleCache
= DescriptionHelper
.getLabel(referencedCdmObject
);
445 else if (referencedCdmObject
.isInstanceOf(User
.class)){
446 referencedObjectTitleCache
= ((User
)referencedCdmObject
).getUsername();
447 }else if (referencedCdmObject
.isInstanceOf(TaxonNode
.class)){
448 referencedObjectTitleCache
= "TaxonNode of "+(HibernateProxyHelper
.deproxy(referencedCdmObject
, TaxonNode
.class)).getTaxon().getTitleCache();
451 if (referencedObjectTitleCache
!= null){
452 updateDescription(referencedCdmObject
.getUserFriendlyTypeName() + " '" + referencedObjectTitleCache
+ "' is referenced by:");
454 updateDescription("");
457 updateReferencingObjects(referencedCdmObject
.getUuid(),firstElement
.getClass() );
460 else if (firstElement
!= null){
462 updateDescription("");
468 public void dispose() {
469 if(conversation
!=null){
470 conversation
.close();
477 public void changed(Object object
) {
478 // no editing in this view
483 public boolean onComplete() {
488 protected String
getViewName() {
489 return "Referencing Objects";