Project

General

Profile

Download (8.13 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.store;
12

    
13
import java.util.ArrayList;
14
import java.util.Arrays;
15
import java.util.List;
16

    
17
import org.eclipse.jface.dialogs.MessageDialog;
18
import org.eclipse.swt.widgets.Display;
19

    
20
import eu.etaxonomy.cdm.api.service.IAgentService;
21
import eu.etaxonomy.cdm.api.service.IGroupService;
22
import eu.etaxonomy.cdm.api.service.INameService;
23
import eu.etaxonomy.cdm.api.service.IOccurrenceService;
24
import eu.etaxonomy.cdm.api.service.IReferenceService;
25
import eu.etaxonomy.cdm.api.service.ITaxonService;
26
import eu.etaxonomy.cdm.api.service.IUserService;
27
import eu.etaxonomy.cdm.api.service.config.IFindTaxaAndNamesConfigurator;
28
import eu.etaxonomy.cdm.api.service.config.IIdentifiableEntityServiceConfigurator;
29
import eu.etaxonomy.cdm.model.agent.AgentBase;
30
import eu.etaxonomy.cdm.model.agent.TeamOrPersonBase;
31
import eu.etaxonomy.cdm.model.common.Group;
32
import eu.etaxonomy.cdm.model.common.IdentifiableEntity;
33
import eu.etaxonomy.cdm.model.common.RelationshipBase;
34
import eu.etaxonomy.cdm.model.common.User;
35
import eu.etaxonomy.cdm.model.name.NameRelationship;
36
import eu.etaxonomy.cdm.model.name.TaxonNameBase;
37
import eu.etaxonomy.cdm.model.occurrence.DerivedUnit;
38
import eu.etaxonomy.cdm.model.occurrence.FieldUnit;
39
import eu.etaxonomy.cdm.model.occurrence.SpecimenOrObservationBase;
40
import eu.etaxonomy.cdm.model.reference.Reference;
41
import eu.etaxonomy.cdm.model.taxon.TaxonBase;
42
import eu.etaxonomy.cdm.persistence.dto.UuidAndTitleCache;
43
import eu.etaxonomy.taxeditor.preference.IPreferenceKeys;
44
import eu.etaxonomy.taxeditor.preference.PreferencesUtil;
45

    
46
/**
47
 * @author n.hoffmann
48
 * @created Dec 8, 2010
49
 * @version 1.0
50
 */
51
public class SearchManager {
52

    
53
	public static final List NO_RESULTS = Arrays.asList(new Object[]{});
54

    
55
	public static final String WILDCARD = "*";
56

    
57
	public static int NO_COUNT = -1;
58

    
59
	// TODO make this configurable via preferences
60
	private static final int MAX_RESULTS_BEFORE_WARNING = 500;
61

    
62
	public List<TaxonNameBase> findNames(IIdentifiableEntityServiceConfigurator configurator){
63
		if(checkLargeResult(CdmStore.getService(INameService.class).countByTitle(configurator))){
64
			return CdmStore.getService(INameService.class).findByTitle(configurator).getRecords();
65
		}
66
		return NO_RESULTS;
67
	}
68

    
69
	public List<NameRelationship> findNameRelationships(
70
			IIdentifiableEntityServiceConfigurator configurator) {
71
		if(true){
72
			return NO_RESULTS;
73
		}
74

    
75
		List<NameRelationship> relationships = new ArrayList<NameRelationship>();
76
		List<RelationshipBase> all = CdmStore.getService(INameService.class).getAllRelationships(0, 0);
77

    
78
		for (RelationshipBase relationship : all){
79
			if(relationship instanceof NameRelationship){
80
				relationships.add((NameRelationship) relationship);
81
			}
82
		}
83
		return relationships;
84
	}
85

    
86
	public List<UuidAndTitleCache<IdentifiableEntity>> findTaxaAndNames(IFindTaxaAndNamesConfigurator<TaxonBase> configurator){
87
		return CdmStore.getService(ITaxonService.class).findTaxaAndNamesForEditor(configurator);
88
	}
89

    
90
	public List<Reference> findReferences(IIdentifiableEntityServiceConfigurator configurator){
91
		if(checkLargeResult(CdmStore.getService(IReferenceService.class).countByTitle(configurator))){
92
			return  CdmStore.getService(IReferenceService.class).findByTitle(configurator).getRecords();
93
		}
94
		return NO_RESULTS;
95
	}
96

    
97
	public List<AgentBase> findAgents(IIdentifiableEntityServiceConfigurator configurator){
98
		if(checkLargeResult(CdmStore.getService(IAgentService.class).countByTitle(configurator))){
99
			return CdmStore.getService(IAgentService.class).findByTitle(configurator).getRecords();
100
		}
101
		return NO_RESULTS;
102
	}
103

    
104
	@SuppressWarnings("unchecked")
105
	public List<TeamOrPersonBase> findTeamOrPersons(IIdentifiableEntityServiceConfigurator configurator){
106
		configurator.setClazz(TeamOrPersonBase.class);
107
		return (List)findAgents(configurator);
108
	}
109

    
110
	/**
111
	 * Searches for {@link SpecimenOrObservationBase} with the parameters specified in the
112
	 * {@link IIdentifiableEntityServiceConfigurator}<br>
113
	 * <br>
114
	 * Note: FieldUnits are omitted by default. See {@link #findOccurrences(IIdentifiableEntityServiceConfigurator, boolean)}
115
	 *
116
	 * @param configurator the configurator to use for the search
117
	 * @return a list of the SpecimenOrObservationBases matching the search parameters found
118
	 */
119
	public List<SpecimenOrObservationBase> findOccurrences(IIdentifiableEntityServiceConfigurator configurator){
120
	    // by default we do not show field units. This may be configured via preferences
121
	    return findOccurrences(configurator, PreferencesUtil.getPreferenceStore().getBoolean(IPreferenceKeys.BULK_EDITOR_OCCURRENCE_SHOW_FIELD_UNITS));
122
	}
123

    
124

    
125
	/**
126
	 * Searches for {@link SpecimenOrObservationBase} with the parameters specified in the
127
	 * {@link IIdentifiableEntityServiceConfigurator}
128
	 *
129
	 * @param configurator the configurator to use for the search
130
	 * @return a list of the SpecimenOrObservationBases found
131
	 * @param showFieldUnits if <code>true</code> then also FieldUnits are searched
132
	 * @return
133
	 */
134
	public List<SpecimenOrObservationBase> findOccurrences(IIdentifiableEntityServiceConfigurator<SpecimenOrObservationBase> configurator, boolean showFieldUnits){
135
		if(configurator.getClazz()==null){
136
		    if(showFieldUnits){
137
		        configurator.setClazz(SpecimenOrObservationBase.class);
138
		    }
139
		    else{
140
		        configurator.setClazz(DerivedUnit.class);
141
		    }
142
		}
143
		if(configurator.getClazz().equals(SpecimenOrObservationBase.class)){
144
		    //get FieldUnits + DerivedUnits
145
		    List<SpecimenOrObservationBase> records = new ArrayList<SpecimenOrObservationBase>();
146
		    configurator.setClazz(DerivedUnit.class);
147
		    int derivedUnitCount = CdmStore.getService(IOccurrenceService.class).countOccurrences(configurator);
148
		    configurator.setClazz(FieldUnit.class);
149
		    int fieldUnitCount = CdmStore.getService(IOccurrenceService.class).countOccurrences(configurator);
150

    
151
		    if(checkLargeResult(derivedUnitCount+fieldUnitCount)){
152
		        configurator.setClazz(DerivedUnit.class);
153
		        records.addAll(CdmStore.getService(IOccurrenceService.class).findByTitle(configurator).getRecords());
154
		        configurator.setClazz(FieldUnit.class);
155
		        records.addAll(CdmStore.getService(IOccurrenceService.class).findByTitle(configurator).getRecords());
156
		    }
157
		    return records;
158

    
159
		}
160
		if(checkLargeResult(CdmStore.getService(IOccurrenceService.class).countOccurrences(configurator))){
161
			return CdmStore.getService(IOccurrenceService.class).findByTitle(configurator).getRecords();
162
		}
163
		return NO_RESULTS;
164
	}
165

    
166
	public List<User> findUsers(IIdentifiableEntityServiceConfigurator configurator){
167
		String userNameSearchString = sqlizeTitleSearchString(configurator);
168
		// TODO why are users not identifiable entities?
169
		return CdmStore.getService(IUserService.class).listByUsername(userNameSearchString, null, null, null, null, null, null);
170
	}
171

    
172

    
173
	public List<Group> findGroups(IIdentifiableEntityServiceConfigurator configurator){
174
		String groupNameSearchString = sqlizeTitleSearchString(configurator);
175
		// TODO why are groups not identifiable entities?
176
		return CdmStore.getService(IGroupService.class).listByName(groupNameSearchString, null, null, null, null, null, null);
177
	}
178

    
179

    
180
	private boolean checkLargeResult(int count) {
181
		if(count > MAX_RESULTS_BEFORE_WARNING){
182
			return MessageDialog.openConfirm(Display.getDefault().getActiveShell(), "Large result expected",
183
					String.format("The current search will return %s objects. This will " +
184
							"take a long time and/or might render the editor unusable. Please consider refining your search.", count));
185
		}else{
186
			return true;
187
		}
188
	}
189

    
190
	private String sqlizeTitleSearchString(IIdentifiableEntityServiceConfigurator configurator){
191
		return configurator.getTitleSearchString().replace(WILDCARD, "%");
192
	}
193

    
194
	public List findTaxa(IIdentifiableEntityServiceConfigurator configurator) {
195
		if(checkLargeResult(CdmStore.getService(ITaxonService.class).countByTitle(configurator))){
196
			return CdmStore.getService(ITaxonService.class).findByTitle(configurator).getRecords();
197
		}
198
		return NO_RESULTS;
199
	}
200

    
201

    
202
}
(6-6/11)