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
;
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 org
.apache
.log4j
.Logger
;
20 import org
.eclipse
.core
.runtime
.IProgressMonitor
;
21 import org
.eclipse
.core
.runtime
.IStatus
;
22 import org
.eclipse
.core
.runtime
.Status
;
23 import org
.eclipse
.core
.runtime
.jobs
.Job
;
24 import org
.eclipse
.jface
.action
.MenuManager
;
25 import org
.eclipse
.jface
.viewers
.CellEditor
;
26 import org
.eclipse
.jface
.viewers
.ICellModifier
;
27 import org
.eclipse
.jface
.viewers
.ISelection
;
28 import org
.eclipse
.jface
.viewers
.IStructuredSelection
;
29 import org
.eclipse
.jface
.viewers
.ITableLabelProvider
;
30 import org
.eclipse
.jface
.viewers
.TableViewer
;
31 import org
.eclipse
.jface
.viewers
.TableViewerColumn
;
32 import org
.eclipse
.jface
.viewers
.TextCellEditor
;
33 import org
.eclipse
.jface
.viewers
.TreeNode
;
34 import org
.eclipse
.jface
.viewers
.Viewer
;
35 import org
.eclipse
.swt
.SWT
;
36 import org
.eclipse
.swt
.widgets
.Composite
;
37 import org
.eclipse
.swt
.widgets
.Control
;
38 import org
.eclipse
.swt
.widgets
.Display
;
39 import org
.eclipse
.swt
.widgets
.Menu
;
40 import org
.eclipse
.swt
.widgets
.Table
;
41 import org
.eclipse
.ui
.IWorkbenchPart
;
42 import org
.springframework
.remoting
.RemoteAccessException
;
44 import eu
.etaxonomy
.cdm
.api
.conversation
.ConversationHolder
;
45 import eu
.etaxonomy
.cdm
.api
.service
.IAgentService
;
46 import eu
.etaxonomy
.cdm
.api
.service
.IDescriptionService
;
47 import eu
.etaxonomy
.cdm
.api
.service
.IEventBaseService
;
48 import eu
.etaxonomy
.cdm
.api
.service
.IGroupService
;
49 import eu
.etaxonomy
.cdm
.api
.service
.IMediaService
;
50 import eu
.etaxonomy
.cdm
.api
.service
.INameService
;
51 import eu
.etaxonomy
.cdm
.api
.service
.IOccurrenceService
;
52 import eu
.etaxonomy
.cdm
.api
.service
.IPolytomousKeyNodeService
;
53 import eu
.etaxonomy
.cdm
.api
.service
.IPolytomousKeyService
;
54 import eu
.etaxonomy
.cdm
.api
.service
.IReferenceService
;
55 import eu
.etaxonomy
.cdm
.api
.service
.ITaxonService
;
56 import eu
.etaxonomy
.cdm
.api
.service
.ITermService
;
57 import eu
.etaxonomy
.cdm
.api
.service
.IUserService
;
58 import eu
.etaxonomy
.cdm
.api
.service
.molecular
.ISequenceService
;
59 import eu
.etaxonomy
.cdm
.hibernate
.HibernateProxyHelper
;
60 import eu
.etaxonomy
.cdm
.model
.agent
.TeamOrPersonBase
;
61 import eu
.etaxonomy
.cdm
.model
.common
.CdmBase
;
62 import eu
.etaxonomy
.cdm
.model
.common
.DefinedTermBase
;
63 import eu
.etaxonomy
.cdm
.model
.common
.EventBase
;
64 import eu
.etaxonomy
.cdm
.model
.common
.Group
;
65 import eu
.etaxonomy
.cdm
.model
.common
.IdentifiableEntity
;
66 import eu
.etaxonomy
.cdm
.model
.common
.User
;
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
.NonViralName
;
74 import eu
.etaxonomy
.cdm
.model
.occurrence
.SpecimenOrObservationBase
;
75 import eu
.etaxonomy
.cdm
.model
.reference
.Reference
;
76 import eu
.etaxonomy
.cdm
.model
.taxon
.TaxonBase
;
77 import eu
.etaxonomy
.cdm
.model
.taxon
.TaxonNode
;
78 import eu
.etaxonomy
.taxeditor
.model
.DescriptionHelper
;
79 import eu
.etaxonomy
.taxeditor
.session
.ICdmEntitySession
;
80 import eu
.etaxonomy
.taxeditor
.store
.CdmStore
;
81 import eu
.etaxonomy
.taxeditor
.view
.AbstractCdmViewPart
;
88 public class ReferencingObjectsView
extends AbstractCdmViewPart
{
89 private static final Logger logger
= Logger
90 .getLogger(ReferencingObjectsView
.class);
92 public static final String ID
= "eu.etaxonomy.taxeditor.bulkeditor.view.referencingobjects";
94 private TableViewer viewer
;
96 private String referencedObjectTitleCache
;
97 private ConversationHolder conversation
;
98 private final ICdmEntitySession cdmEntitySession
;
99 private UUID actualUuid
;
100 List
<CdmBase
> referencingObjects
= null;
101 Set
<CdmBase
> referencingObjectsSet
= null;
102 IProgressMonitor actualMonitor
= null;
103 private Job currentJob
= null;
105 public ReferencingObjectsView() {
106 cdmEntitySession
= CdmStore
.getCurrentSessionManager().bindNullSession();
111 public void createViewer(Composite parent
) {
112 selectionService
.addSelectionListener(this);
113 conversation
= CdmStore
.createConversation();
114 viewer
= new TableViewer(parent
, SWT
.MULTI
| SWT
.H_SCROLL
115 | SWT
.V_SCROLL
| SWT
.FULL_SELECTION
);
116 createColumns(viewer
);
117 viewer
.setContentProvider(new ReferencingObjectsContentProvider());
118 viewer
.setLabelProvider(new ReferencingObjectsLabelProvider());
119 viewer
.setCellModifier(new ICellModifier() {
121 public void modify(Object element
, String property
, Object value
) {
125 public Object
getValue(Object element
, String property
) {
126 ITableLabelProvider tableLabelProvider
= null;
127 if(viewer
.getLabelProvider() instanceof ITableLabelProvider
){
128 tableLabelProvider
= (ITableLabelProvider
) viewer
.getLabelProvider();
130 Object
[] columnProperties
= viewer
.getColumnProperties();
131 for (int i
=0;i
<columnProperties
.length
;i
++) {
132 if(columnProperties
[i
].equals(property
) && tableLabelProvider
!=null){
133 return tableLabelProvider
.getColumnText(element
, i
);
140 public boolean canModify(Object element
, String property
) {
145 //create context menu
146 MenuManager menuManager
= new MenuManager();
147 getSite().registerContextMenu(menuManager
, viewer
);
148 Control control
= viewer
.getControl();
149 Menu menu
= menuManager
.createContextMenu(control
);
150 control
.setMenu(menu
);
152 // Propagate selection from viewer
153 getSite().setSelectionProvider(viewer
);
157 * Create the columns for the table
160 private void createColumns(TableViewer viewer
) {
161 Table table
= viewer
.getTable();
162 String
[] titles
= {"Class", "Description", "UUID", "Object ID" };
163 int[] bounds
= { 100, 200, 100, 70};
165 CellEditor
[] editors
= new CellEditor
[titles
.length
];
167 for (int i
= 0; i
< titles
.length
; i
++) {
168 TableViewerColumn column
= new TableViewerColumn(viewer
, SWT
.NONE
);
169 editors
[i
] = new TextCellEditor(table
);
170 column
.getColumn().setText(titles
[i
]);
171 column
.getColumn().setWidth(bounds
[i
]);
172 column
.getColumn().setResizable(true);
173 column
.getColumn().setMoveable(true);
175 table
.setHeaderVisible(true);
176 table
.setLinesVisible(true);
178 viewer
.setCellEditors(editors
);
179 viewer
.setColumnProperties(titles
);
183 public void setFocus() {
184 cdmEntitySession
.bind();
187 public void updateReferencingObjects(final UUID entityUUID
, final Class objectClass
) {
188 if (actualUuid
== entityUUID
){
192 if(actualMonitor
!=null && !actualMonitor
.isCanceled()){
193 // boolean success = false;
194 // //wait for cancel to be done
196 // success = currentJob.cancel();
198 // currentJob = null;
199 while(!actualMonitor
.isCanceled()){
200 actualMonitor
.setCanceled(true);
204 currentJob
= new Job("Update Referencing Objects " + entityUUID
) {
207 protected IStatus
run(IProgressMonitor monitor
) {
208 monitor
.beginTask("Calculating referencing objects", 100);
209 actualUuid
= entityUUID
;
212 referencingObjects
= new ArrayList
<>();
213 if(monitor
.isCanceled()) {
215 return Status
.CANCEL_STATUS
;
217 if (actualMonitor
!= null){
218 actualMonitor
.setCanceled(true);
221 actualMonitor
= monitor
;
222 if (entityUUID
!= null){
223 ICdmEntitySession previousCdmEntitySession
= CdmStore
.getCurrentSessionManager().getActiveSession();
224 cdmEntitySession
.bind();
225 referencingObjectsSet
= getReferencingObjects(entityUUID
, objectClass
);
227 if(monitor
.isCanceled()) {
230 return Status
.CANCEL_STATUS
;
233 referencingObjects
= sortReferencing();
234 if (referencingObjects
== null){
235 if (monitor
.isCanceled()){
238 return Status
.CANCEL_STATUS
;
242 if(monitor
.isCanceled()) {
243 if(previousCdmEntitySession
!= null) {
244 previousCdmEntitySession
.bind();
247 return Status
.CANCEL_STATUS
;
252 if(previousCdmEntitySession
!= null) {
253 previousCdmEntitySession
.bind();
255 // actualUuid = entityUUID;
260 return Status
.OK_STATUS
;
265 currentJob
.setUser(true);
267 currentJob
.schedule();
268 // final IJobChangeListener listener;
269 // listener = new JobChangeAdapter() {
271 // public void done(IJobChangeEvent event) {
272 // System.err.println("Job is done" + entityUUID);
273 // //event.getJob().cancel();
277 // currentJob.addJobChangeListener(listener);
284 private Set
<CdmBase
> getReferencingObjects(UUID entity
, Class objectClass
) {
285 CdmBase referencedObject
= null;
287 if (objectClass
.getSuperclass().equals(TeamOrPersonBase
.class) ){
288 referencedObject
= CdmStore
.getService(IAgentService
.class).load(entity
);
289 } else if (objectClass
.getSuperclass().equals(NonViralName
.class)){
290 referencedObject
= CdmStore
.getService(INameService
.class).load(entity
);
291 } else if (objectClass
.getSuperclass().equals(TaxonBase
.class)){
292 referencedObject
= CdmStore
.getService(ITaxonService
.class).load(entity
);
293 } else if (objectClass
.equals(Reference
.class)){
294 referencedObject
= CdmStore
.getService(IReferenceService
.class).load(entity
);
295 } else if (objectClass
.getSuperclass().equals(SpecimenOrObservationBase
.class)){
296 referencedObject
= CdmStore
.getService(IOccurrenceService
.class).load(entity
);
297 } else if (objectClass
.isAssignableFrom(User
.class)){
298 referencedObject
= CdmStore
.getService(IUserService
.class).load(entity
);
299 } else if (objectClass
.isAssignableFrom(Group
.class)){
300 referencedObject
= CdmStore
.getService(IGroupService
.class).load(entity
);
301 } else if (objectClass
.isAssignableFrom(Media
.class)){
302 referencedObject
= CdmStore
.getService(IMediaService
.class).load(entity
);
303 } else if (DescriptionBase
.class.isAssignableFrom(objectClass
)){
304 referencedObject
= CdmStore
.getService(IDescriptionService
.class).load(entity
);
305 } else if (DescriptionElementBase
.class.isAssignableFrom(objectClass
)){
306 referencedObject
= CdmStore
.getService(IDescriptionService
.class).loadDescriptionElement(entity
, null);
307 } else if (objectClass
.equals(Sequence
.class)){
308 referencedObject
= CdmStore
.getService(ISequenceService
.class).load(entity
, null);
309 } else if (PolytomousKey
.class.isAssignableFrom(objectClass
)){
310 referencedObject
= CdmStore
.getService(IPolytomousKeyService
.class).load(entity
, null);
311 } else if (PolytomousKeyNode
.class.isAssignableFrom(objectClass
)){
312 referencedObject
= CdmStore
.getService(IPolytomousKeyNodeService
.class).load(entity
, null);
313 } else if (DefinedTermBase
.class.isAssignableFrom(objectClass
)){
314 referencedObject
= CdmStore
.getService(ITermService
.class).load(entity
, null);
315 } else if (EventBase
.class.isAssignableFrom(objectClass
)){
316 referencedObject
= CdmStore
.getService(IEventBaseService
.class).load(entity
, null);
317 } else if (User
.class.isAssignableFrom(objectClass
)){
318 referencedObject
= CdmStore
.getService(IUserService
.class).load(entity
, null);
319 } else if (Group
.class.isAssignableFrom(objectClass
)){
320 referencedObject
= CdmStore
.getService(IGroupService
.class).load(entity
, null);
322 else if(CdmBase
.class.isAssignableFrom(objectClass
)){
323 referencedObject
= CdmStore
.getCommonService().find(objectClass
, entity
);
325 //referencedObject =(CdmBase) CdmStore.getService(IIdentifiableEntityService.class).load(referencedObject.getUuid());
326 Set
<CdmBase
> setOfReferencingObjects
= null;
328 if (referencedObject
!= null){
329 if(referencedObject
.isInstanceOf(IdentifiableEntity
.class)){
330 referencedObjectTitleCache
= (HibernateProxyHelper
.deproxy(referencedObject
, IdentifiableEntity
.class)).getTitleCache();
332 else if(referencedObject
.isInstanceOf(DescriptionElementBase
.class)){
333 referencedObjectTitleCache
= DescriptionHelper
.getLabel(referencedObject
);
335 else if (referencedObject
.isInstanceOf(User
.class)){
336 referencedObjectTitleCache
= ((User
)referencedObject
).getUsername();
338 referencedObjectTitleCache
= null;
340 setOfReferencingObjects
= CdmStore
.getCommonService().getReferencingObjects(referencedObject
);
341 return setOfReferencingObjects
;
344 } catch (Exception e
) {
345 logger
.debug("Error retrieving referencing objects", e
);
347 updateDescription("The referencing objects view could not be loaded completely. Some Problems occured.");
351 private List
<CdmBase
> sortReferencing(){
353 if (referencingObjectsSet
!= null){
354 List
<CdmBase
> referencingObjects
= new ArrayList
<CdmBase
>(referencingObjectsSet
);
356 Collections
.sort(referencingObjects
, new ReferencingClassComparator());
357 }catch (RemoteAccessException e
){
358 logger
.debug(e
.getStackTrace());
361 return referencingObjects
;
369 class ReferencingClassComparator
implements Comparator
<CdmBase
> {
372 public int compare(CdmBase o1
, CdmBase o2
) {
373 String string1
= o1
.getClass().getSimpleName();
374 String string2
= o2
.getClass().getSimpleName();
375 int result
= string1
.compareToIgnoreCase(string2
);
377 string1
= DescriptionHelper
.getObjectDescription(o1
);
378 string2
= DescriptionHelper
.getObjectDescription(o2
);
380 result
= string1
.compareToIgnoreCase(string2
);
382 return o1
.getUuid().compareTo(o2
.getUuid());
389 private void updateView() {
390 Display
.getDefault().asyncExec(new Runnable() {
393 if (viewer
!= null && !viewer
.getControl().isDisposed()){
395 viewer
.setInput(referencingObjects
);
399 //enable/disable table
400 viewer
.getControl().setEnabled(referencingObjects
!=null);
404 logger
.debug(e
.getStackTrace());
405 updateDescription("The referencing objects view could not be loaded completely. Some Problems occured.");
414 private void updateDescription(final String description
){
415 Display
.getDefault().asyncExec(new Runnable() {
418 if (referencedObjectTitleCache
!= null){
419 setContentDescription(description
);
421 setContentDescription(description
);
430 public void selectionChanged(IWorkbenchPart part
, ISelection selection
) {
435 if(selection
instanceof IStructuredSelection
){
436 //referencedObjectTitleCache = null;
437 showViewer(part
, (IStructuredSelection
) selection
);
443 public void showViewer(IWorkbenchPart part
, IStructuredSelection selection
) {
446 Object firstElement
= selection
.getFirstElement();
447 if(firstElement
instanceof TreeNode
){
448 firstElement
= ((TreeNode
) firstElement
).getValue();
450 if(firstElement
instanceof CdmBase
){
451 CdmBase referencedCdmObject
= (CdmBase
) firstElement
;
452 if (referencedCdmObject
.getUuid() == actualUuid
){
455 if (referencedCdmObject
!= null){
456 if(referencedCdmObject
.isInstanceOf(IdentifiableEntity
.class)){
457 referencedObjectTitleCache
= (HibernateProxyHelper
.deproxy(referencedCdmObject
, IdentifiableEntity
.class)).getTitleCache();
459 else if(referencedCdmObject
.isInstanceOf(DescriptionElementBase
.class)){
460 referencedObjectTitleCache
= DescriptionHelper
.getLabel(referencedCdmObject
);
462 else if (referencedCdmObject
.isInstanceOf(User
.class)){
463 referencedObjectTitleCache
= ((User
)referencedCdmObject
).getUsername();
464 }else if (referencedCdmObject
.isInstanceOf(TaxonNode
.class)){
465 referencedObjectTitleCache
= "TaxonNode of "+(HibernateProxyHelper
.deproxy(referencedCdmObject
, TaxonNode
.class)).getTaxon().getTitleCache();
468 if (referencedObjectTitleCache
!= null){
469 updateDescription("'" + referencedObjectTitleCache
+ "' is referenced by:");
471 updateDescription("");
474 updateReferencingObjects(referencedCdmObject
.getUuid(),firstElement
.getClass() );
477 else if (firstElement
!= null){
479 updateDescription("");
485 public void dispose() {
486 conversation
.close();
487 selectionService
.removePostSelectionListener(this);
488 selectionService
.removeSelectionListener(this);
489 cdmEntitySession
.dispose();
496 public Viewer
getViewer() {
502 public void changed(Object object
) {
503 // no editing in this view
508 public boolean onComplete() {
512 public void refresh(){
513 selectionService
.removePostSelectionListener(this);
514 selectionService
.removeSelectionListener(this);
515 selectionService
.addPostSelectionListener(this);
516 selectionService
.addSelectionListener(this);
521 protected String
getViewName() {
522 return "Referencing Objects";