Project

General

Profile

Download (12.6 KB) Statistics
| Branch: | Tag: | Revision:
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
}
(3-3/3)