Author: tchemit Date: 2012-08-08 14:37:23 +0200 (Wed, 08 Aug 2012) New Revision: 366 Url: http://forge.codelutin.com/repositories/revision/sammoa/366 Log: add method to compute selected filter for Species and SpeciesTypes Modified: trunk/sammoa-persistence/src/main/java/fr/ulr/sammoa/persistence/Species2.java Modified: trunk/sammoa-persistence/src/main/java/fr/ulr/sammoa/persistence/Species2.java =================================================================== --- trunk/sammoa-persistence/src/main/java/fr/ulr/sammoa/persistence/Species2.java 2012-08-08 12:36:48 UTC (rev 365) +++ trunk/sammoa-persistence/src/main/java/fr/ulr/sammoa/persistence/Species2.java 2012-08-08 12:37:23 UTC (rev 366) @@ -23,8 +23,12 @@ * #L% */ +import com.google.common.base.Function; import com.google.common.collect.Lists; +import com.google.common.collect.Multimap; +import com.google.common.collect.Multimaps; import com.google.common.collect.Sets; +import org.apache.commons.collections.CollectionUtils; import java.util.Collection; import java.util.List; @@ -49,4 +53,61 @@ } return Lists.newArrayList(types); } + + /** + * Given a universe of species ({@code allSpecies}, and selected + * species ({@code selectedSpecies}) and selected species + * types ({@code speciesTypeSelected}), get all selected species. + * <p/> + * <strong>Note:</strong> if no species types are selected, then selects + * all of them (means at the end selected all species). + * <p/> + * <strong>Note:</strong> if all species are selected, then returns an + * empty list (usage of empty selected filter). + * + * @param allSpecies universe of definied species + * @param selectedSpecies selected species + * @param speciesTypeSelected selected species types (if empty then all are selected). + * @return the list of selected species (empty if all species are selected). + */ + public static List<Species> getSelectedSpecies(List<Species> allSpecies, + List<Species> selectedSpecies, + List<StringRef> speciesTypeSelected) { + Set<Species> result = Sets.newHashSet(); + + // add all selected species + result.addAll(selectedSpecies); + + if (CollectionUtils.isEmpty(speciesTypeSelected)) { + + // no sepecies type selected : means select all types --> all species + + } else { + + // there is some selected species types + + Multimap<String, Species> speciesByType = + Multimaps.index(allSpecies, TO_SPECIES_TYPE); + + for (StringRef typeRef : speciesTypeSelected) { + String type = typeRef.getValue(); + Collection<Species> speciesForType = speciesByType.get(type); + result.addAll(speciesForType); + } + } + + if (result.size() == allSpecies.size()) { + + // all species selected, so use none + result.clear(); + } + return Lists.newArrayList(result); + } + + protected static Function<Species, String> TO_SPECIES_TYPE = new Function<Species, String>() { + @Override + public String apply(Species input) { + return input.getType(); + } + }; }