Author: chatellier Date: 2011-01-19 09:43:05 +0000 (Wed, 19 Jan 2011) New Revision: 527 Log: Ajout d'un pdf de d?\195?\169charge dans le zip de t?\195?\169l?\195?\169chargement des sources. Modified: trunk/coser-business/src/main/java/fr/ifremer/coser/services/WebService.java trunk/coser-business/src/main/resources/ftl/decharge.ftl trunk/coser-business/src/test/java/fr/ifremer/coser/services/WebServiceTest.java trunk/coser-web/src/main/java/fr/ifremer/coser/web/actions/IndexAction.java trunk/coser-web/src/main/java/fr/ifremer/coser/web/actions/UploadResultAction.java 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-19 09:42:39 UTC (rev 526) +++ trunk/coser-business/src/main/java/fr/ifremer/coser/services/WebService.java 2011-01-19 09:43:05 UTC (rev 527) @@ -32,6 +32,7 @@ import java.io.FileInputStream; import java.io.FileOutputStream; import java.io.IOException; +import java.io.InputStream; import java.io.OutputStream; import java.io.StringWriter; import java.io.Writer; @@ -44,11 +45,13 @@ import java.util.List; import java.util.Locale; import java.util.Map; +import java.util.Properties; import java.util.TreeMap; import java.util.regex.Matcher; import org.apache.commons.collections.map.MultiKeyMap; import org.apache.commons.io.FileUtils; +import org.apache.commons.io.IOUtils; import org.apache.commons.lang.StringUtils; import org.apache.commons.logging.Log; import org.apache.commons.logging.LogFactory; @@ -641,12 +644,83 @@ // send notification mails sendNewResultNotifications(); + // update data date + updateDataProperties(); } catch (IOException ex) { throw new CoserBusinessException("Can't uncompress file", ex); } } /** + * Met à jour certaines proprietes apres la mise à jour des données. + * @throws CoserBusinessException + */ + protected void updateDataProperties() throws CoserBusinessException { + + File webProperties = config.getWebPropertiesFile(); + + Properties props = new Properties(); + InputStream iStream = null; + OutputStream oStream = null; + try { + if (webProperties.isFile()) { + iStream = new FileInputStream(webProperties); + props.load(iStream); + } + + props.setProperty("updateDate", String.valueOf(new Date().getTime())); + oStream = new FileOutputStream(webProperties); + props.store(oStream, "Update data"); + } catch (IOException ex) { + throw new CoserBusinessException("Can't save properties file", ex); + } + finally { + IOUtils.closeQuietly(iStream); + IOUtils.closeQuietly(oStream); + } + } + + /** + * Retourne la date de dernière mise à jour des données du site web. + * + * Retourne une date bidon, si pas de dernière mise à jour. + * + * @return last data update date + * @throws CoserBusinessException + */ + public Date getLastDataUpdateDate() throws CoserBusinessException { + Date dataUpdateDate = null; + File webProperties = config.getWebPropertiesFile(); + if (webProperties.isFile()) { + // get update date + Properties props = new Properties(); + InputStream stream = null; + try { + stream = new FileInputStream(webProperties); + props.load(stream); + + if (props.containsKey("updateDate")) { + String date = props.getProperty("updateDate"); + long time = Long.parseLong(date); + dataUpdateDate = new Date(time); + } + + } catch (IOException ex) { + throw new CoserBusinessException("Can't read properties file", ex); + } + finally { + IOUtils.closeQuietly(stream); + } + } + + if (dataUpdateDate == null) { + dataUpdateDate = new Date(0); + } + + return dataUpdateDate; + } + + /** * Recupere dans un repertoire donné, les resultid des resultat (zone / * sous-zone-campagne) * @@ -1486,7 +1560,7 @@ // load project (without data to get original file names) Project project = projectService.openProject(projectFile.getName(), projectsDirectory); - result = generateSourceZip(project, selectionFile); + result = generateSourceZip(project, selectionFile, resultFile, rsufiResult); } } } @@ -1506,10 +1580,12 @@ * * @param project project * @param selectionDirectory selection directory + * @param rsufiResultDirectory rsufi result directory (to get survey name) + * @param rsufiResult rsufi result (to get survey name) * @return generated zip file * @throws CoserBusinessException */ - protected File generateSourceZip(Project project, File selectionDirectory) throws CoserBusinessException { + protected File generateSourceZip(Project project, File selectionDirectory, File rsufiResultDirectory, RSufiResult rsufiResult) throws CoserBusinessException { File resultZip = null; @@ -1517,7 +1593,7 @@ File tempDir = FileUtil.createTempDirectory("coser-", ".tmp"); // pour que l'archive contiennent ce dossier - File archiveDir = new File(tempDir, "coser-sources"); + File archiveDir = new File(tempDir, project.getName()); // recupere les noms originaux des fichiers // de selection et de nom de fichier dans le zip @@ -1536,6 +1612,10 @@ FileUtils.copyFile(new File(selectionDirectory, lengthSeFileName), new File(archiveDir, lengthFileName)); FileUtils.copyFile(new File(selectionDirectory, strataSeFileName), new File(archiveDir, strataFileName)); + // add decharge file + File dechargePDF = generateDechargePDF(rsufiResultDirectory, rsufiResult); + FileUtils.copyFile(dechargePDF, new File(archiveDir, "DechargeDonnees.pdf")); + // make zip resultZip = File.createTempFile("coser-result", ".zip"); ZipUtil.compress(resultZip, archiveDir); @@ -1548,4 +1628,58 @@ return resultZip; } + + /** + * Genere le PDF dynamique de decharge à partir du template freemarker. + * + * @param rsufiResultDirectory rsufi result directory (to get survey name) + * @param rsufiResult rsufi result (to get survey name) + * @return le fichier généré + * @throws CoserBusinessException + */ + protected File generateDechargePDF(File rsufiResultDirectory, RSufiResult rsufiResult) throws CoserBusinessException { + + File result = null; + + try { + + // get some info to put into pdf + Date updateDate = getLastDataUpdateDate(); + String surveyName = projectService.getProjectSurveyName(rsufiResultDirectory, rsufiResult); + + // render freemarker template + Template mapTemplate = freemarkerConfiguration.getTemplate("decharge.ftl"); + + Map<String, Object> root = new HashMap<String, Object>(); + root.put("updateDate", updateDate); + root.put("surveyName", surveyName); + + Writer out = new StringWriter(); + mapTemplate.process(root, out); + out.flush(); + + // get content as w3c document + Document document = CoserUtils.parseDocument(out.toString()); + + // render template output as pdf + result = File.createTempFile("coserpdf", ".pdf"); + result.deleteOnExit(); + OutputStream os = new FileOutputStream(result); + + ITextRenderer renderer = new ITextRenderer(); + renderer.setDocument(document, null); + renderer.layout(); + renderer.createPDF(os); + + os.close(); + } catch (IOException ex) { + throw new CoserBusinessException("Can't generate decharge file", ex); + } catch (TemplateException ex) { + throw new CoserBusinessException("Can't generate decharge file", ex); + } catch (DocumentException ex) { + throw new CoserBusinessException("Can't generate decharge file", ex); + } + + return result; + } } Modified: trunk/coser-business/src/main/resources/ftl/decharge.ftl =================================================================== --- trunk/coser-business/src/main/resources/ftl/decharge.ftl 2011-01-19 09:42:39 UTC (rev 526) +++ trunk/coser-business/src/main/resources/ftl/decharge.ftl 2011-01-19 09:43:05 UTC (rev 527) @@ -1,79 +1,95 @@ -Réaction -======== +<html> + <body> + <h2>Réaction</h2> + <p> Merci d'avoir téléchargé des données de ce site. Si vous avez identifié des problèmes dans ces données, ou souhaitez fournir des remarques pour aider à améliorer le service, vous êtes invités à adresser un courriel à l'administrateur du site (harmonie at ifremer.fr). +</p> -Important -========= -Les données téléchargées sont issues de la série CGFS. - +<h2>Important</h2> +<p> +Les données téléchargées sont issues de la série ${surveyName}. +</p> +<p> Vous êtes invités à consulter les informations relatives à cette série de campagnes... Ce site comprend des informations spécifiques concernant l'usage de ces données, les limitations et les problèmes connus. - +</p> +<p> Vous vous engagez à citer la source de ces données dans tout produit et publication utilisant ces données. En téléchargeant des données à partir du site http://www.ifremer.fr/SIH-indices-campagnes/, vous acceptez les termes et conditions d'usage décrites dans ce document et dans tout document cité dans ce texte. +</p> -Contact -======= +<h2>Contact</h2> +<p> Pour toute question concernant les données téléchargées du site http://www.ifremer.fr/SIH-indices-campagnes/, vous pouvez adresser un courriel à l'administrateur du site (harmonie at ifremer.fr). +</p> -Informations particulières sur les données téléchargées -======================================================= +<h2>Informations particulières sur les données téléchargées</h2> +<p> Les données des campagnes halieutiques de ce site sont mises à libre disposition pour téléchargement. En dépit des soins mis à la préparation de ces données, des défauts inhérents à l'agrégation des informations peuvent persister. -Par exemple : +Par exemple :</p> -* En dépit du fait que toutes les données de toutes les séries de campagnes +<ul> +<li>En dépit du fait que toutes les données de toutes les séries de campagnes soient présentées selon le même format, sauf cas particuliers des différences dans les stratégies d'observation empêchent la combinaison de données de différentes campagnes dans une même analyse. Par exemple, la capturabilité d'une même espèce varie selon le type d'engin d'échantillonnage utilisé. Il en résulte que chaque engin capture un sous-ensemble particulier des - biocénoses échantillonnées. + biocénoses échantillonnées.</li> -* Une propriété commune aux séries d'observations à la mer est l'évolution dans +<li>Une propriété commune aux séries d'observations à la mer est l'évolution dans le temps de la compétence des équipes embarquées pour la détermination des espèces. Il peut en résulter des apparitions, des disparitions ou des assignations sous un même nom de taxons proches dans les jeux de données, non - représentatifs de l'évolution des populations concernées dans l'écosystème. + représentatifs de l'évolution des populations concernées dans l'écosystème.</li> -* Pour les campagnes d'une même série, des changements dans les procédures +<li>Pour les campagnes d'une même série, des changements dans les procédures d'échantillonnage, dans les caractéristiques des engins, dans la période de réalisation de la campagne et la zone couverte peuvent influencer les captures. Pour prévenir les risques de biais dans les analyses en raison de ces facteurs, -les jeux de données doivent être préalablement filtrés adéquatement. +les jeux de données doivent être préalablement filtrés adéquatement.</li> +</ul> +<p> Il est vivement recommandé aux utilisateurs de données de les traiter avec précaution. Si des utilisateurs s'interrogent sur la validité de données, ils sont invités à contacter l'administrateur de la base de données (harmonie at ifremer.fr). +</p> -Citation de l'origine des données -================================= -Ifremer ANNEE. Données des campagnes de surveillance halieutique de l’Ifremer. -http://www.ifremer.fr/SIH-indices-campagnes/ (JOUR MOIS). +<h2>Citation de l'origine des données</h2> -Conditions d'usage des données -============================== -L'Ifremer met les données des campagnes de surveillance halieutique conduites +<p>Ifremer ${updateDate?string("yyyy")}. Données des campagnes de surveillance halieutique de l’Ifremer. +http://www.ifremer.fr/SIH-indices-campagnes/ (${updateDate?string("dd MMMM")}).</p> + +<h2>Conditions d'usage des données</h2> + +<p>L'Ifremer met les données des campagnes de surveillance halieutique conduites par l'institut en libre accès, mais : -- l'interprétation et l'usage approprié de ces données sont de la seule - responsabilité de leurs utilisateurs, -- les utilisateurs des données ne doivent d'aucune façon impliquer l'Ifremer en +<ul> +<li>l'interprétation et l'usage approprié de ces données sont de la seule + responsabilité de leurs utilisateurs,</li> +<li>les utilisateurs des données ne doivent d'aucune façon impliquer l'Ifremer en tant que fournisseur de données dans leurs résultats, conclusions et/ou - recommandations. -- la source des données doit être dûment citée, + recommandations.</li> +<li>la source des données doit être dûment citée, - les utilisateurs de données doivent respecter toutes les restrictions d'usage et de reproduction des données, incluant les restrictions pour un - usage commercial, -- les utilisateurs des données doivent informer l'Ifremer de tout problème - soupçonné dans les données. + usage commercial,</li> +<li>les utilisateurs des données doivent informer l'Ifremer de tout problème + soupçonné dans les données.</li> +</ul> +</p> +</body> +</html> \ No newline at end of file Modified: trunk/coser-business/src/test/java/fr/ifremer/coser/services/WebServiceTest.java =================================================================== --- trunk/coser-business/src/test/java/fr/ifremer/coser/services/WebServiceTest.java 2011-01-19 09:42:39 UTC (rev 526) +++ trunk/coser-business/src/test/java/fr/ifremer/coser/services/WebServiceTest.java 2011-01-19 09:43:05 UTC (rev 527) @@ -166,4 +166,18 @@ File file = webService.getMapFileAsPDF("Medits", "SPECIES1"); Assert.assertNotNull(file); } + + /** + * Test la simulation d'un téléchargement de données sources d'un projet. + * + * Generation du zip, freemarker, et pdf. + * + * @throws CoserBusinessException + */ + @Test + public void testGetSourceZip() throws CoserBusinessException { + registerUploadedResult("/web/upload2.zip"); + File file = webService.getSourceZip("testzone1", "fr"); + Assert.assertNotNull(file); + } } Modified: trunk/coser-web/src/main/java/fr/ifremer/coser/web/actions/IndexAction.java =================================================================== --- trunk/coser-web/src/main/java/fr/ifremer/coser/web/actions/IndexAction.java 2011-01-19 09:42:39 UTC (rev 526) +++ trunk/coser-web/src/main/java/fr/ifremer/coser/web/actions/IndexAction.java 2011-01-19 09:43:05 UTC (rev 527) @@ -36,6 +36,8 @@ import com.opensymphony.xwork2.ActionSupport; +import fr.ifremer.coser.CoserBusinessException; +import fr.ifremer.coser.services.WebService; import fr.ifremer.coser.web.CoserWebConfig; import fr.ifremer.coser.web.CoserWebException; import fr.ifremer.coser.web.ServiceFactory; @@ -79,35 +81,14 @@ @Override public String execute() { - - CoserWebConfig config = ServiceFactory.getCoserConfig(); - File webProperties = config.getWebPropertiesFile(); - if (webProperties.isFile()) { - // get update date - Properties props = new Properties(); - InputStream stream = null; - try { - stream = new FileInputStream(webProperties); - props.load(stream); - - if (props.containsKey("updateDate")) { - String date = props.getProperty("updateDate"); - long time = Long.parseLong(date); - dataUpdateDate = new Date(time); - } - - } catch (IOException ex) { - throw new CoserWebException("Can't save properties file", ex); - } - finally { - IOUtils.closeQuietly(stream); - } + WebService webService = ServiceFactory.getWebService(); + + try { + dataUpdateDate = webService.getLastDataUpdateDate(); + } catch (CoserBusinessException ex) { + throw new CoserWebException("Can't get last update date", ex); } - - if (dataUpdateDate == null) { - dataUpdateDate = new Date(0); - } return SUCCESS; } Modified: trunk/coser-web/src/main/java/fr/ifremer/coser/web/actions/UploadResultAction.java =================================================================== --- trunk/coser-web/src/main/java/fr/ifremer/coser/web/actions/UploadResultAction.java 2011-01-19 09:42:39 UTC (rev 526) +++ trunk/coser-web/src/main/java/fr/ifremer/coser/web/actions/UploadResultAction.java 2011-01-19 09:43:05 UTC (rev 527) @@ -23,17 +23,9 @@ package fr.ifremer.coser.web.actions; import java.io.File; -import java.io.FileInputStream; -import java.io.FileOutputStream; -import java.io.IOException; -import java.io.InputStream; -import java.io.OutputStream; -import java.util.Date; -import java.util.Properties; import javax.servlet.http.HttpServletResponse; -import org.apache.commons.io.IOUtils; import org.apache.commons.logging.Log; import org.apache.commons.logging.LogFactory; import org.apache.struts2.ServletActionContext; @@ -112,8 +104,6 @@ WebService webService = ServiceFactory.getWebService(); try { webService.registerNewUploadedResults(resultFile); - - updateDataProperties(); } catch (CoserBusinessException ex) { throw new CoserWebException("Can't register new result file", ex); } @@ -136,33 +126,4 @@ return INPUT; } - - /** - * Met à jour certaines proprietes apres la mise à jour des données. - */ - protected void updateDataProperties() { - - CoserWebConfig config = ServiceFactory.getCoserConfig(); - File webProperties = config.getWebPropertiesFile(); - - Properties props = new Properties(); - InputStream iStream = null; - OutputStream oStream = null; - try { - if (webProperties.isFile()) { - iStream = new FileInputStream(webProperties); - props.load(iStream); - } - - props.setProperty("updateDate", String.valueOf(new Date().getTime())); - oStream = new FileOutputStream(webProperties); - props.store(oStream, "Update data"); - } catch (IOException ex) { - throw new CoserWebException("Can't save properties file", ex); - } - finally { - IOUtils.closeQuietly(iStream); - IOUtils.closeQuietly(oStream); - } - } }