[Suiviobsmer-commits] r311 - in trunk: . suiviobsmer-business/src/main/java/fr/ifremer/suiviobsmer suiviobsmer-business/src/main/java/fr/ifremer/suiviobsmer/impl suiviobsmer-business/src/main/xmi suiviobsmer-ui/src/main/java/fr/ifremer/suiviobsmer/ui/data suiviobsmer-ui/src/main/java/fr/ifremer/suiviobsmer/ui/pages suiviobsmer-ui/src/main/webapp
Author: fdesbois Date: 2010-02-02 14:57:05 +0000 (Tue, 02 Feb 2010) New Revision: 311 Added: trunk/suiviobsmer-ui/src/main/java/fr/ifremer/suiviobsmer/ui/data/ExportStreamResponse.java Modified: trunk/changelog.txt trunk/suiviobsmer-business/src/main/java/fr/ifremer/suiviobsmer/ImportHelper.java trunk/suiviobsmer-business/src/main/java/fr/ifremer/suiviobsmer/impl/ServiceBoatImpl.java trunk/suiviobsmer-business/src/main/xmi/suiviobsmer.zargo trunk/suiviobsmer-ui/src/main/java/fr/ifremer/suiviobsmer/ui/pages/Boats.java trunk/suiviobsmer-ui/src/main/java/fr/ifremer/suiviobsmer/ui/pages/Contacts.java trunk/suiviobsmer-ui/src/main/webapp/Boats.tml Log: Evo #2077 : CSV export for boats filtered. Modified: trunk/changelog.txt =================================================================== --- trunk/changelog.txt 2010-02-01 19:57:10 UTC (rev 310) +++ trunk/changelog.txt 2010-02-02 14:57:05 UTC (rev 311) @@ -1,6 +1,17 @@ Release note ============ +1.0.0 +----- + +Evolutions +++++++++++ + +- [fdesbois] Evo #2077 : Export CSV des navires sélectionnés + +Anomalies ++++++++++ + 0.4.0 ----- Modified: trunk/suiviobsmer-business/src/main/java/fr/ifremer/suiviobsmer/ImportHelper.java =================================================================== --- trunk/suiviobsmer-business/src/main/java/fr/ifremer/suiviobsmer/ImportHelper.java 2010-02-01 19:57:10 UTC (rev 310) +++ trunk/suiviobsmer-business/src/main/java/fr/ifremer/suiviobsmer/ImportHelper.java 2010-02-02 14:57:05 UTC (rev 311) @@ -68,15 +68,15 @@ */ public enum BOAT implements ImportHeader { /** Boat immatriculation **/ - NAVS_COD(20), + NAVS_COD(1, 20), /** Boat name **/ - CARN_NOM(21), + CARN_NOM(2, 21), /** Boat length **/ - CARN_LONGUEUR_HT, + CARN_LONGUEUR_HT(3), /** Boat build year **/ - CARN_ANNEE, + CARN_ANNEE(4), /** Boat district code **/ - QUARTIER_IMMA(22), + QUARTIER_IMMA(5, 22), /** ShipOwner code **/ PER_COD, /** ShipOwner last name **/ @@ -84,16 +84,36 @@ /** ShipOwner first name **/ PER_PRENOM, /** Boat active **/ - NAVS_ACTIVE; + NAVS_ACTIVE(0), + /** BoatInfos contactFirstName **/ + CONT_PRENOM(6), + /** BoatInfos contactLastName **/ + CONT_NOM(7), + /** BoatInfos contactEmail **/ + CONT_EMAIL(8), + /** BoatInfos contactPhoneNumber **/ + CONT_TEL(9), + /** BoatInfos dup **/ + NAVS_DUP(10), + /** BoatInfos comment **/ + NAVS_COMMENT(11); int contactHeader; - BOAT(int index) { - this.contactHeader = index; + int boatHeader; + + BOAT(int indexBoat, int indexContact) { + contactHeader = indexContact; + boatHeader = indexBoat; } + BOAT(int indexBoat) { + boatHeader = indexBoat; + } + BOAT() { - this.contactHeader = -1; + contactHeader = -1; + boatHeader = -1; } @Override @@ -101,6 +121,10 @@ return contactHeader; } + public int forBoatCsv() { + return boatHeader; + } + @Override public String datePattern() { return null; @@ -300,6 +324,10 @@ public static int CONTACT_NB_HEADERS = 33; + public static int BOAT_NB_HEADERS = 12; + + public static String BOAT_INACTIVE_CODE = "I"; + public static String getHeaderForContactCsv(int index) { for (BOAT boatEnum : BOAT.values()) { if (boatEnum.forContactCsv() == index) { @@ -324,6 +352,15 @@ return ""; } + public static String getHeaderForBoatCsv(int index) { + for (BOAT boatEnum : BOAT.values()) { + if (boatEnum.forBoatCsv() == index) { + return boatEnum.name(); + } + } + return ""; + } + public static String formatContactValidation(Boolean validation) { String valid = ""; if (validation == null) { Modified: trunk/suiviobsmer-business/src/main/java/fr/ifremer/suiviobsmer/impl/ServiceBoatImpl.java =================================================================== --- trunk/suiviobsmer-business/src/main/java/fr/ifremer/suiviobsmer/impl/ServiceBoatImpl.java 2010-02-01 19:57:10 UTC (rev 310) +++ trunk/suiviobsmer-business/src/main/java/fr/ifremer/suiviobsmer/impl/ServiceBoatImpl.java 2010-02-02 14:57:05 UTC (rev 311) @@ -22,6 +22,7 @@ package fr.ifremer.suiviobsmer.impl; import com.csvreader.CsvReader; +import com.csvreader.CsvWriter; import fr.ifremer.suiviobsmer.ImportHelper; import fr.ifremer.suiviobsmer.ImportHelper.BOAT; import fr.ifremer.suiviobsmer.SuiviObsmerBusinessException; @@ -40,11 +41,10 @@ import java.io.File; import java.io.FileInputStream; import java.io.FileNotFoundException; +import java.io.FileOutputStream; import java.io.IOException; import java.io.InputStream; import java.nio.charset.Charset; -import java.text.DateFormat; -import java.text.SimpleDateFormat; import java.util.ArrayList; import java.util.HashMap; import java.util.List; @@ -395,7 +395,7 @@ String shipOwnerFirstName = ImportHelper.read(reader, BOAT.PER_PRENOM); //String activeStr = reader.get(BOAT.NAVS_ACTIVE.name()).trim(); String activeStr = ImportHelper.read(reader, BOAT.NAVS_ACTIVE); - boolean active = !activeStr.equals("I"); + boolean active = !activeStr.equals(ImportHelper.BOAT_INACTIVE_CODE); if (log.isDebugEnabled()) { log.debug("Active : " + active + " (" + activeStr + ")"); @@ -468,6 +468,86 @@ } @Override + public InputStream exportBoatCsv(BoatFilter filter) throws SuiviObsmerException { + TopiaContext transaction = null; + InputStream result = null; + CsvWriter writer = null; + try { + transaction = rootContext.beginTransaction(); + + File file = File.createTempFile("wao-boats-", ".csv"); + file.deleteOnExit(); + + FileOutputStream output = new FileOutputStream(file); + writer = new CsvWriter(output, ',', Charset.forName("UTF-8")); + + // Headers + for (int i = 0; i < ImportHelper.BOAT_NB_HEADERS; i++) { + String header = ImportHelper.getHeaderForBoatCsv(i); + if (log.isDebugEnabled()) { + log.debug("header : " + header); + } + writer.write(header); + } + writer.endRecord(); + + // Get boats from database filterd by filter in argument + BoatDAO dao = SuiviObsmerModelDAOHelper.getBoatDAO(transaction); + TopiaQuery<Boat> query = dao.createQuery("B"); + query = filter.prepareQueryForBoat(query, "B"); + + // Reset limit : no pagination needed for results + List<Boat> boats = query.resetLimit().executeToEntityList(); + + int curr = 0; + for (Boat boat : boats) { + curr++; + String[] record = new String[ImportHelper.BOAT_NB_HEADERS]; + + if (log.isDebugEnabled()) { + log.debug("add boat : " + boat.getName() + " (" + boat.getImmatriculation() + ")"); + } + + record[BOAT.NAVS_COD.forBoatCsv()] = String.valueOf(boat.getImmatriculation()); + record[BOAT.CARN_NOM.forBoatCsv()] = boat.getName(); + record[BOAT.CARN_LONGUEUR_HT.forBoatCsv()] = String.valueOf(boat.getBoatLength()); + record[BOAT.CARN_ANNEE.forBoatCsv()] = String.valueOf(boat.getBuildYear()); + record[BOAT.QUARTIER_IMMA.forBoatCsv()] = boat.getDistrictCode(); + record[BOAT.NAVS_ACTIVE.forBoatCsv()] = !boat.getActive() ? + ImportHelper.BOAT_INACTIVE_CODE : ""; + + + if (filter.getCompany() != null) { + BoatInfos boatInfos = boat.getCompanyBoatInfos(filter.getCompany()); + + if (boatInfos != null) { + record[BOAT.CONT_PRENOM.forBoatCsv()] = boatInfos.getContactFirstName(); + record[BOAT.CONT_NOM.forBoatCsv()] = boatInfos.getContactLastName(); + record[BOAT.CONT_EMAIL.forBoatCsv()] = boatInfos.getContactEmail(); + record[BOAT.CONT_TEL.forBoatCsv()] = boatInfos.getContactPhoneNumber(); + record[BOAT.NAVS_DUP.forBoatCsv()] = String.valueOf(boatInfos.getDup()); + record[BOAT.NAVS_COMMENT.forBoatCsv()] = boatInfos.getComment(); + } + } + + writer.writeRecord(record); + writer.flush(); + } + result = new FileInputStream(file); + + transaction.closeContext(); + } catch (Exception eee) { + SuiviObsmerContext.serviceException(transaction, + "Impossible d'exporter les navires sélectionnés", eee); + } finally { + if (writer != null) { + writer.close(); + } + } + return result; + } + + @Override public void importActivityCalendarCsv(InputStream input) throws SuiviObsmerException { if (!SuiviObsmerContext.isActivityCalendarImportRun()) { try { @@ -490,14 +570,14 @@ ActivityCalendarDAO dao = SuiviObsmerModelDAOHelper.getActivityCalendarDAO(transaction); TopiaQuery<ActivityCalendar> query = dao.createQuery("A"). - add("A.boat", boat); + add("A." + ActivityCalendar.BOAT, boat); TopiaQuery<ActivityCalendar> subquery = dao.createQuery("B"). - setSelect("MAX(B.year)"). - add("B.boat = A.boat"). - addGroup("B.boat"); + setSelect("MAX(B." + ActivityCalendar.YEAR + ")"). + add("B." + ActivityCalendar.BOAT + " = A." + ActivityCalendar.BOAT). + addGroup("B." + ActivityCalendar.BOAT); - query.add("A.year = (" + subquery.fullQuery() + ")"); + query.add("A." + ActivityCalendar.YEAR + " = (" + subquery.fullQuery() + ")"); query.addLoad(ActivityCalendar.BOAT); result = query.executeToEntity(transaction); @@ -505,15 +585,15 @@ // load other complex data from collections List<ActivityMonth> months = result.getActivityMonth(); for (ActivityMonth month : months) { -// if (month.getActive()) { - List<ActivityProfession> professions = month.getActivityProfession(); - for (ActivityProfession profession : professions) { - List<ActivityZone> zones = profession.getActivityZone(); - zones.size(); - } -// } + List<ActivityProfession> professions = month.getActivityProfession(); + for (ActivityProfession profession : professions) { + List<ActivityZone> zones = profession.getActivityZone(); + zones.size(); + } } + // TODO-EVO#1964 : Create logging, need user in argument + transaction.closeContext(); } catch (Exception eee) { SuiviObsmerContext.serviceException(transaction, Modified: trunk/suiviobsmer-business/src/main/xmi/suiviobsmer.zargo =================================================================== (Binary files differ) Added: trunk/suiviobsmer-ui/src/main/java/fr/ifremer/suiviobsmer/ui/data/ExportStreamResponse.java =================================================================== --- trunk/suiviobsmer-ui/src/main/java/fr/ifremer/suiviobsmer/ui/data/ExportStreamResponse.java (rev 0) +++ trunk/suiviobsmer-ui/src/main/java/fr/ifremer/suiviobsmer/ui/data/ExportStreamResponse.java 2010-02-02 14:57:05 UTC (rev 311) @@ -0,0 +1,57 @@ + +package fr.ifremer.suiviobsmer.ui.data; + +import fr.ifremer.suiviobsmer.SuiviObsmerContext; +import java.util.Date; +import org.apache.tapestry5.StreamResponse; +import org.apache.tapestry5.services.Response; +import org.nuiton.util.DateUtils; + +/** + * Used to render CSV file from data export. + * + * Created: 2 févr. 2010 + * + * @author fdesbois + * @version $Revision$ + * + * Mise a jour: $Date$ + * par : $Author$ + */ +public abstract class ExportStreamResponse implements StreamResponse { + + protected String filename; + + /** + * Constructor with filename prefix for resulting file in response. + * + * @param filename prefix + */ + public ExportStreamResponse(String filename) { + this.filename = filename; + } + + /** + * Export only for CSV file with UTF-8 encoding. + * + * @return the contentType string + */ + @Override + public String getContentType() { + return "text/csv;charset=utf-8"; + } + + /** + * Prepare response for rendering result file with date in filename. + * + * @param response to prepare + */ + @Override + public void prepareResponse(Response response) { + Date current = SuiviObsmerContext.getCurrentDate(); + filename += "-" + DateUtils.formatDate(current, "dd-MM-yyyy") + ".csv"; + response.setHeader("Content-Disposition", + "attachment; filename=\"" + filename +"\""); + } + +} Property changes on: trunk/suiviobsmer-ui/src/main/java/fr/ifremer/suiviobsmer/ui/data/ExportStreamResponse.java ___________________________________________________________________ Added: svn:keywords + "Author Date Id Revision HeadURL" Modified: trunk/suiviobsmer-ui/src/main/java/fr/ifremer/suiviobsmer/ui/pages/Boats.java =================================================================== --- trunk/suiviobsmer-ui/src/main/java/fr/ifremer/suiviobsmer/ui/pages/Boats.java 2010-02-01 19:57:10 UTC (rev 310) +++ trunk/suiviobsmer-ui/src/main/java/fr/ifremer/suiviobsmer/ui/pages/Boats.java 2010-02-02 14:57:05 UTC (rev 311) @@ -45,6 +45,7 @@ import fr.ifremer.suiviobsmer.ui.components.FeedBack; import fr.ifremer.suiviobsmer.ui.components.Layout; import fr.ifremer.suiviobsmer.ui.data.BoatDataSource; +import fr.ifremer.suiviobsmer.ui.data.ExportStreamResponse; import java.io.FileNotFoundException; import java.io.IOException; import java.io.InputStream; @@ -405,11 +406,6 @@ @Persist private BoatDataSource boats; - /** Selected boat immatriculation for showing boatInfos */ -// @Property -// @Persist -// private Integer boatSelectedImmatriculation; - /** Current boat in the Grid */ @Property private Boat boat; @@ -466,6 +462,22 @@ return false; } + StreamResponse onActionFromExportShowBoats() { + return new ExportStreamResponse("wao-navires") { + + @Override + public InputStream getStream() throws IOException { + InputStream result = null; + try { + result = serviceBoat.exportBoatCsv(getFilter()); + } catch (SuiviObsmerException eee) { + throw new IOException(eee); + } + return result; + } + }; + } + Block onActionFromShowBoatInfos(Integer boatImma) throws SuiviObsmerException { boatSelectedImmatriculation = boatImma; // Suppress persistant boat informations Modified: trunk/suiviobsmer-ui/src/main/java/fr/ifremer/suiviobsmer/ui/pages/Contacts.java =================================================================== --- trunk/suiviobsmer-ui/src/main/java/fr/ifremer/suiviobsmer/ui/pages/Contacts.java 2010-02-01 19:57:10 UTC (rev 310) +++ trunk/suiviobsmer-ui/src/main/java/fr/ifremer/suiviobsmer/ui/pages/Contacts.java 2010-02-02 14:57:05 UTC (rev 311) @@ -42,6 +42,7 @@ import fr.ifremer.suiviobsmer.ui.base.GenericSelectModel; import fr.ifremer.suiviobsmer.ui.base.SuiviObsmerPage; import fr.ifremer.suiviobsmer.ui.components.Layout; +import fr.ifremer.suiviobsmer.ui.data.ExportStreamResponse; import fr.ifremer.suiviobsmer.ui.services.ContactModelFactory; import java.io.IOException; import java.io.InputStream; @@ -221,14 +222,9 @@ } StreamResponse onActionFromExportShowContacts() { - return new StreamResponse() { + return new ExportStreamResponse("wao-contacts") { @Override - public String getContentType() { - return "text/csv;charset=utf-8"; - } - - @Override public InputStream getStream() throws IOException { InputStream result = null; try { @@ -238,13 +234,6 @@ } return result; } - - @Override - public void prepareResponse(Response response) { - DateFormat dateFormat = new SimpleDateFormat("dd-MM-yyyy"); - Date current = SuiviObsmerContext.getCurrentDate(); - response.setHeader("Content-Disposition", "attachment; filename=\"wao-contacts-" + dateFormat.format(current) + ".csv\""); - } }; } Modified: trunk/suiviobsmer-ui/src/main/webapp/Boats.tml =================================================================== --- trunk/suiviobsmer-ui/src/main/webapp/Boats.tml 2010-02-01 19:57:10 UTC (rev 310) +++ trunk/suiviobsmer-ui/src/main/webapp/Boats.tml 2010-02-02 14:57:05 UTC (rev 311) @@ -105,7 +105,12 @@ <div t:type="zone" t:id="boatsZone" t:update="show" class="clearfix"> <!-- BOATLIST:: --> <div class="fleft" id="so-boats-list"> - <h1>Liste de ${boats.availableRows} navires</h1> + <h1>Liste de ${boats.availableRows} navires + <a t:type="actionlink" t:id="exportShowBoats"> + <img src="${asset:context:}/img/file-export-22px.png" alt="Export CSV" + title="Exporter les ${boats.availableRows} navires avec leurs informations privées" /> + </a> + </h1> <div t:type="grid" t:source="boats" t:row="boat" t:inPlace="true" t:include="name, immatriculation, districtCode, boatLength, buildYear" t:rowClass="prop:rowStyle" t:rowsPerPage="20"> <p:nameCell>
participants (1)
-
fdesbois@users.labs.libre-entreprise.org