Project

General

Profile

Download (8.38 KB) Statistics
| Branch: | Tag: | Revision:
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
package eu.etaxonomy.taxeditor.bulkeditor.input;
10

    
11
import java.util.ArrayList;
12
import java.util.Collections;
13
import java.util.Comparator;
14
import java.util.HashMap;
15
import java.util.HashSet;
16
import java.util.List;
17
import java.util.Map;
18
import java.util.Map.Entry;
19
import java.util.Set;
20
import java.util.UUID;
21

    
22
import eu.etaxonomy.cdm.api.conversation.ConversationHolder;
23
import eu.etaxonomy.cdm.api.service.config.DeleteConfiguratorBase;
24
import eu.etaxonomy.cdm.api.service.config.IIdentifiableEntityServiceConfigurator;
25
import eu.etaxonomy.cdm.api.service.exception.ReferencedObjectUndeletableException;
26
import eu.etaxonomy.cdm.hibernate.HibernateProxyHelper;
27
import eu.etaxonomy.cdm.model.common.CdmBase;
28
import eu.etaxonomy.cdm.model.common.IdentifiableEntity;
29
import eu.etaxonomy.cdm.model.common.MarkerType;
30
import eu.etaxonomy.cdm.strategy.merge.IMergable;
31
import eu.etaxonomy.cdm.strategy.merge.MergeException;
32
import eu.etaxonomy.taxeditor.annotatedlineeditor.IEntityCreator;
33
import eu.etaxonomy.taxeditor.annotatedlineeditor.IEntityPersistenceService;
34
import eu.etaxonomy.taxeditor.bulkeditor.BulkEditorQuery;
35
import eu.etaxonomy.taxeditor.bulkeditor.IBulkEditorSortProvider;
36
import eu.etaxonomy.taxeditor.bulkeditor.input.sortprovider.CdmBaseSortProvider;
37
import eu.etaxonomy.taxeditor.bulkeditor.input.sortprovider.TitleCacheComparator;
38
import eu.etaxonomy.taxeditor.bulkeditor.internal.TaxeditorBulkeditorPlugin;
39
import eu.etaxonomy.taxeditor.editor.CdmEntitySessionInput;
40
import eu.etaxonomy.taxeditor.model.MessagingUtils;
41
import eu.etaxonomy.taxeditor.store.CdmStore;
42

    
43
/**
44
 * @author p.ciardelli
45
 * @created 25.06.2009
46
 * @version 1.0
47
 * @param <T>
48
 */
49
public abstract class AbstractBulkEditorInput<T extends CdmBase> extends CdmEntitySessionInput implements
50
    IEntityPersistenceService<T> {
51

    
52
	private UUID entityUuid;
53

    
54
	private List<T> model = new ArrayList<>();
55

    
56
	private Map<T, DeleteConfiguratorBase> toDelete = new HashMap<>();
57
	private List<T> saveCandidates = new ArrayList<>();
58

    
59

    
60
	private Set<T> markedMergeCandidates = new HashSet<>();
61
	private T markedMergeTarget = null;
62

    
63
	private HashMap<T, Set<T>> mergedEntities = new HashMap<>();
64

    
65
	private IEntityCreator<T> entityCreator;
66
	private final ConversationHolder conversation;
67

    
68
	public AbstractBulkEditorInput() {
69
	    super(true);
70
	    this.conversation = CdmStore.createConversation();
71
	}
72

    
73
	static public AbstractBulkEditorInput NewInstance(BulkEditorInputType inputType) {
74

    
75
		return BulkEditorInputType.getInput(inputType);
76
	}
77

    
78
	public static AbstractBulkEditorInput NewInstance(IdentifiableEntity entity) {
79

    
80
		BulkEditorInputType inputType = BulkEditorInputType.getByType(entity.getClass());
81

    
82
		AbstractBulkEditorInput editorInput = NewInstance(inputType);
83

    
84
		editorInput.setEntityUuid(entity.getUuid());
85

    
86
		return editorInput;
87
	}
88

    
89
    public abstract String getName();
90

    
91
    public String getEditorName(){
92
        return getName();
93
    }
94

    
95
	protected abstract List<T> listEntities(IIdentifiableEntityServiceConfigurator configurator);
96

    
97
	protected abstract T loadEntity(UUID entityUuid);
98

    
99
	public void setMergeTarget(T t){
100
	    markedMergeTarget = t;
101
	}
102

    
103
    public Set<T> getMergeCandidates() {
104
        return markedMergeCandidates;
105
    }
106

    
107
    public T getMergeTarget() {
108
        return markedMergeTarget;
109
    }
110

    
111
	public void removeMergeTarget(){
112
	    markedMergeTarget = null;
113
	}
114

    
115
	public void addMergeCandidate(T t){
116
	    markedMergeCandidates.add(t);
117
	}
118

    
119
	public void removeMergeCandidate(T t){
120
		markedMergeCandidates.remove(t);
121
	}
122

    
123
    public void addToDelete(T t, DeleteConfiguratorBase config) {
124
        toDelete.put(t, config);
125
    }
126
    public void addSaveCandidate(T t){
127
        saveCandidates.add(t);
128
    }
129
	private void setEntityUuid(UUID entityUuid){
130
		this.entityUuid = entityUuid;
131
	}
132

    
133
	public UUID getEntityUuid() {
134
		return entityUuid;
135
	}
136

    
137
	public void performSearch(final BulkEditorQuery bulkEditorQuery) {
138

    
139
		List<T> entityList = new ArrayList<T>();
140

    
141
		if(getEntityUuid() != null){
142

    
143
			T entity = loadEntity(getEntityUuid());
144
			entityList.add(entity);
145
			model = entityList;
146
		}
147
		else if(bulkEditorQuery != null){
148

    
149
			IIdentifiableEntityServiceConfigurator configurator = bulkEditorQuery.getSearchConfigurator();
150
			Comparator queryComparator = (bulkEditorQuery.getComparator() != null) ? bulkEditorQuery.getComparator() : new TitleCacheComparator();
151

    
152
			entityList = listEntities(configurator);
153

    
154
			Collections.sort(entityList, queryComparator);
155

    
156

    
157
		}
158

    
159
		model = entityList;
160
	}
161

    
162
	public boolean isMergingEnabled() {
163
		return false;
164
	}
165

    
166
	public boolean isConvertingEnabled() {
167
		return false;
168
	}
169

    
170
	public boolean isMarkerTypeEditingEnabled(MarkerType markerType) {
171
		return false;
172
	}
173

    
174

    
175
	/** {@inheritDoc} */
176
	@Override
177
    public boolean merge(T entity, T mergeTarget) {
178
		if (entity instanceof IMergable) {
179
			try {
180
				CdmStore.getCommonService().merge(mergeTarget.getUuid(), entity.getUuid(), (Class<? extends CdmBase>)entity.getClass());
181
			} catch (MergeException e) {
182
				MessagingUtils.errorDialog("Bulk Editor Merge Error",
183
						this,
184
						"Could not merge chosen objects of type " + entity.getClass().getName(),
185
						TaxeditorBulkeditorPlugin.PLUGIN_ID,
186
						e,
187
						true);
188
			}
189
		}
190
		return true;
191
	}
192

    
193
	public void saveModel(){
194
	    saveModel(true);
195
	}
196

    
197
	public void saveModel(boolean resetMerge){
198
	    //delete entities
199
	    for(Entry<T, DeleteConfiguratorBase> entry:toDelete.entrySet()){
200
	        try {
201
                delete(entry.getKey(), entry.getValue());
202
            } catch (ReferencedObjectUndeletableException e) {
203
                e.printStackTrace();
204
            }
205
	    }
206
	    toDelete.clear();
207
	    if (!saveCandidates.isEmpty()){
208
	        CdmStore.getService(saveCandidates.get(0)).merge(saveCandidates, true);
209
        }
210
	    if(resetMerge){
211
	        //merge entities
212
	        for(T mergeTarget:mergedEntities.keySet()){
213
	            for (T mergeCandidate: mergedEntities.get(mergeTarget)){
214
	                merge(mergeCandidate, mergeTarget);
215
	            }
216
	        }
217
	        mergedEntities.clear();
218

    
219
	    }
220
	}
221

    
222

    
223
	/** {@inheritDoc} */
224
	@Override
225
    public T create(T entity) {
226
		return save(entity);
227
	}
228

    
229
	public IEntityCreator<T> getEntityCreator(){
230
		if(entityCreator == null){
231
			entityCreator = createEntityCreator();
232
		}
233
		return entityCreator;
234
	}
235

    
236
	protected abstract IEntityCreator<T> createEntityCreator();
237

    
238
	/**
239
	 * The default implementation returns an empty list of sort providers.
240
	 * @return
241
	 */
242
	public List<IBulkEditorSortProvider<T>> getSortProviders(){
243
		List<IBulkEditorSortProvider<T>> sortProviders = new ArrayList<IBulkEditorSortProvider<T>>();
244

    
245
		sortProviders.add(new CdmBaseSortProvider<T>());
246

    
247
		return sortProviders;
248
	}
249

    
250
	/**
251
	 * Returns a textual representation given object. The default implementation
252
	 * in the abstract base class returns the simple name of the class, this may
253
	 * be overwritten to something more specific in subclasses.
254
	 *
255
	 * @param entity
256
	 * @return a textual representation given object.
257
	 */
258
	public String getTypeText(Object entity){
259
		return entity.getClass().getSimpleName();
260
	}
261

    
262
	public String getText(T entity) {
263
		if(entity instanceof IdentifiableEntity){
264
			IdentifiableEntity identifiableEntity = (IdentifiableEntity) HibernateProxyHelper.deproxy(entity);
265

    
266
			return identifiableEntity.getTitleCache();
267
		}
268

    
269
		return "No text. Implement in subclass";
270
	}
271

    
272
	public List<T> getModel() {
273
		return model;
274
	}
275

    
276
	protected boolean replaceInModel(T entity) {
277
	    int index = model.indexOf(entity);
278
	    if(index >= 0) {
279
	        model.set(index, entity);
280
	        return true;
281
	    } else {
282
	        return false;
283
	    }
284
	}
285

    
286
    @Override
287
    public   List<T> getRootEntities() {
288
        return getModel();
289
    }
290

    
291

    
292
    @Override
293
    public Map<Object, List<String>> getPropertyPathsMap() {
294
        // TODO Auto-generated method stub
295
        return null;
296
    }
297

    
298
	public ConversationHolder getConversation() {
299
		return conversation;
300
	}
301

    
302
	public List<T> getSaveCandidates() {
303
        return saveCandidates;
304
    }
305

    
306
    /**
307
     *
308
     */
309
    public void resetSaveCandidates() {
310
       this.saveCandidates.clear();
311

    
312
    }
313

    
314
    public HashMap<T, Set<T>> getMergedEntities() {
315
        return mergedEntities;
316
    }
317

    
318
    public void setMergedEntities(HashMap<T, Set<T>> mergedEntities) {
319
        this.mergedEntities = mergedEntities;
320
    }
321
}
(1-1/11)