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