adapting to chages in CdmUtils
[taxeditor.git] / eu.etaxonomy.taxeditor.bulkeditor / src / main / java / eu / etaxonomy / taxeditor / bulkeditor / referencingobjects / ReferencingObjectsView.java
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;
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 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;
43
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;
82
83 /**
84 * @author p.ciardelli
85 * @created 08.07.2009
86 * @version 1.0
87 */
88 public class ReferencingObjectsView extends AbstractCdmViewPart {
89 private static final Logger logger = Logger
90 .getLogger(ReferencingObjectsView.class);
91
92 public static final String ID = "eu.etaxonomy.taxeditor.bulkeditor.view.referencingobjects";
93
94 private TableViewer viewer;
95
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;
104
105 public ReferencingObjectsView() {
106 cdmEntitySession = CdmStore.getCurrentSessionManager().bindNullSession();
107 }
108
109 /** {@inheritDoc} */
110 @Override
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() {
120 @Override
121 public void modify(Object element, String property, Object value) {
122 }
123
124 @Override
125 public Object getValue(Object element, String property) {
126 ITableLabelProvider tableLabelProvider = null;
127 if(viewer.getLabelProvider() instanceof ITableLabelProvider){
128 tableLabelProvider = (ITableLabelProvider) viewer.getLabelProvider();
129 }
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);
134 }
135 }
136 return "";
137 }
138
139 @Override
140 public boolean canModify(Object element, String property) {
141 return true;
142 }
143 });
144
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);
151
152 // Propagate selection from viewer
153 getSite().setSelectionProvider(viewer);
154 }
155
156 /**
157 * Create the columns for the table
158 * @param viewer
159 */
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};
164
165 CellEditor[] editors = new CellEditor[titles.length];
166
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);
174 }
175 table.setHeaderVisible(true);
176 table.setLinesVisible(true);
177
178 viewer.setCellEditors(editors);
179 viewer.setColumnProperties(titles);
180 }
181
182 @Override
183 public void setFocus() {
184 cdmEntitySession.bind();
185 }
186
187 public void updateReferencingObjects(final UUID entityUUID, final Class objectClass) {
188 if (actualUuid == entityUUID){
189 return ;
190 }
191 showEmptyPage();
192 if(actualMonitor!=null && !actualMonitor.isCanceled()){
193 // boolean success = false;
194 // //wait for cancel to be done
195 // while(!success){
196 // success = currentJob.cancel();
197 // }
198 // currentJob = null;
199 while(!actualMonitor.isCanceled()){
200 actualMonitor.setCanceled(true);
201 }
202
203 }
204 currentJob = new Job("Update Referencing Objects " + entityUUID) {
205
206 @Override
207 protected IStatus run(IProgressMonitor monitor) {
208 monitor.beginTask("Calculating referencing objects", 100);
209 actualUuid = entityUUID;
210
211 monitor.worked(5);
212 referencingObjects = new ArrayList<>();
213 if(monitor.isCanceled()) {
214 actualUuid = null;
215 return Status.CANCEL_STATUS;
216 }
217 if (actualMonitor != null){
218 actualMonitor.setCanceled(true);
219
220 }
221 actualMonitor = monitor;
222 if (entityUUID != null){
223 ICdmEntitySession previousCdmEntitySession = CdmStore.getCurrentSessionManager().getActiveSession();
224 cdmEntitySession.bind();
225 referencingObjectsSet = getReferencingObjects(entityUUID, objectClass);
226
227 if(monitor.isCanceled()) {
228 actualUuid = null;
229
230 return Status.CANCEL_STATUS;
231 }
232 monitor.worked(30);
233 referencingObjects = sortReferencing();
234 if (referencingObjects == null){
235 if (monitor.isCanceled()){
236 actualUuid = null;
237
238 return Status.CANCEL_STATUS;
239 }
240 }
241
242 if(monitor.isCanceled()) {
243 if(previousCdmEntitySession != null) {
244 previousCdmEntitySession.bind();
245 }
246
247 return Status.CANCEL_STATUS;
248 }
249 monitor.worked(80);
250 updateView();
251
252 if(previousCdmEntitySession != null) {
253 previousCdmEntitySession.bind();
254 }
255 // actualUuid = entityUUID;
256 }
257 monitor.done();
258
259
260 return Status.OK_STATUS;
261
262
263 }
264 };
265 currentJob.setUser(true);
266
267 currentJob.schedule();
268 // final IJobChangeListener listener;
269 // listener = new JobChangeAdapter() {
270 // @Override
271 // public void done(IJobChangeEvent event) {
272 // System.err.println("Job is done" + entityUUID);
273 // //event.getJob().cancel();
274 // }
275 //
276 // };
277 // currentJob.addJobChangeListener(listener);
278
279
280
281
282 }
283
284 private Set<CdmBase> getReferencingObjects(UUID entity, Class objectClass) {
285 CdmBase referencedObject = null;
286 try {
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);
321 }
322 else if(CdmBase.class.isAssignableFrom(objectClass)){
323 referencedObject = CdmStore.getCommonService().find(objectClass, entity);
324 }
325 //referencedObject =(CdmBase) CdmStore.getService(IIdentifiableEntityService.class).load(referencedObject.getUuid());
326 Set<CdmBase> setOfReferencingObjects = null;
327
328 if (referencedObject != null){
329 if(referencedObject.isInstanceOf(IdentifiableEntity.class)){
330 referencedObjectTitleCache = (HibernateProxyHelper.deproxy(referencedObject, IdentifiableEntity.class)).getTitleCache();
331 }
332 else if(referencedObject.isInstanceOf(DescriptionElementBase.class)){
333 referencedObjectTitleCache = DescriptionHelper.getLabel(referencedObject);
334 }
335 else if (referencedObject.isInstanceOf(User.class)){
336 referencedObjectTitleCache = ((User)referencedObject).getUsername();
337 }else{
338 referencedObjectTitleCache = null;
339 }
340 setOfReferencingObjects = CdmStore.getCommonService().getReferencingObjects(referencedObject);
341 return setOfReferencingObjects;
342 }
343
344 } catch (Exception e) {
345 logger.debug("Error retrieving referencing objects", e);
346 e.printStackTrace();
347 updateDescription("The referencing objects view could not be loaded completely. Some Problems occured.");
348 }
349 return null;
350 }
351 private List<CdmBase> sortReferencing(){
352
353 if (referencingObjectsSet != null){
354 List<CdmBase> referencingObjects = new ArrayList<CdmBase>(referencingObjectsSet);
355 try{
356 Collections.sort(referencingObjects, new ReferencingClassComparator());
357 }catch (RemoteAccessException e){
358 logger.debug(e.getStackTrace());
359 return null;
360 }
361 return referencingObjects;
362
363 }
364
365 return null;
366 }
367
368
369 class ReferencingClassComparator implements Comparator<CdmBase> {
370
371 @Override
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);
376 if (result == 0) {
377 string1 = DescriptionHelper.getObjectDescription(o1);
378 string2 = DescriptionHelper.getObjectDescription(o2);
379
380 result = string1.compareToIgnoreCase(string2);
381 if (result == 0){
382 return o1.getUuid().compareTo(o2.getUuid());
383 }
384 }
385 return result;
386 }
387 }
388
389 private void updateView() {
390 Display.getDefault().asyncExec(new Runnable() {
391 @Override
392 public void run() {
393 if (viewer != null && !viewer.getControl().isDisposed()){
394 try{
395 viewer.setInput(referencingObjects);
396
397 showViewer();
398
399 //enable/disable table
400 viewer.getControl().setEnabled(referencingObjects!=null);
401
402 }catch(Exception e){
403 e.printStackTrace();
404 logger.debug(e.getStackTrace());
405 updateDescription("The referencing objects view could not be loaded completely. Some Problems occured.");
406 }
407
408 }
409 }
410 });
411 }
412
413
414 private void updateDescription(final String description){
415 Display.getDefault().asyncExec(new Runnable() {
416 @Override
417 public void run() {
418 if (referencedObjectTitleCache != null){
419 setContentDescription(description);
420 } else {
421 setContentDescription(description);
422 }
423 }
424
425 });
426 }
427
428 /** {@inheritDoc} */
429 @Override
430 public void selectionChanged(IWorkbenchPart part, ISelection selection) {
431 if(part == this){
432 return;
433 }
434
435 if(selection instanceof IStructuredSelection){
436 //referencedObjectTitleCache = null;
437 showViewer(part, (IStructuredSelection) selection);
438 }
439 }
440
441 /** {@inheritDoc} */
442 @Override
443 public void showViewer(IWorkbenchPart part, IStructuredSelection selection) {
444 // this.part = part;
445
446 Object firstElement = selection.getFirstElement();
447 if(firstElement instanceof TreeNode){
448 firstElement = ((TreeNode) firstElement).getValue();
449 }
450 if(firstElement instanceof CdmBase){
451 CdmBase referencedCdmObject = (CdmBase) firstElement;
452 if (referencedCdmObject.getUuid() == actualUuid){
453 return;
454 }
455 if (referencedCdmObject != null){
456 if(referencedCdmObject.isInstanceOf(IdentifiableEntity.class)){
457 referencedObjectTitleCache = (HibernateProxyHelper.deproxy(referencedCdmObject, IdentifiableEntity.class)).getTitleCache();
458 }
459 else if(referencedCdmObject.isInstanceOf(DescriptionElementBase.class)){
460 referencedObjectTitleCache = DescriptionHelper.getLabel(referencedCdmObject);
461 }
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();
466 }
467 }
468 if (referencedObjectTitleCache != null){
469 updateDescription("'" + referencedObjectTitleCache + "' is referenced by:");
470 } else{
471 updateDescription("");
472 }
473
474 updateReferencingObjects(referencedCdmObject.getUuid(),firstElement.getClass() );
475
476 }
477 else if (firstElement != null){
478 updateView();
479 updateDescription("");
480 }
481 }
482
483 /** {@inheritDoc} */
484 @Override
485 public void dispose() {
486 conversation.close();
487 selectionService.removePostSelectionListener(this);
488 selectionService.removeSelectionListener(this);
489 cdmEntitySession.dispose();
490 super.dispose();
491
492 }
493
494 /** {@inheritDoc} */
495 @Override
496 public Viewer getViewer() {
497 return viewer;
498 }
499
500 /** {@inheritDoc} */
501 @Override
502 public void changed(Object object) {
503 // no editing in this view
504 }
505
506 /** {@inheritDoc} */
507 @Override
508 public boolean onComplete() {
509 return false;
510 }
511
512 public void refresh(){
513 selectionService.removePostSelectionListener(this);
514 selectionService.removeSelectionListener(this);
515 selectionService.addPostSelectionListener(this);
516 selectionService.addSelectionListener(this);
517
518 }
519
520 @Override
521 protected String getViewName() {
522 return "Referencing Objects";
523 }
524
525 }