a52d9df220b25d57197accd8d4a07bda506f3cef
[taxeditor.git] / eu.etaxonomy.taxeditor.bulkeditor / src / main / java / eu / etaxonomy / taxeditor / bulkeditor / referencingobjects / ReferencingObjectsView.java
1 // $Id$
2 /**
3 * Copyright (C) 2007 EDIT
4 * European Distributed Institute of Taxonomy
5 * http://www.e-taxonomy.eu
6 *
7 * The contents of this file are subject to the Mozilla Public License Version 1.1
8 * See LICENSE.TXT at the top of this package for the full license terms.
9 */
10
11 package eu.etaxonomy.taxeditor.bulkeditor.referencingobjects;
12
13 import java.util.ArrayList;
14 import java.util.Collections;
15 import java.util.Comparator;
16 import java.util.List;
17 import java.util.Set;
18 import java.util.UUID;
19
20 import org.apache.log4j.Logger;
21 import org.eclipse.core.runtime.IProgressMonitor;
22 import org.eclipse.core.runtime.IStatus;
23 import org.eclipse.core.runtime.Status;
24 import org.eclipse.core.runtime.jobs.Job;
25 import org.eclipse.jface.action.MenuManager;
26 import org.eclipse.jface.viewers.CellEditor;
27 import org.eclipse.jface.viewers.ICellModifier;
28 import org.eclipse.jface.viewers.ISelection;
29 import org.eclipse.jface.viewers.IStructuredSelection;
30 import org.eclipse.jface.viewers.ITableLabelProvider;
31 import org.eclipse.jface.viewers.TableViewer;
32 import org.eclipse.jface.viewers.TableViewerColumn;
33 import org.eclipse.jface.viewers.TextCellEditor;
34 import org.eclipse.jface.viewers.TreeNode;
35 import org.eclipse.jface.viewers.Viewer;
36 import org.eclipse.swt.SWT;
37 import org.eclipse.swt.widgets.Composite;
38 import org.eclipse.swt.widgets.Control;
39 import org.eclipse.swt.widgets.Display;
40 import org.eclipse.swt.widgets.Menu;
41 import org.eclipse.swt.widgets.Table;
42 import org.eclipse.ui.IWorkbenchPart;
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.IGroupService;
48 import eu.etaxonomy.cdm.api.service.IMediaService;
49 import eu.etaxonomy.cdm.api.service.INameService;
50 import eu.etaxonomy.cdm.api.service.IOccurrenceService;
51 import eu.etaxonomy.cdm.api.service.IReferenceService;
52 import eu.etaxonomy.cdm.api.service.ITaxonService;
53 import eu.etaxonomy.cdm.api.service.IUserService;
54 import eu.etaxonomy.cdm.hibernate.HibernateProxyHelper;
55 import eu.etaxonomy.cdm.model.agent.TeamOrPersonBase;
56 import eu.etaxonomy.cdm.model.common.CdmBase;
57 import eu.etaxonomy.cdm.model.common.Group;
58 import eu.etaxonomy.cdm.model.common.IdentifiableEntity;
59 import eu.etaxonomy.cdm.model.common.User;
60 import eu.etaxonomy.cdm.model.description.DescriptionBase;
61 import eu.etaxonomy.cdm.model.media.Media;
62 import eu.etaxonomy.cdm.model.description.DescriptionElementBase;
63 import eu.etaxonomy.cdm.model.name.NonViralName;
64 import eu.etaxonomy.cdm.model.occurrence.SpecimenOrObservationBase;
65 import eu.etaxonomy.cdm.model.reference.Reference;
66 import eu.etaxonomy.cdm.model.taxon.TaxonBase;
67 import eu.etaxonomy.taxeditor.model.DescriptionHelper;
68 import eu.etaxonomy.taxeditor.session.ICdmEntitySession;
69 import eu.etaxonomy.taxeditor.store.CdmStore;
70 import eu.etaxonomy.taxeditor.view.AbstractCdmViewPart;
71
72 /**
73 * @author p.ciardelli
74 * @created 08.07.2009
75 * @version 1.0
76 */
77 public class ReferencingObjectsView extends AbstractCdmViewPart {
78 private static final Logger logger = Logger
79 .getLogger(ReferencingObjectsView.class);
80
81 public static final String ID = "eu.etaxonomy.taxeditor.bulkeditor.view.referencingobjects";
82
83 private TableViewer viewer;
84
85 private String referencedObjectTitleCache;
86 private ConversationHolder conversation;
87 private final ICdmEntitySession cdmEntitySession;
88
89 public ReferencingObjectsView() {
90 cdmEntitySession = CdmStore.getCurrentSessionManager().bindNullSession();
91 }
92
93 /** {@inheritDoc} */
94 @Override
95 public void createViewer(Composite parent) {
96 selectionService.addSelectionListener(this);
97 conversation = CdmStore.createConversation();
98 viewer = new TableViewer(parent, SWT.MULTI | SWT.H_SCROLL
99 | SWT.V_SCROLL | SWT.FULL_SELECTION);
100 createColumns(viewer);
101 viewer.setContentProvider(new ReferencingObjectsContentProvider());
102 viewer.setLabelProvider(new ReferencingObjectsLabelProvider());
103 viewer.setCellModifier(new ICellModifier() {
104 @Override
105 public void modify(Object element, String property, Object value) {
106 }
107
108 @Override
109 public Object getValue(Object element, String property) {
110 ITableLabelProvider tableLabelProvider = null;
111 if(viewer.getLabelProvider() instanceof ITableLabelProvider){
112 tableLabelProvider = (ITableLabelProvider) viewer.getLabelProvider();
113 }
114 Object[] columnProperties = viewer.getColumnProperties();
115 for (int i=0;i<columnProperties.length;i++) {
116 if(columnProperties[i].equals(property) && tableLabelProvider!=null){
117 return tableLabelProvider.getColumnText(element, i);
118 }
119 }
120 return "";
121 }
122
123 @Override
124 public boolean canModify(Object element, String property) {
125 return true;
126 }
127 });
128
129 //create context menu
130 MenuManager menuManager = new MenuManager();
131 getSite().registerContextMenu(menuManager, viewer);
132 Control control = viewer.getControl();
133 Menu menu = menuManager.createContextMenu(control);
134 control.setMenu(menu);
135
136 // Propagate selection from viewer
137 getSite().setSelectionProvider(viewer);
138 }
139
140 /**
141 * Create the columns for the table
142 * @param viewer
143 */
144 private void createColumns(TableViewer viewer) {
145 Table table = viewer.getTable();
146 String[] titles = {"Class", "Description", "UUID", "Object ID" };
147 int[] bounds = { 100, 200, 100, 70};
148
149 CellEditor[] editors = new CellEditor[titles.length];
150
151 for (int i = 0; i < titles.length; i++) {
152 TableViewerColumn column = new TableViewerColumn(viewer, SWT.NONE);
153 editors[i] = new TextCellEditor(table);
154 column.getColumn().setText(titles[i]);
155 column.getColumn().setWidth(bounds[i]);
156 column.getColumn().setResizable(true);
157 column.getColumn().setMoveable(true);
158 }
159 table.setHeaderVisible(true);
160 table.setLinesVisible(true);
161
162 viewer.setCellEditors(editors);
163 viewer.setColumnProperties(titles);
164 }
165
166 @Override
167 public void setFocus() {
168 cdmEntitySession.bind();
169 }
170
171 public void updateReferencingObjects(final UUID entityUUID, final Class objectClass) {
172
173 final Display display = Display.getCurrent();
174
175 Job job = new Job("Update Referencing Objects") {
176
177 @Override
178 protected IStatus run(IProgressMonitor monitor) {
179 monitor.beginTask("Calculating referencing objects", 10);
180
181 monitor.worked(3);
182
183 display.asyncExec(new Runnable() {
184
185 @Override
186 public void run() {
187 if (entityUUID != null){
188 ICdmEntitySession previousCdmEntitySession = CdmStore.getCurrentSessionManager().getActiveSession();
189 cdmEntitySession.bind();
190 List<CdmBase> referencingObjects = getReferencingObjects(entityUUID, objectClass);
191 if(previousCdmEntitySession != null) {
192 previousCdmEntitySession.bind();
193 }
194 updateView(referencingObjects);
195
196 }
197 }
198 });
199
200 monitor.done();
201
202
203 return Status.OK_STATUS;
204 }
205 };
206
207 job.setPriority(Job.DECORATE);
208 job.schedule();
209 }
210
211 private List<CdmBase> getReferencingObjects(UUID entity, Class objectClass) {
212 CdmBase referencedObject = null;
213 try {
214 if (objectClass.getSuperclass().equals(TeamOrPersonBase.class) ){
215 referencedObject = CdmStore.getService(IAgentService.class).load(entity);
216 } else if (objectClass.getSuperclass().equals(NonViralName.class)){
217 referencedObject = CdmStore.getService(INameService.class).load(entity);
218 } else if (objectClass.getSuperclass().equals(TaxonBase.class)){
219 referencedObject = CdmStore.getService(ITaxonService.class).load(entity);
220 } else if (objectClass.equals(Reference.class)){
221 referencedObject = CdmStore.getService(IReferenceService.class).load(entity);
222 } else if (objectClass.getSuperclass().equals(SpecimenOrObservationBase.class)){
223 referencedObject = CdmStore.getService(IOccurrenceService.class).load(entity);
224 } else if (objectClass.isAssignableFrom(User.class)){
225 referencedObject = CdmStore.getService(IUserService.class).load(entity);
226 } else if (objectClass.isAssignableFrom(Group.class)){
227 referencedObject = CdmStore.getService(IGroupService.class).load(entity);
228 } else if (objectClass.isAssignableFrom(Media.class)){
229 referencedObject = CdmStore.getService(IMediaService.class).load(entity);
230 } else if (DescriptionBase.class.isAssignableFrom(objectClass)){
231 referencedObject = CdmStore.getService(IDescriptionService.class).load(entity);
232 } else if (DescriptionElementBase.class.isAssignableFrom(objectClass)){
233 referencedObject = CdmStore.getService(IDescriptionService.class).loadDescriptionElement(entity, null);
234 }
235 //referencedObject =(CdmBase) CdmStore.getService(IIdentifiableEntityService.class).load(referencedObject.getUuid());
236 Set<CdmBase> setOfReferencingObjects = null;
237
238 if (referencedObject != null){
239 if(referencedObject.isInstanceOf(IdentifiableEntity.class)){
240 referencedObjectTitleCache = (HibernateProxyHelper.deproxy(referencedObject, IdentifiableEntity.class)).getTitleCache();
241 }
242 else if(referencedObject.isInstanceOf(DescriptionElementBase.class)){
243 referencedObjectTitleCache = DescriptionHelper.getLabel(referencedObject);
244 }
245 else{
246 referencedObjectTitleCache = null;
247 }
248 setOfReferencingObjects = CdmStore.getCommonService().getReferencingObjects(referencedObject);
249 }
250 if (setOfReferencingObjects != null){
251 List<CdmBase> referencingObjects = new ArrayList<CdmBase>(setOfReferencingObjects);
252
253 Collections.sort(referencingObjects, new ReferencingClassComparator());
254
255 return referencingObjects;
256
257 }
258 } catch (Exception e) {
259 logger.error("Error retrieving referencing objects", e);
260 setContentDescription("The referencing objects view could not be loaded completely. Some Problems occured.");
261 }
262 return null;
263 }
264
265 class ReferencingClassComparator implements Comparator<CdmBase> {
266
267 @Override
268 public int compare(CdmBase o1, CdmBase o2) {
269 String string1 = o1.getClass().getSimpleName();
270 String string2 = o2.getClass().getSimpleName();
271 int classCompare = string1.compareToIgnoreCase(string2);
272 if (classCompare == 0) {
273 string1 = DescriptionHelper.getObjectDescription(o1);
274 string2 = DescriptionHelper.getObjectDescription(o2);
275 return string1.compareToIgnoreCase(string2);
276 } else {
277 return classCompare;
278 }
279 }
280 }
281
282 private void updateView(List<CdmBase> referencingObjects) {
283 if (viewer != null && !viewer.getControl().isDisposed()){
284 try{
285 viewer.setInput(referencingObjects);
286 if (referencedObjectTitleCache != null){
287 setContentDescription("'" + referencedObjectTitleCache + "' is referenced by:");
288 } else {
289 setContentDescription("");
290 }
291 showViewer();
292 }catch(Exception e){
293 setContentDescription("The referencing objects view could not be loaded completely. Some Problems occured.");
294 }
295
296 }
297 }
298
299 /** {@inheritDoc} */
300 @Override
301 public void selectionChanged(IWorkbenchPart part, ISelection selection) {
302 if(part == this){
303 return;
304 }
305 if(selection instanceof IStructuredSelection){
306 showViewer(part, (IStructuredSelection) selection);
307 }
308 }
309
310 /** {@inheritDoc} */
311 @Override
312 public void showViewer(IWorkbenchPart part, IStructuredSelection selection) {
313 // this.part = part;
314
315 Object firstElement = selection.getFirstElement();
316 if(firstElement instanceof TreeNode){
317 firstElement = ((TreeNode) firstElement).getValue();
318 }
319 if(firstElement instanceof CdmBase){
320 updateReferencingObjects(((CdmBase) firstElement).getUuid(),firstElement.getClass() );
321 }
322 else{
323 updateView(null);
324 setContentDescription("");
325 }
326 }
327
328 /** {@inheritDoc} */
329 @Override
330 public void dispose() {
331 conversation.close();
332 selectionService.removePostSelectionListener(this);
333 selectionService.removeSelectionListener(this);
334 cdmEntitySession.dispose();
335 super.dispose();
336
337 }
338
339 /** {@inheritDoc} */
340 @Override
341 public Viewer getViewer() {
342 return viewer;
343 }
344
345 /** {@inheritDoc} */
346 @Override
347 public void changed(Object object) {
348 // no editing in this view
349 }
350
351 /** {@inheritDoc} */
352 @Override
353 public boolean onComplete() {
354 return false;
355 }
356
357 public void refresh(){
358 selectionService.removePostSelectionListener(this);
359 selectionService.removeSelectionListener(this);
360 selectionService.addPostSelectionListener(this);
361 selectionService.addSelectionListener(this);
362
363 }
364
365 }