Author: chatellier Date: 2011-01-24 17:08:51 +0000 (Mon, 24 Jan 2011) New Revision: 556 Log: Manage graph units and graph scale * 1000, * 1000000 Modified: trunk/coser-business/src/main/java/fr/ifremer/coser/services/PublicationService.java trunk/coser-business/src/main/java/fr/ifremer/coser/services/WebService.java Modified: trunk/coser-business/src/main/java/fr/ifremer/coser/services/PublicationService.java =================================================================== --- trunk/coser-business/src/main/java/fr/ifremer/coser/services/PublicationService.java 2011-01-24 17:07:12 UTC (rev 555) +++ trunk/coser-business/src/main/java/fr/ifremer/coser/services/PublicationService.java 2011-01-24 17:08:51 UTC (rev 556) @@ -5,7 +5,7 @@ * $Id$ * $HeadURL$ * %% - * Copyright (C) 2010 Codelutin, Chatellier Eric + * Copyright (C) 2010 - 2011 Ifremer, Codelutin, Chatellier Eric * %% * This program is free software: you can redistribute it and/or modify * it under the terms of the GNU Lesser General Public License as @@ -27,6 +27,7 @@ import static org.nuiton.i18n.I18n._; +import java.awt.Color; import java.awt.Shape; import java.io.File; import java.io.IOException; @@ -657,11 +658,12 @@ * @param rsufiResult rsufiresult * @param indicator indicator * @param indicatorName indicatorName localized + * @param unit data unit * @return generated graph image (temp file) * @throws CoserBusinessException */ public File getRsufiResultComChart(Project project, File resultDirectory, - RSufiResult rsufiResult, String indicator, String indicatorName) throws CoserBusinessException { + RSufiResult rsufiResult, String indicator, String indicatorName, String unit) throws CoserBusinessException { File result = null; @@ -675,6 +677,7 @@ // Campagne Indicateur Liste Strate Annee Estimation EcartType CV DataStorage dataStorage = importService.loadCSVFile(estComIndFile, CoserConstants.CSV_RESULT_SEPARATOR_CHAR); + int multiplicator = 1; int minYear = Integer.MAX_VALUE; int maxYear = Integer.MIN_VALUE; Map<Integer, Double[]> graphData = new HashMap<Integer, Double[]>(); @@ -695,6 +698,15 @@ maxYear = year; } graphData.put(year, new Double[]{estimation, ecart}); + + // si les données sont énormes, on affiche les données + // / multiplicator et on le mentionne dans la légende + if (estimation > 1e9) { + multiplicator = 1000000; + } + if (estimation > 1e6 && multiplicator < 1000000) { + multiplicator = 1000; + } } } @@ -703,7 +715,9 @@ for (int indexYear = minYear ; indexYear <= maxYear ; ++indexYear) { Double[] entry = graphData.get(indexYear); if (entry != null) { - statisticalDataset.add(entry[0], entry[1], "Serie1", (Comparable)indexYear); + Double estimation = entry[0] / multiplicator; + Double ecart = entry[1] / multiplicator; + statisticalDataset.add(estimation, ecart, "Serie1", (Comparable)indexYear); } else { statisticalDataset.add(null, null, "Serie1", (Comparable)indexYear); @@ -715,7 +729,15 @@ categoryAxis.setCategoryMargin(0); categoryAxis.setCategoryLabelPositions(CategoryLabelPositions.UP_90); // label horizontaux - ValueAxis valueAxis = new NumberAxis(indicatorName); + String legendY = indicatorName; + if (multiplicator != 1) { + // affiche par exemple : cm * 1000 + legendY += " (" + unit + "*" + multiplicator + ")"; + } + else if (StringUtils.isNotEmpty(unit)) { + legendY += " (" + unit + ")"; + } + ValueAxis valueAxis = new NumberAxis(legendY); valueAxis.setUpperMargin(0.1); CategoryItemRenderer renderer = new StatisticalLineAndShapeRenderer(false, true); @@ -732,6 +754,8 @@ // remove series legend chart.removeLegend(); + // white background + chart.setBackgroundPaint(Color.WHITE); try { result = File.createTempFile("coser-", ".chart"); @@ -753,11 +777,12 @@ * @param species species * @param indicator indicator * @param indicatorName indicatorName localized + * @param unit data unit * @return generated image file (temp file) * @throws CoserBusinessException */ public File getRsufiResultPopChart(Project project, File resultDirectory, - RSufiResult rsufiResult, String species, String indicator, String indicatorName) throws CoserBusinessException { + RSufiResult rsufiResult, String species, String indicator, String indicatorName, String unit) throws CoserBusinessException { File result = null; @@ -772,6 +797,7 @@ // Campagne Indicateur Liste Species Strate Annee Estimation EcartType CV DataStorage dataStorage = importService.loadCSVFile(estPopIndFile, CoserConstants.CSV_RESULT_SEPARATOR_CHAR); + int multiplicator = 1; int minYear = Integer.MAX_VALUE; int maxYear = Integer.MIN_VALUE; Map<Integer, Double[]> graphData = new HashMap<Integer, Double[]>(); @@ -793,6 +819,15 @@ maxYear = year; } graphData.put(year, new Double[]{estimation, ecart}); + + // si les données sont énormes, on affiche les données + // / multiplicator et on le mentionne dans la légende + if (estimation > 1e9) { + multiplicator = 1000000; + } + if (estimation > 1e6 && multiplicator < 1000000) { + multiplicator = 1000; + } } } @@ -801,7 +836,9 @@ for (int indexYear = minYear ; indexYear <= maxYear ; ++indexYear) { Double[] entry = graphData.get(indexYear); if (entry != null) { - statisticalDataset.add(entry[0], entry[1], "Serie1", (Comparable)indexYear); + Double estimation = entry[0] / multiplicator; + Double ecart = entry[1] / multiplicator; + statisticalDataset.add(estimation, ecart, "Serie1", (Comparable)indexYear); } else { statisticalDataset.add(null, null, "Serie1", (Comparable)indexYear); @@ -813,7 +850,15 @@ categoryAxis.setCategoryMargin(0); categoryAxis.setCategoryLabelPositions(CategoryLabelPositions.UP_90); // label horizontaux - ValueAxis valueAxis = new NumberAxis(indicatorName); + String legendY = indicatorName; + if (multiplicator != 1) { + // affiche par exemple : cm * 1000 + legendY += " (" + unit + "*" + multiplicator + ")"; + } + else if (StringUtils.isNotEmpty(unit)) { + legendY += " (" + unit + ")"; + } + ValueAxis valueAxis = new NumberAxis(legendY); valueAxis.setUpperMargin(0.1); CategoryItemRenderer renderer = new StatisticalLineAndShapeRenderer(false, true); @@ -830,6 +875,8 @@ // remove series legend chart.removeLegend(); + // white background + chart.setBackgroundPaint(Color.WHITE); try { result = File.createTempFile("coser-", ".chart"); Modified: trunk/coser-business/src/main/java/fr/ifremer/coser/services/WebService.java =================================================================== --- trunk/coser-business/src/main/java/fr/ifremer/coser/services/WebService.java 2011-01-24 17:07:12 UTC (rev 555) +++ trunk/coser-business/src/main/java/fr/ifremer/coser/services/WebService.java 2011-01-24 17:08:51 UTC (rev 556) @@ -126,7 +126,7 @@ protected PublicationService publicationService; - /** Indicator map (id, locale > translation) (etat du service). */ + /** Indicator map (id, locale > translation, id, "unit" > unit) (etat du service). */ protected MultiKeyMap indicatorsMap; /** Zones map (etat du service). */ @@ -171,10 +171,11 @@ DataStorage indicatorsStorage = importService.loadCSVFile(indicatorsFile); Iterator<String[]> iteratorInd = indicatorsStorage.iterator(true); while (iteratorInd.hasNext()) { - // "id";"label_fr";"label_en" + // "id";"label_fr";"label_en";"unit" String[] indicator = iteratorInd.next(); indicatorsMap.put(indicator[0], "fr", indicator[1]); indicatorsMap.put(indicator[0], "en", indicator[2]); + indicatorsMap.put(indicator[0], "unit", indicator[3]); } } @@ -615,13 +616,13 @@ || currentPathName.startsWith(resultPath); // cas ou les données sources ne doivent pas être exporter - // condition sur les nom de fichier ? + // condition sur les noms de fichiers ? if (!exportWithData) { String fileName = pathname.getName(); - // on exclu tout les fichiers qui commence - // par les meme nom de fichier que ceux du projet - // (les noms de fichier sont personnalisable) + // on exclu tout les fichiers qui commencent + // par les memes noms de fichiers que ceux du projet + // (les noms de fichiers sont personnalisables) for (Category category : Category.values()) { if (category.isDataCategory()) { String sourceFileName = projectService.getDataStorageFileName(project, category, null); @@ -649,8 +650,8 @@ * Le nouveau fichier uploadé est mergé avec l'ancien, c'est à dire: * <ul> * <li>dezipage dans un fichier temporaire - * <li>recuperation des noms de zones des nouveau fichiers - * <li>suppression dans l'ancien répertoire des resultats deja presents dans le nouveau (pour les conflits zone-type : map/non map) + * <li>recuperation des noms de zones des nouveau fichiers (par type, carte/indicateur) + * <li>suppression dans l'ancien répertoire des resultats deja presents dans le nouveau (pour les conflits zone) * <li>suppression des selections vides * <li>suppression des projets vides * <li>copie (avec ecrasement) des nouveaux fichiers dans l'ancien répertoire @@ -662,21 +663,31 @@ public void registerNewUploadedResults(File archiveFile) throws CoserBusinessException { try { - File projectsDirectory = config.getWebProjectsDirectory(); // dezipage dans un fichier temporaire File tempDirectory = FileUtil.createTempDirectory("coser", ".tmp"); ZipUtil.uncompress(archiveFile, tempDirectory); - // recuperation des noms zone/souszone-campagne des nouveau fichiers - List<String> newResultIds = getResultIds(tempDirectory); + File projectsDirectory = config.getWebIndicatorsProjectsDirectory(); + // recuperation des noms zone des nouveau fichiers + List<String> indicatorsResultZoneIds = getZonesIds(tempDirectory, false); + // suppression dans l'ancien répertoire des resultat deja present + // dans le nouveau (pour les conflits) + cleanCurrentProjectDirectory(projectsDirectory, indicatorsResultZoneIds); + // copie (avec ecrasement) des nouveaux fichiers dans l'ancien répertoire + FileUtils.copyDirectory(tempDirectory, projectsDirectory); + + File mapsDirectory = config.getWebMapsProjectsDirectory(); + // recuperation des noms zone des nouveau fichiers + List<String> mapsResultZoneIds = getZonesIds(tempDirectory, true); // suppression dans l'ancien répertoire des resultat deja present // dans le nouveau (pour les conflits) - cleanCurrentProjectDirectory(projectsDirectory, newResultIds); + cleanCurrentProjectDirectory(mapsDirectory, mapsResultZoneIds); + // copie (avec ecrasement) des nouveaux fichiers dans l'ancien répertoire + FileUtils.copyDirectory(tempDirectory, mapsDirectory); - // copie (avec ecrasement) des nouveaux fichiers dans l'ancien répertoire - FileUtils.copyDirectory(tempDirectory, projectsDirectory); + FileUtils.deleteDirectory(tempDirectory); if (log.isInfoEnabled()) { @@ -763,14 +774,14 @@ } /** - * Recupere dans un repertoire donné, les resultid des resultat (zone / - * sous-zone-campagne) + * Recupere dans un repertoire donné, les zoneid des resultat. * * @param scanDirectory le repertoire a scanner + * @param mapResults if true get only map result (otherwise, get indicator results) * @return la liste des resultid * @throws CoserBusinessException */ - protected List<String> getResultIds(File scanDirectory) throws CoserBusinessException { + protected List<String> getZonesIds(File scanDirectory, boolean mapResults) throws CoserBusinessException { List<String> resultIds = new ArrayList<String>(); File[] projectFiles = scanDirectory.listFiles(); @@ -790,9 +801,14 @@ for (File resultFile : resultFiles) { if (resultFile.isDirectory()) { RSufiResult rsufiResult = projectService.getRSufiResult(resultFile); - String resultResultId = rsufiResult.getZone(); - if (StringUtils.isNotBlank(resultResultId)) { - resultIds.add(resultResultId); + + // return result depending on result type + if ( (mapResults && rsufiResult.isMapsResult()) || + (!mapResults && rsufiResult.isIndicatorsResult())) { + String resultResultId = rsufiResult.getZone(); + if (StringUtils.isNotBlank(resultResultId)) { + resultIds.add(resultResultId); + } } } } @@ -943,7 +959,7 @@ } // get survey names in subZones collection - File[] projectFiles = config.getWebProjectsDirectory().listFiles(); + File[] projectFiles = config.getWebIndicatorsProjectsDirectory().listFiles(); // project iteration if (projectFiles != null) { @@ -1065,7 +1081,7 @@ Map<String, String> result = new TreeMap<String, String>(); // parcours des resultats disponibles - File projectsDirectory = config.getWebProjectsDirectory(); + File projectsDirectory = config.getWebIndicatorsProjectsDirectory(); File[] projectFiles = projectsDirectory.listFiles(); if (projectFiles != null) { for (File projectFile : projectFiles) { @@ -1123,7 +1139,7 @@ Map<String, String> result = new TreeMap<String, String>(); // parcours des resultats disponibles - File projectsDirectory = config.getWebProjectsDirectory(); + File projectsDirectory = config.getWebMapsProjectsDirectory(); File[] projectFiles = projectsDirectory.listFiles(); if (projectFiles != null) { for (File projectFile : projectFiles) { @@ -1245,7 +1261,7 @@ Map<String, String> indicators = new TreeMap<String, String>(); // parcours des resultats disponibles - File projectsDirectory = config.getWebProjectsDirectory(); + File projectsDirectory = config.getWebIndicatorsProjectsDirectory(); File[] projectFiles = projectsDirectory.listFiles(); if (projectFiles != null) { for (File projectFile : projectFiles) { @@ -1388,7 +1404,7 @@ File result = null; // parcours des resultats disponibles - File projectsDirectory = config.getWebProjectsDirectory(); + File projectsDirectory = config.getWebIndicatorsProjectsDirectory(); File[] projectFiles = projectsDirectory.listFiles(); if (projectFiles != null) { for (File projectFile : projectFiles) { @@ -1415,14 +1431,15 @@ // load project (without data to get reftax data) Project project = projectService.openProject(projectFile.getName(), projectsDirectory); String indicatorName = (String)getIndicatorsMap().get(indicator, locale); + String unit = (String)getIndicatorsMap().get(indicator, "unit"); if (species == null) { // title = surveyName - indicateur - result = publicationService.getRsufiResultComChart(project, resultFile, rsufiResult, indicator, indicatorName); + result = publicationService.getRsufiResultComChart(project, resultFile, rsufiResult, indicator, indicatorName, unit); } else { // title = surveyName - indicateur - species - result = publicationService.getRsufiResultPopChart(project, resultFile, rsufiResult, species, indicator, indicatorName); + result = publicationService.getRsufiResultPopChart(project, resultFile, rsufiResult, species, indicator, indicatorName, unit); } break; } @@ -1454,7 +1471,7 @@ File result = null; // parcours des resultats disponibles - File projectsDirectory = config.getWebProjectsDirectory(); + File projectsDirectory = config.getWebIndicatorsProjectsDirectory(); File[] projectFiles = projectsDirectory.listFiles(); if (projectFiles != null) { for (File projectFile : projectFiles) { @@ -1486,7 +1503,7 @@ //les calculs des indicateurs de communautés // load project (without data to get reftax data) Project project = projectService.openProject(projectFile.getName(), projectsDirectory); - File metaFile = generateMetaFilePDF(project, resultFile, rsufiResult, indicator, locale); + //File metaFile = generateMetaFilePDF(project, resultFile, rsufiResult, indicator, locale); } else { // title = surveyName - indicateur - species @@ -1511,8 +1528,11 @@ * Recupere le fichier image de la carte demandées en fonction de la zone * et de l'espece. * + * Retourne également la repartition globale sur la zone si le nom de + * l'espece est {@code null}. + * * @param survey survey (surveyid) - * @param species + * @param species species or (null to get <survey>_Repartition-stations.png map file) * @return map file * @throws CoserBusinessException */ @@ -1521,7 +1541,7 @@ File result = null; // parcours des resultats disponibles - File projectsDirectory = config.getWebProjectsDirectory(); + File projectsDirectory = config.getWebMapsProjectsDirectory(); File[] projectFiles = projectsDirectory.listFiles(); if (projectFiles != null) { for (File projectFile : projectFiles) { @@ -1562,8 +1582,15 @@ if (zoneRSufiResult) { // get survey name (other condition) String surveyName = projectService.getProjectSurveyName(resultFile, rsufiResult); - - String mapName = surveyName + "_" + species.toUpperCase() + ".png"; + + String mapName = null; + if (species != null) { + mapName = surveyName + "_" + species.toUpperCase() + ".png"; + } + else { + mapName = surveyName + "_Repartition-stations.png"; + } + File mapsDirectory = new File(resultFile, CoserConstants.STORAGE_MAPS_DIRECTORY); result = new File(mapsDirectory, mapName); } @@ -1577,7 +1604,7 @@ } } } - + return result; } @@ -1649,7 +1676,7 @@ File result = null; // parcours des resultats disponibles - File projectsDirectory = config.getWebProjectsDirectory(); + File projectsDirectory = config.getWebIndicatorsProjectsDirectory(); File[] projectFiles = projectsDirectory.listFiles(); if (projectFiles != null) { for (File projectFile : projectFiles) {