Author: chatellier Date: 2010-11-04 13:35:35 +0000 (Thu, 04 Nov 2010) New Revision: 167 Log: Rafraichissement de la liste des especes ?\195?\160 partir de la liste des zones. Modified: trunk/coser-business/src/main/java/fr/ifremer/coser/services/ProjectService.java trunk/coser-business/src/test/java/fr/ifremer/coser/services/ProjectServiceTest.java trunk/coser-ui/src/main/java/fr/ifremer/coser/ui/CoserFrameHandler.java trunk/coser-ui/src/main/java/fr/ifremer/coser/ui/selection/SelectionDetailsView.jaxx trunk/coser-ui/src/main/java/fr/ifremer/coser/ui/selection/SelectionHandler.java Modified: trunk/coser-business/src/main/java/fr/ifremer/coser/services/ProjectService.java =================================================================== --- trunk/coser-business/src/main/java/fr/ifremer/coser/services/ProjectService.java 2010-11-04 11:27:22 UTC (rev 166) +++ trunk/coser-business/src/main/java/fr/ifremer/coser/services/ProjectService.java 2010-11-04 13:35:35 UTC (rev 167) @@ -32,9 +32,11 @@ import java.util.ArrayList; import java.util.Collections; import java.util.HashMap; +import java.util.HashSet; import java.util.Iterator; import java.util.List; import java.util.Map; +import java.util.Set; import java.util.SortedMap; import java.util.SortedSet; import java.util.TreeMap; @@ -850,27 +852,60 @@ * * Used in selection ui. * + * Les especes sont determinées : + * - en lisant les traits pour determiner les traits à partir des zones + * - en lisant les captures pour determiner les especes à partir des traits + * * @param container data container + * @param zoneName zone name * @param beginYear begin year (can be null) * @param endYear end year (can be null) * @return species */ - public List<Specy> getProjectSpecies(AbstractDataContainer container, Integer beginYear, Integer endYear) { - + public List<Specy> getProjectSpecies(AbstractDataContainer container, List<String> zoneName, Integer beginYear, Integer endYear) { + + // first get traits list + Set<String> traits = new HashSet<String>(); + Iterator<String[]> itTuple = container.getHaul().iterator(); + itTuple.next(); // skip header + while (itTuple.hasNext()) { + String[] tuple = itTuple.next(); + + // Campagne;Annee;Trait;Mois;Strate;SurfaceBalayee;Lat;Long;ProfMoy + String annee = tuple[Haul.INDEX_YEAR]; + try { + int intAnnee = Integer.parseInt(annee); + + if (intAnnee >= beginYear && intAnnee <= endYear) { + String strataName = tuple[Haul.INDEX_STRATUM]; + if (zoneName.contains(strataName)) { + String traitsName = tuple[Haul.INDEX_HAUL]; + traits.add(traitsName); + } + } + } + catch (NumberFormatException ex) { + if (log.isWarnEnabled()) { + log.warn("Can't parse year '" + annee + "' as int, can't happen with controled data"); + } + } + } + + // second get species with trait list SortedMap<String, Specy> result = new TreeMap<String, Specy>(); - - Iterator<String[]> itTuple = container.getCatch().iterator(); + itTuple = container.getCatch().iterator(); itTuple.next(); // skip header while (itTuple.hasNext()) { String[] tuple = itTuple.next(); - String species = tuple[Catch.INDEX_SPECIES]; // "Campagne","Annee","Trait","Espece","Nombre","Poids" String annee = tuple[Catch.INDEX_YEAR]; try { int intAnnee = Integer.parseInt(annee); - if (intAnnee >= beginYear && intAnnee <= endYear) { + String haul = tuple[Catch.INDEX_HAUL]; + if (intAnnee >= beginYear && intAnnee <= endYear && traits.contains(haul)) { + String species = tuple[Catch.INDEX_SPECIES]; if (!result.containsKey(species)) { Specy specy = new Specy(); specy.setName(species); Modified: trunk/coser-business/src/test/java/fr/ifremer/coser/services/ProjectServiceTest.java =================================================================== --- trunk/coser-business/src/test/java/fr/ifremer/coser/services/ProjectServiceTest.java 2010-11-04 11:27:22 UTC (rev 166) +++ trunk/coser-business/src/test/java/fr/ifremer/coser/services/ProjectServiceTest.java 2010-11-04 13:35:35 UTC (rev 167) @@ -26,6 +26,8 @@ package fr.ifremer.coser.services; import java.io.File; +import java.util.ArrayList; +import java.util.Collections; import java.util.HashMap; import java.util.List; @@ -216,15 +218,31 @@ public void testProjectSpecies() throws CoserBusinessException { Project project = createTestProject(service); Selection selection = service.initProjectSelection(project); - - List<Specy> species = service.getProjectSpecies(selection, 2010, 2011); + + List<String> allZones = new ArrayList<String>(); + allZones.add("STR1"); + allZones.add("STR2"); + allZones.add("STR3"); + allZones.add("STR4"); + allZones.add("STR5"); + allZones.add("STR6"); + + List<Specy> species = service.getProjectSpecies(selection, allZones, 2010, 2011); Assert.assertEquals(4, species.size()); - species = service.getProjectSpecies(selection, 2011, 2011); + species = service.getProjectSpecies(selection, allZones, 2011, 2011); Assert.assertEquals(4, species.size()); - species = service.getProjectSpecies(selection, 2009, 2009); + species = service.getProjectSpecies(selection, allZones, 2009, 2009); Assert.assertEquals(0, species.size()); + + // test with no zones + species = service.getProjectSpecies(selection, new ArrayList<String>(), 2010, 2011); + Assert.assertEquals(0, species.size()); + + // test with only one zone + species = service.getProjectSpecies(selection, Collections.singletonList("STR6"), 2010, 2011); + Assert.assertEquals(4, species.size()); } /** Modified: trunk/coser-ui/src/main/java/fr/ifremer/coser/ui/CoserFrameHandler.java =================================================================== --- trunk/coser-ui/src/main/java/fr/ifremer/coser/ui/CoserFrameHandler.java 2010-11-04 11:27:22 UTC (rev 166) +++ trunk/coser-ui/src/main/java/fr/ifremer/coser/ui/CoserFrameHandler.java 2010-11-04 13:35:35 UTC (rev 167) @@ -36,7 +36,6 @@ import java.util.Locale; import java.util.Map; -import javax.swing.ImageIcon; import javax.swing.JDialog; import javax.swing.JFileChooser; import javax.swing.JOptionPane; Modified: trunk/coser-ui/src/main/java/fr/ifremer/coser/ui/selection/SelectionDetailsView.jaxx =================================================================== --- trunk/coser-ui/src/main/java/fr/ifremer/coser/ui/selection/SelectionDetailsView.jaxx 2010-11-04 11:27:22 UTC (rev 166) +++ trunk/coser-ui/src/main/java/fr/ifremer/coser/ui/selection/SelectionDetailsView.jaxx 2010-11-04 13:35:35 UTC (rev 167) @@ -89,7 +89,8 @@ <JList id="zoneList" model="{selectionZoneModel}" cellRenderer="{new SelectionZoneListRenderer()}" enabled="{selectionDetailsBeginYearField.getSelectedItem() != null && selectionDetailsEndYearField.getSelectedItem() != null}" - selectionModel="{new OneClicListSelectionModel(zoneList.getSelectionModel(), selectionZoneModel)}" /> + selectionModel="{new OneClicListSelectionModel(zoneList.getSelectionModel(), selectionZoneModel)}" + onValueChanged="getHandler().updateSelectionSpecies(this)"/> </JScrollPane> </cell> </row> Modified: trunk/coser-ui/src/main/java/fr/ifremer/coser/ui/selection/SelectionHandler.java =================================================================== --- trunk/coser-ui/src/main/java/fr/ifremer/coser/ui/selection/SelectionHandler.java 2010-11-04 11:27:22 UTC (rev 166) +++ trunk/coser-ui/src/main/java/fr/ifremer/coser/ui/selection/SelectionHandler.java 2010-11-04 13:35:35 UTC (rev 167) @@ -28,6 +28,7 @@ import java.awt.event.ActionEvent; import java.awt.event.ActionListener; import java.awt.event.MouseEvent; +import java.util.ArrayList; import java.util.List; import javax.swing.JList; @@ -68,18 +69,8 @@ * @param event event de la selection (combo) */ public void updateSelectionDateData(SelectionDetailsView view, ActionEvent event) { - updateSelectionZone(view); - updateSelectionSpecies(view); - } - - /** - * Rafraichit la liste des zones avec les dates selectionnees. - * - * @param view view - */ - public void updateSelectionZone(SelectionDetailsView view) { //Project project = view.getContextValue(Project.class); - Selection seletion = view.getContextValue(Selection.class); + Selection selection = view.getContextValue(Selection.class); ProjectService projectService = view.getContextValue(ProjectService.class); Integer beginYear = (Integer)view.getSelectionDetailsBeginYearField().getSelectedItem(); @@ -87,27 +78,39 @@ // il est possible que l'evenement fasse suite a une seule des selections if (beginYear != null && endYear != null) { - List<String> zone = projectService.getProjectZone(seletion, beginYear, endYear); - view.getSelectionZoneModel().setZones(zone); + if (log.isDebugEnabled()) { + log.debug("Refreshing zones list"); + } + List<String> zones = projectService.getProjectZone(selection, beginYear, endYear); + view.getSelectionZoneModel().setZones(zones); } } - + /** - * Rafraichit la liste des especes avec les dates selectionnees. + * Rafraichit la liste des especes avec les dates sélectionnées. * + * Appelé lorsque la selection de la liste des zones change. + * * @param view view */ public void updateSelectionSpecies(SelectionDetailsView view) { //Project project = view.getContextValue(Project.class); - Selection seletion = view.getContextValue(Selection.class); + Selection selection = view.getContextValue(Selection.class); ProjectService projectService = view.getContextValue(ProjectService.class); - + + // get selected zones as list + Object[] selectedZones = view.getZoneList().getSelectedValues(); + List<String> zones = new ArrayList<String>(selectedZones.length); + for (Object selectedZone : selectedZones) { + zones.add((String)selectedZone); + } + Integer beginYear = (Integer)view.getSelectionDetailsBeginYearField().getSelectedItem(); Integer endYear = (Integer)view.getSelectionDetailsEndYearField().getSelectedItem(); // il est possible que l'evenement fasse suite a une seule des selections if (beginYear != null && endYear != null) { - List<Specy> species = projectService.getProjectSpecies(seletion, beginYear, endYear); + List<Specy> species = projectService.getProjectSpecies(selection, zones, beginYear, endYear); view.getSpecyListModel().setSpecy(species); } }