r37 - in trunk: cantharella.service/src/main/java/nc/ird/cantharella/service/model cantharella.web/src/main/java/nc/ird/cantharella/web/pages/columns cantharella.web/src/main/java/nc/ird/cantharella/web/pages/domain/search cantharella.web/src/main/java/nc/ird/cantharella/web/utils cantharella.web/src/main/java/nc/ird/cantharella/web/utils/columns cantharella.web/src/main/java/nc/ird/cantharella/web/utils/links cantharella.web/src/main/resources/commons
Author: echatellier Date: 2012-12-21 10:32:40 +0100 (Fri, 21 Dec 2012) New Revision: 37 Url: http://forge.codelutin.com/projects/cantharella/repository/revisions/37 Log: Add csv export support Added: trunk/cantharella.web/src/main/java/nc/ird/cantharella/web/utils/columns/CsvWriter.java trunk/cantharella.web/src/main/java/nc/ird/cantharella/web/utils/columns/ExportableColumn.java trunk/cantharella.web/src/main/java/nc/ird/cantharella/web/utils/columns/ExportablePropertyColumn.java trunk/cantharella.web/src/main/java/nc/ird/cantharella/web/utils/columns/ExportableTextFilteredPropertyColumn.java trunk/cantharella.web/src/main/java/nc/ird/cantharella/web/utils/links/ trunk/cantharella.web/src/main/java/nc/ird/cantharella/web/utils/links/CsvExportLink.java Modified: trunk/cantharella.service/src/main/java/nc/ird/cantharella/service/model/SearchResult.java trunk/cantharella.web/src/main/java/nc/ird/cantharella/web/pages/columns/TaxonomyPropertyColumn.java trunk/cantharella.web/src/main/java/nc/ird/cantharella/web/pages/domain/search/SearchPage.html trunk/cantharella.web/src/main/java/nc/ird/cantharella/web/pages/domain/search/SearchPage.java trunk/cantharella.web/src/main/java/nc/ird/cantharella/web/utils/columns/BooleanPropertyColumn.java trunk/cantharella.web/src/main/java/nc/ird/cantharella/web/utils/columns/DecimalPropertyColumn.java trunk/cantharella.web/src/main/java/nc/ird/cantharella/web/utils/columns/EnumPropertyColumn.java trunk/cantharella.web/src/main/java/nc/ird/cantharella/web/utils/columns/LinkPropertyColumn.java trunk/cantharella.web/src/main/java/nc/ird/cantharella/web/utils/columns/MapValuePropertyColumn.java trunk/cantharella.web/src/main/java/nc/ird/cantharella/web/utils/columns/ShortDatePropertyColumn.java trunk/cantharella.web/src/main/resources/commons/web_en.properties trunk/cantharella.web/src/main/resources/commons/web_fr.properties Modified: trunk/cantharella.service/src/main/java/nc/ird/cantharella/service/model/SearchResult.java =================================================================== --- trunk/cantharella.service/src/main/java/nc/ird/cantharella/service/model/SearchResult.java 2012-12-05 18:25:53 UTC (rev 36) +++ trunk/cantharella.service/src/main/java/nc/ird/cantharella/service/model/SearchResult.java 2012-12-21 09:32:40 UTC (rev 37) @@ -30,7 +30,7 @@ import nc.ird.cantharella.data.model.Purification; import nc.ird.cantharella.data.model.ResultatTestBio; import nc.ird.cantharella.data.model.Specimen; -import nc.ird.cantharella.data.model.TestBio; +import nc.ird.cantharella.data.model.Station; /** * Search result containing somes entities collections of various types. @@ -51,6 +51,8 @@ protected List<Purification> purifications; protected List<ResultatTestBio> resultatTestBios; + + protected List<Station> stations; public List<Specimen> getSpecimens() { return specimens; @@ -91,4 +93,12 @@ public void setResultatTestBios(List<ResultatTestBio> resultatTestBios) { this.resultatTestBios = resultatTestBios; } + + public List<Station> getStations() { + return stations; + } + + public void setStations(List<Station> stations) { + this.stations = stations; + } } Modified: trunk/cantharella.web/src/main/java/nc/ird/cantharella/web/pages/columns/TaxonomyPropertyColumn.java =================================================================== --- trunk/cantharella.web/src/main/java/nc/ird/cantharella/web/pages/columns/TaxonomyPropertyColumn.java 2012-12-05 18:25:53 UTC (rev 36) +++ trunk/cantharella.web/src/main/java/nc/ird/cantharella/web/pages/columns/TaxonomyPropertyColumn.java 2012-12-21 09:32:40 UTC (rev 37) @@ -22,11 +22,15 @@ */ package nc.ird.cantharella.web.pages.columns; +import nc.ird.cantharella.web.utils.columns.CsvWriter; +import nc.ird.cantharella.web.utils.columns.ExportableColumn; + import org.apache.wicket.AttributeModifier; import org.apache.wicket.extensions.markup.html.repeater.data.grid.ICellPopulator; import org.apache.wicket.extensions.markup.html.repeater.data.table.PropertyColumn; import org.apache.wicket.markup.html.basic.Label; import org.apache.wicket.markup.repeater.Item; +import org.apache.wicket.model.AbstractReadOnlyModel; import org.apache.wicket.model.IModel; import org.apache.wicket.model.Model; @@ -35,7 +39,7 @@ * @author Adrien Cheype * @param <T> Type of the row model */ -public class TaxonomyPropertyColumn<T> extends PropertyColumn<T> { +public class TaxonomyPropertyColumn<T> extends PropertyColumn<T> implements ExportableColumn<T> { /** * Constructor @@ -63,5 +67,22 @@ label.add(new AttributeModifier("class", new Model<String>("taxonomy"))); item.add(label); } + + @Override + public String getHeaderName() { + return getPropertyExpression(); + } + @Override + public void exportCsv(final T object, CsvWriter writer) { + IModel<?> textModel = createLabelModel(new AbstractReadOnlyModel<T>() { + @Override + public T getObject() { + return object; + } + }); + writer.write(textModel.getObject()); + textModel.detach(); + } + } Modified: trunk/cantharella.web/src/main/java/nc/ird/cantharella/web/pages/domain/search/SearchPage.html =================================================================== --- trunk/cantharella.web/src/main/java/nc/ird/cantharella/web/pages/domain/search/SearchPage.html 2012-12-05 18:25:53 UTC (rev 36) +++ trunk/cantharella.web/src/main/java/nc/ird/cantharella/web/pages/domain/search/SearchPage.html 2012-12-21 09:32:40 UTC (rev 37) @@ -26,6 +26,11 @@ <body> <wicket:extend> +<wicket:message key="SearchPage.QuerySyntax"> + <a wicket:id="advancedLink"><wicket:message key="SearchPage.QuerySyntaxAdvanced" /></a> +</wicket:message> + + <form wicket:id="SearchPage.Form"> <wicket:message key="SearchPage.QueryLabel" /> <input type="text" wicket:id="query" /> @@ -33,16 +38,29 @@ </form> <!-- <div wicket:id="SearchPage.Results.Refresh"> --> -<wicket:message key="SearchPage.Specimens" /> +<h3><wicket:message key="SearchPage.Specimens" /></h3> <table cellspacing="0" wicket:id="SearchPage.Specimens.Results"/> -<wicket:message key="SearchPage.Lots" /> +<a wicket:id="SearchPage.Specimens.ExportCSV"><wicket:message key="SearchPage.ExportCSV" /></a> + +<h3><wicket:message key="SearchPage.Lots" /></h3> <table cellspacing="0" wicket:id="SearchPage.Lots.Results"/> -<wicket:message key="SearchPage.Extractions" /> +<a wicket:id="SearchPage.Lots.ExportCSV"><wicket:message key="SearchPage.ExportCSV" /></a> + +<h3><wicket:message key="SearchPage.Extractions" /></h3> <table cellspacing="0" wicket:id="SearchPage.Extractions.Results"/> -<wicket:message key="SearchPage.Purifications" /> +<a wicket:id="SearchPage.Extractions.ExportCSV"><wicket:message key="SearchPage.ExportCSV" /></a> + +<h3><wicket:message key="SearchPage.Purifications" /></h3> <table cellspacing="0" wicket:id="SearchPage.Purifications.Results"/> -<wicket:message key="SearchPage.ResultatTestBios" /> +<a wicket:id="SearchPage.Purifications.ExportCSV"><wicket:message key="SearchPage.ExportCSV" /></a> + +<h3><wicket:message key="SearchPage.ResultatTestBios" /></h3> <table cellspacing="0" wicket:id="SearchPage.ResultatTestBios.Results"/> +<a wicket:id="SearchPage.ResultatTestBios.ExportCSV"><wicket:message key="SearchPage.ExportCSV" /></a> + +<h3><wicket:message key="SearchPage.Stations" /></h3> +<table cellspacing="0" wicket:id="SearchPage.Stations.Results"/> +<a wicket:id="SearchPage.Stations.ExportCSV"><wicket:message key="SearchPage.ExportCSV" /></a> <!-- </div> --> </wicket:extend> Modified: trunk/cantharella.web/src/main/java/nc/ird/cantharella/web/pages/domain/search/SearchPage.java =================================================================== --- trunk/cantharella.web/src/main/java/nc/ird/cantharella/web/pages/domain/search/SearchPage.java 2012-12-05 18:25:53 UTC (rev 36) +++ trunk/cantharella.web/src/main/java/nc/ird/cantharella/web/pages/domain/search/SearchPage.java 2012-12-21 09:32:40 UTC (rev 37) @@ -33,6 +33,8 @@ import nc.ird.cantharella.data.model.Purification; import nc.ird.cantharella.data.model.ResultatTestBio; import nc.ird.cantharella.data.model.Specimen; +import nc.ird.cantharella.data.model.Station; +import nc.ird.cantharella.data.model.Utilisateur; import nc.ird.cantharella.service.model.SearchResult; import nc.ird.cantharella.service.services.SearchService; import nc.ird.cantharella.web.config.WebContext; @@ -52,26 +54,29 @@ import nc.ird.cantharella.web.utils.columns.BooleanPropertyColumn; import nc.ird.cantharella.web.utils.columns.DecimalPropertyColumn; import nc.ird.cantharella.web.utils.columns.EnumPropertyColumn; +import nc.ird.cantharella.web.utils.columns.ExportablePropertyColumn; +import nc.ird.cantharella.web.utils.columns.ExportableTextFilteredPropertyColumn; import nc.ird.cantharella.web.utils.columns.LinkPropertyColumn; import nc.ird.cantharella.web.utils.columns.LinkableImagePropertyColumn; import nc.ird.cantharella.web.utils.columns.MapValuePropertyColumn; import nc.ird.cantharella.web.utils.columns.ShortDatePropertyColumn; +import nc.ird.cantharella.web.utils.links.CsvExportLink; import nc.ird.cantharella.web.utils.models.DisplayDecimalPropertyModel; import nc.ird.cantharella.web.utils.models.DisplayDecimalPropertyModel.DecimalDisplFormat; import nc.ird.cantharella.web.utils.models.LoadableDetachableSortableListDataProvider; import nc.ird.cantharella.web.utils.security.AuthRole; import nc.ird.cantharella.web.utils.security.AuthRoles; +import org.apache.wicket.extensions.ajax.markup.html.repeater.data.table.AjaxFallbackDefaultDataTable; import org.apache.wicket.extensions.markup.html.repeater.data.grid.ICellPopulator; import org.apache.wicket.extensions.markup.html.repeater.data.table.AbstractColumn; import org.apache.wicket.extensions.markup.html.repeater.data.table.DataTable; import org.apache.wicket.extensions.markup.html.repeater.data.table.DefaultDataTable; import org.apache.wicket.extensions.markup.html.repeater.data.table.IColumn; -import org.apache.wicket.extensions.markup.html.repeater.data.table.PropertyColumn; -import org.apache.wicket.extensions.markup.html.repeater.data.table.filter.TextFilteredPropertyColumn; import org.apache.wicket.markup.html.basic.Label; import org.apache.wicket.markup.html.form.Form; import org.apache.wicket.markup.html.form.TextField; +import org.apache.wicket.markup.html.link.ExternalLink; import org.apache.wicket.markup.repeater.Item; import org.apache.wicket.model.IModel; import org.apache.wicket.model.Model; @@ -106,6 +111,10 @@ this.query = query; final CallerPage currentPage = new CallerPage(ListSpecimensPage.class); + // ca sert a rien, mais wicket est pas content + ExternalLink link = new ExternalLink("advancedLink", "http://lucene.apache.org/core/3_6_1/queryparsersyntax.html"); + add(link); + // search form Form<ValueMap> searchForm = new Form<ValueMap>(getResource() + ".Form") { protected void onSubmit() { @@ -116,12 +125,14 @@ add(searchForm); // search results - SearchResult searchResult = searchService.search(query); + Utilisateur utilisateur = getSession().getUtilisateur(); + SearchResult searchResult = searchService.search(query, utilisateur); addSpecimensTable(currentPage, searchResult); addLotsTable(currentPage, searchResult); addExtractionsTable(currentPage, searchResult); addPurificationsTable(currentPage, searchResult); addTestBiosTable(currentPage, searchResult); + addStationsTable(currentPage, searchResult); } public String getQuery() { @@ -136,6 +147,14 @@ // search result : specimens List<Specimen> specimens = searchResult.getSpecimens(); List<IColumn<Specimen>> specimensColumns = new ArrayList<IColumn<Specimen>>(); + + specimensColumns.add(new LinkableImagePropertyColumn<Specimen>("images/read.png", getString("Read"), getString("Read")) { + @Override + public void onClick(Item<ICellPopulator<Specimen>> item, String componentId, IModel<Specimen> model) { + setResponsePage(new ReadSpecimenPage(model.getObject().getIdSpecimen(), currentPage)); + } + }); + specimensColumns.add(new LinkPropertyColumn<Specimen>(new Model<String>(getString("Specimen.ref")), "ref", "ref", getString("Read")) { @Override @@ -171,12 +190,21 @@ final DataTable<Specimen> specimensDataTable = new DefaultDataTable<Specimen>(getResource() + ".Specimens.Results", specimensColumns, specimensDataProvider, Integer.MAX_VALUE); add(specimensDataTable); + add(new CsvExportLink("SearchPage.Specimens.ExportCSV", specimensDataTable)); } protected void addLotsTable(final CallerPage currentPage, SearchResult searchResult) { // search result : lots List<Lot> lots = searchResult.getLots(); List<IColumn<Lot>> lotsColumns = new ArrayList<IColumn<Lot>>(); + + lotsColumns.add(new LinkableImagePropertyColumn<Lot>("images/read.png", getString("Read"), getString("Read")) { + @Override + public void onClick(Item<ICellPopulator<Lot>> item, String componentId, IModel<Lot> model) { + setResponsePage(new ReadLotPage(model.getObject().getIdLot(), currentPage)); + } + }); + lotsColumns.add(new LinkPropertyColumn<Lot>(new Model<String>(getString("Lot.ref")), "ref", "ref", getString("Read")) { @Override @@ -185,7 +213,7 @@ } }); - lotsColumns.add(new PropertyColumn<Lot>(new Model<String>(getString("Lot.dateRecolte2")), "dateRecolte", + lotsColumns.add(new ExportablePropertyColumn<Lot>(new Model<String>(getString("Lot.dateRecolte2")), "dateRecolte", "dateRecolte")); lotsColumns.add(new LinkPropertyColumn<Lot>(new Model<String>(getString("Lot.station")), "station", "station", @@ -219,7 +247,7 @@ lotsColumns.add(new TaxonomyPropertyColumn<Lot>(new Model<String>(getString("Specimen.espece")), "specimenRef.espece", "specimenRef.espece")); - lotsColumns.add(new PropertyColumn<Lot>(new Model<String>(getString("Lot.partie")), "partie", "partie")); + lotsColumns.add(new ExportablePropertyColumn<Lot>(new Model<String>(getString("Lot.partie")), "partie", "partie")); lotsColumns.add(new DecimalPropertyColumn<Lot>(new Model<String>(getString("Lot.masseFraiche2")), "masseFraiche", "masseFraiche", DecimalDisplFormat.SMALL, getLocale())); @@ -243,6 +271,7 @@ final DataTable<Lot> lotsDataTable = new DefaultDataTable<Lot>(getResource() + ".Lots.Results", lotsColumns, lotsDataProvider, Integer.MAX_VALUE); add(lotsDataTable); + add(new CsvExportLink("SearchPage.Lots.ExportCSV", lotsDataTable)); } protected void addExtractionsTable(final CallerPage currentPage, SearchResult searchResult) { @@ -277,7 +306,7 @@ extractionsColumns.add(new ShortDatePropertyColumn<Extraction>(new Model<String>(getString("Extraction.date")), "date", "date", getLocale())); - extractionsColumns.add(new PropertyColumn<Extraction>(new Model<String>(getString("Extraction.methode2")), "methode", + extractionsColumns.add(new ExportablePropertyColumn<Extraction>(new Model<String>(getString("Extraction.methode2")), "methode", "methode")); extractionsColumns.add(new DecimalPropertyColumn<Extraction>(new Model<String>(getString("Extraction.masseDepart2")), @@ -336,6 +365,7 @@ final DataTable<Extraction> extractionsDataTable = new DefaultDataTable<Extraction>( getResource() + ".Extractions.Results", extractionsColumns, extractionsDataProvider, Integer.MAX_VALUE); add(extractionsDataTable); + add(new CsvExportLink("SearchPage.Extractions.ExportCSV", extractionsDataTable)); } protected void addPurificationsTable(final CallerPage currentPage, SearchResult searchResult) { @@ -345,6 +375,14 @@ List<IColumn<Purification>> columns = new ArrayList<IColumn<Purification>>(); + columns.add(new LinkableImagePropertyColumn<Purification>("images/read.png", getString("Read"), + getString("Read")) { + @Override + public void onClick(Item<ICellPopulator<Purification>> item, String componentId, IModel<Purification> model) { + setResponsePage(new ReadPurificationPage(model.getObject().getIdPurification(), currentPage)); + } + }); + columns.add(new LinkPropertyColumn<Purification>(new Model<String>(getString("Extraction.lot")), "lotSource", "lotSource", getString("Read")) { @Override @@ -377,7 +415,7 @@ columns.add(new ShortDatePropertyColumn<Purification>(new Model<String>(getString("Purification.date")), "date", "date", getLocale())); - columns.add(new PropertyColumn<Purification>(new Model<String>(getString("Purification.methode2")), "methode", + columns.add(new ExportablePropertyColumn<Purification>(new Model<String>(getString("Purification.methode2")), "methode", "methode")); columns.add(new LinkPropertyColumn<Purification>(new Model<String>(getString("Campagne")), @@ -392,6 +430,7 @@ final DataTable<Purification> purificationsDataTable = new DefaultDataTable<Purification>( getResource() + ".Purifications.Results", columns, purificationsDataProvider, Integer.MAX_VALUE); add(purificationsDataTable); + add(new CsvExportLink("SearchPage.Purifications.ExportCSV", purificationsDataTable)); } protected void addTestBiosTable(final CallerPage currentPage, SearchResult searchResult) { @@ -401,7 +440,16 @@ List<IColumn<ResultatTestBio>> columns = new ArrayList<IColumn<ResultatTestBio>>(); - columns.add(new TextFilteredPropertyColumn<ResultatTestBio, String>(new Model<String>( + columns.add(new LinkableImagePropertyColumn<ResultatTestBio>("images/read.png", getString("Read"), + getString("Read")) { + @Override + public void onClick(Item<ICellPopulator<ResultatTestBio>> item, String componentId, + IModel<ResultatTestBio> model) { + setResponsePage(new ReadTestBioPage(model.getObject().getTestBio().getIdTestBio(), currentPage)); + } + }); + + columns.add(new ExportableTextFilteredPropertyColumn<ResultatTestBio, String>(new Model<String>( getString("MethodeTestBio.cible2")), "testBio.methode.cible", "testBio.methode.cible")); columns.add(new DecimalPropertyColumn<ResultatTestBio>(new Model<String>( @@ -427,10 +475,10 @@ columns.add(new DecimalPropertyColumn<ResultatTestBio>(new Model<String>(getString("ResultatTestBio.valeur")), "valeur", "valeur", DecimalDisplFormat.SMALL, getLocale())); - columns.add(new PropertyColumn<ResultatTestBio>(new Model<String>(getString("MethodeTestBio.uniteResultat2")), + columns.add(new ExportablePropertyColumn<ResultatTestBio>(new Model<String>(getString("MethodeTestBio.uniteResultat2")), "testBio.methode.uniteResultat", "testBio.methode.uniteResultat")); - columns.add(new PropertyColumn<ResultatTestBio>(new Model<String>(getString("Extrait.typeExtrait2")), + columns.add(new ExportablePropertyColumn<ResultatTestBio>(new Model<String>(getString("Extrait.typeExtrait2")), "typeExtraitSource", "typeExtraitSource")); columns.add(new BooleanPropertyColumn<ResultatTestBio>(new Model<String>(getString("ResultatTestBio.actif")), @@ -449,7 +497,7 @@ getString("Campagne.codePays")), "lotSource.campagne.codePays", "lotSource.campagne.codePays", WebContext.COUNTRIES.get(getSession().getLocale()))); - columns.add(new PropertyColumn<ResultatTestBio>(new Model<String>(getString("ResultatTestBio.repere")), + columns.add(new ExportablePropertyColumn<ResultatTestBio>(new Model<String>(getString("ResultatTestBio.repere")), "repere", "repere")); columns.add(new LinkPropertyColumn<ResultatTestBio>(new Model<String>(getString("TestBio.ref")), "testBio.ref", @@ -465,6 +513,52 @@ getResource() + ".ResultatTestBios.Results", columns, resTestBiosDataProvider, Integer.MAX_VALUE); add(resTestBiosDataTable); + add(new CsvExportLink("SearchPage.ResultatTestBios.ExportCSV", resTestBiosDataTable)); } + + protected void addStationsTable(final CallerPage currentPage, SearchResult searchResult) { + + // Liste des stations + List<Station> stations = searchResult.getStations(); + + LoadableDetachableSortableListDataProvider<Station> stationsDataProvider = new LoadableDetachableSortableListDataProvider<Station>( + stations, getSession().getLocale()); + + List<IColumn<Station>> columns = new ArrayList<IColumn<Station>>(); + + columns.add(new LinkableImagePropertyColumn<Station>("images/read.png", getString("Read"), getString("Read")) { + @Override + public void onClick(Item<ICellPopulator<Station>> item, String componentId, IModel<Station> model) { + setResponsePage(new ReadStationPage(model.getObject().getIdStation(), currentPage)); + } + }); + + columns.add(new LinkPropertyColumn<Station>(new Model<String>(getString("Station.nom")), "nom", "nom", + getString("Read")) { + @Override + public void onClick(Item<ICellPopulator<Station>> item, String componentId, IModel<Station> model) { + setResponsePage(new ReadStationPage(model.getObject().getIdStation(), currentPage)); + } + }); + + columns.add(new MapValuePropertyColumn<Station, String>(new Model<String>(getString("Station.codePays")), + "codePays", "codePays", WebContext.COUNTRIES.get(getSession().getLocale()))); + + columns.add(new ExportablePropertyColumn<Station>(new Model<String>(getString("Station.localite")), "localite", + "localite")); + + columns.add(new ExportablePropertyColumn<Station>(new Model<String>(getString("Station.latitude")), "latitude", + "latitude")); + + columns.add(new ExportablePropertyColumn<Station>(new Model<String>(getString("Station.longitude")), "longitude", + "longitude")); + + + final DataTable<Station> stationsDataTable = new AjaxFallbackDefaultDataTable<Station>( + getResource() + ".Stations.Results", columns, stationsDataProvider, WebContext.ROWS_PER_PAGE); + + add(stationsDataTable); + add(new CsvExportLink("SearchPage.Stations.ExportCSV", stationsDataTable)); + } } Modified: trunk/cantharella.web/src/main/java/nc/ird/cantharella/web/utils/columns/BooleanPropertyColumn.java =================================================================== --- trunk/cantharella.web/src/main/java/nc/ird/cantharella/web/utils/columns/BooleanPropertyColumn.java 2012-12-05 18:25:53 UTC (rev 36) +++ trunk/cantharella.web/src/main/java/nc/ird/cantharella/web/utils/columns/BooleanPropertyColumn.java 2012-12-21 09:32:40 UTC (rev 37) @@ -29,6 +29,7 @@ import org.apache.wicket.extensions.markup.html.repeater.data.table.AbstractColumn; import org.apache.wicket.markup.html.basic.Label; import org.apache.wicket.markup.repeater.Item; +import org.apache.wicket.model.AbstractReadOnlyModel; import org.apache.wicket.model.IModel; /** @@ -36,7 +37,7 @@ * @author Adrien Cheype * @param <T> Type of the row model */ -public class BooleanPropertyColumn<T> extends AbstractColumn<T> { +public class BooleanPropertyColumn<T> extends AbstractColumn<T> implements ExportableColumn<T> { /** wicket property expression */ private final String propertyExpression; @@ -65,4 +66,20 @@ page))); } + @Override + public String getHeaderName() { + return propertyExpression; + } + + @Override + public void exportCsv(final T object, CsvWriter writer) { + IModel<?> textModel = new DisplayBooleanPropertyModel(new AbstractReadOnlyModel<T>() { + @Override + public T getObject() { + return object; + } + }, propertyExpression, page); + writer.write(textModel.getObject()); + textModel.detach(); + } } Added: trunk/cantharella.web/src/main/java/nc/ird/cantharella/web/utils/columns/CsvWriter.java =================================================================== --- trunk/cantharella.web/src/main/java/nc/ird/cantharella/web/utils/columns/CsvWriter.java (rev 0) +++ trunk/cantharella.web/src/main/java/nc/ird/cantharella/web/utils/columns/CsvWriter.java 2012-12-21 09:32:40 UTC (rev 37) @@ -0,0 +1,64 @@ +/* + * #%L + * Cantharella :: Web + * $Id$ + * $HeadURL$ + * %% + * Copyright (C) 2009 - 2012 IRD (Institut de Recherche pour le Developpement) and by respective authors (see below) + * %% + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU Affero General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU Affero General Public License + * along with this program. If not, see <http://www.gnu.org/licenses/>. + * #L% + */ +package nc.ird.cantharella.web.utils.columns; + +import java.io.OutputStream; +import java.io.PrintWriter; + +/** + * CsvWriter helper used to export data from data table. + * + * @author echatellier + */ +public class CsvWriter { + private final PrintWriter out; + private boolean first = true; + public CsvWriter(OutputStream os) { + out = new PrintWriter(os); + } + public CsvWriter write(Object value) { + if (!first) { + out.append(","); + } + out.append("\""); + if (value != null) { + out.append(value.toString().replace("\"", "\"\"") + .replace("\n", " ")); + } + out.append("\""); + first = false; + return this; + } + public CsvWriter endLine() { + out.append("\r\n"); + first = true; + return this; + } + public CsvWriter flush() { + out.flush(); + return this; + } + public void close() { + out.close(); + } +} Property changes on: trunk/cantharella.web/src/main/java/nc/ird/cantharella/web/utils/columns/CsvWriter.java ___________________________________________________________________ Added: svn:keywords + Author Date Id Revision HeadURL Modified: trunk/cantharella.web/src/main/java/nc/ird/cantharella/web/utils/columns/DecimalPropertyColumn.java =================================================================== --- trunk/cantharella.web/src/main/java/nc/ird/cantharella/web/utils/columns/DecimalPropertyColumn.java 2012-12-05 18:25:53 UTC (rev 36) +++ trunk/cantharella.web/src/main/java/nc/ird/cantharella/web/utils/columns/DecimalPropertyColumn.java 2012-12-21 09:32:40 UTC (rev 37) @@ -31,6 +31,7 @@ import org.apache.wicket.extensions.markup.html.repeater.data.table.AbstractColumn; import org.apache.wicket.markup.html.basic.Label; import org.apache.wicket.markup.repeater.Item; +import org.apache.wicket.model.AbstractReadOnlyModel; import org.apache.wicket.model.IModel; /** @@ -38,7 +39,7 @@ * @author Adrien Cheype * @param <T> Type of the row model */ -public class DecimalPropertyColumn<T> extends AbstractColumn<T> { +public class DecimalPropertyColumn<T> extends AbstractColumn<T> implements ExportableColumn<T> { /** wicket property expression */ private final String propertyExpression; @@ -71,5 +72,22 @@ cellItem.add(new Label(componentId, new DisplayDecimalPropertyModel(rowModel.getObject(), propertyExpression, format, locale))); } + + @Override + public String getHeaderName() { + return propertyExpression; + } + @Override + public void exportCsv(final T object, CsvWriter writer) { + IModel<?> textModel = new DisplayDecimalPropertyModel(new AbstractReadOnlyModel<T>() { + @Override + public T getObject() { + return object; + } + }, propertyExpression, format, locale); + writer.write(textModel.getObject()); + textModel.detach(); + } + } Modified: trunk/cantharella.web/src/main/java/nc/ird/cantharella/web/utils/columns/EnumPropertyColumn.java =================================================================== --- trunk/cantharella.web/src/main/java/nc/ird/cantharella/web/utils/columns/EnumPropertyColumn.java 2012-12-05 18:25:53 UTC (rev 36) +++ trunk/cantharella.web/src/main/java/nc/ird/cantharella/web/utils/columns/EnumPropertyColumn.java 2012-12-21 09:32:40 UTC (rev 37) @@ -29,6 +29,7 @@ import org.apache.wicket.extensions.markup.html.repeater.data.table.AbstractColumn; import org.apache.wicket.markup.html.basic.Label; import org.apache.wicket.markup.repeater.Item; +import org.apache.wicket.model.AbstractReadOnlyModel; import org.apache.wicket.model.IModel; /** @@ -36,7 +37,7 @@ * @author Adrien Cheype * @param <T> Type of the row model */ -public class EnumPropertyColumn<T> extends AbstractColumn<T> { +public class EnumPropertyColumn<T> extends AbstractColumn<T> implements ExportableColumn<T> { /** wicket property expression */ private final String propertyExpression; @@ -65,4 +66,20 @@ new DisplayEnumPropertyModel(rowModel.getObject(), propertyExpression, page))); } + @Override + public String getHeaderName() { + return propertyExpression; + } + + @Override + public void exportCsv(final T object, CsvWriter writer) { + IModel<?> textModel = new DisplayEnumPropertyModel(new AbstractReadOnlyModel<T>() { + @Override + public T getObject() { + return object; + } + }, propertyExpression, page); + writer.write(textModel.getObject()); + textModel.detach(); + } } Added: trunk/cantharella.web/src/main/java/nc/ird/cantharella/web/utils/columns/ExportableColumn.java =================================================================== --- trunk/cantharella.web/src/main/java/nc/ird/cantharella/web/utils/columns/ExportableColumn.java (rev 0) +++ trunk/cantharella.web/src/main/java/nc/ird/cantharella/web/utils/columns/ExportableColumn.java 2012-12-21 09:32:40 UTC (rev 37) @@ -0,0 +1,41 @@ +/* + * #%L + * Cantharella :: Web + * $Id$ + * $HeadURL$ + * %% + * Copyright (C) 2009 - 2012 IRD (Institut de Recherche pour le Developpement) and by respective authors (see below) + * %% + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU Affero General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU Affero General Public License + * along with this program. If not, see <http://www.gnu.org/licenses/>. + * #L% + */ +package nc.ird.cantharella.web.utils.columns; + +import org.apache.wicket.extensions.markup.html.repeater.data.table.IColumn; + +/** + * Interface to mark column as exportable. + * + * @author echatellier + * + * @param <T> + */ +public interface ExportableColumn<T> extends IColumn<T> { + + /** Export column name. */ + String getHeaderName(); + + /** Export current object into writer. */ + void exportCsv(T object, CsvWriter writer); + } Property changes on: trunk/cantharella.web/src/main/java/nc/ird/cantharella/web/utils/columns/ExportableColumn.java ___________________________________________________________________ Added: svn:keywords + Author Date Id Revision HeadURL Added: trunk/cantharella.web/src/main/java/nc/ird/cantharella/web/utils/columns/ExportablePropertyColumn.java =================================================================== --- trunk/cantharella.web/src/main/java/nc/ird/cantharella/web/utils/columns/ExportablePropertyColumn.java (rev 0) +++ trunk/cantharella.web/src/main/java/nc/ird/cantharella/web/utils/columns/ExportablePropertyColumn.java 2012-12-21 09:32:40 UTC (rev 37) @@ -0,0 +1,59 @@ +/* + * #%L + * Cantharella :: Web + * $Id$ + * $HeadURL$ + * %% + * Copyright (C) 2009 - 2012 IRD (Institut de Recherche pour le Developpement) and by respective authors (see below) + * %% + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU Affero General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU Affero General Public License + * along with this program. If not, see <http://www.gnu.org/licenses/>. + * #L% + */ +package nc.ird.cantharella.web.utils.columns; + +import org.apache.wicket.extensions.markup.html.repeater.data.table.PropertyColumn; +import org.apache.wicket.model.AbstractReadOnlyModel; +import org.apache.wicket.model.IModel; + +/** + * Override {@link PropertyColumn} to addd export support. + * + * @author echatellier + * + * @param <T> + */ +public class ExportablePropertyColumn<T> extends PropertyColumn<T> implements + ExportableColumn<T> { + + public ExportablePropertyColumn(IModel<String> displayModel, String sortProperty, String propertyExpression) { + super(displayModel, sortProperty, propertyExpression); + } + + @Override + public String getHeaderName() { + return getPropertyExpression(); + } + + @Override + public void exportCsv(final T object, CsvWriter writer) { + IModel<?> textModel = createLabelModel(new AbstractReadOnlyModel<T>() { + @Override + public T getObject() { + return object; + } + }); + writer.write(textModel.getObject()); + textModel.detach(); + } +} Property changes on: trunk/cantharella.web/src/main/java/nc/ird/cantharella/web/utils/columns/ExportablePropertyColumn.java ___________________________________________________________________ Added: svn:keywords + Author Date Id Revision HeadURL Added: trunk/cantharella.web/src/main/java/nc/ird/cantharella/web/utils/columns/ExportableTextFilteredPropertyColumn.java =================================================================== --- trunk/cantharella.web/src/main/java/nc/ird/cantharella/web/utils/columns/ExportableTextFilteredPropertyColumn.java (rev 0) +++ trunk/cantharella.web/src/main/java/nc/ird/cantharella/web/utils/columns/ExportableTextFilteredPropertyColumn.java 2012-12-21 09:32:40 UTC (rev 37) @@ -0,0 +1,60 @@ +/* + * #%L + * Cantharella :: Web + * $Id$ + * $HeadURL$ + * %% + * Copyright (C) 2009 - 2012 IRD (Institut de Recherche pour le Developpement) and by respective authors (see below) + * %% + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU Affero General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU Affero General Public License + * along with this program. If not, see <http://www.gnu.org/licenses/>. + * #L% + */ +package nc.ird.cantharella.web.utils.columns; + +import org.apache.wicket.extensions.markup.html.repeater.data.table.filter.TextFilteredPropertyColumn; +import org.apache.wicket.model.AbstractReadOnlyModel; +import org.apache.wicket.model.IModel; + +/** + * Override {@link TextFilteredPropertyColumn} to add export support. + * + * @author echatellier + * + * @param <T> + * @param <F> + */ +public class ExportableTextFilteredPropertyColumn<T, F> extends TextFilteredPropertyColumn<T, F> implements ExportableColumn<T> { + + public ExportableTextFilteredPropertyColumn(IModel<String> displayModel, + String sortProperty, String propertyExpression) { + super(displayModel, sortProperty, propertyExpression); + } + + @Override + public String getHeaderName() { + return getPropertyExpression(); + } + + @Override + public void exportCsv(final T object, CsvWriter writer) { + IModel<?> textModel = createLabelModel(new AbstractReadOnlyModel<T>() { + @Override + public T getObject() { + return object; + } + }); + writer.write(textModel.getObject()); + textModel.detach(); + } +} Property changes on: trunk/cantharella.web/src/main/java/nc/ird/cantharella/web/utils/columns/ExportableTextFilteredPropertyColumn.java ___________________________________________________________________ Added: svn:keywords + Author Date Id Revision HeadURL Modified: trunk/cantharella.web/src/main/java/nc/ird/cantharella/web/utils/columns/LinkPropertyColumn.java =================================================================== --- trunk/cantharella.web/src/main/java/nc/ird/cantharella/web/utils/columns/LinkPropertyColumn.java 2012-12-05 18:25:53 UTC (rev 36) +++ trunk/cantharella.web/src/main/java/nc/ird/cantharella/web/utils/columns/LinkPropertyColumn.java 2012-12-21 09:32:40 UTC (rev 37) @@ -30,6 +30,7 @@ import org.apache.wicket.markup.html.link.PopupSettings; import org.apache.wicket.markup.html.panel.Panel; import org.apache.wicket.markup.repeater.Item; +import org.apache.wicket.model.AbstractReadOnlyModel; import org.apache.wicket.model.IModel; import org.apache.wicket.model.Model; @@ -38,7 +39,7 @@ * https://cwiki.apache.org/WICKET/adding-links-in-a-defaultdatatable.html * @param <T> Generic type */ -abstract public class LinkPropertyColumn<T> extends PropertyColumn<T> { +abstract public class LinkPropertyColumn<T> extends PropertyColumn<T> implements ExportableColumn<T>{ /** Popup settings */ private PopupSettings popupSettings; @@ -170,4 +171,21 @@ link.add(new Label("label", tmpLabelModel)); } } + + @Override + public String getHeaderName() { + return getPropertyExpression(); + } + + @Override + public void exportCsv(final T object, CsvWriter writer) { + IModel<?> textModel = createLabelModel(new AbstractReadOnlyModel<T>() { + @Override + public T getObject() { + return object; + } + }); + writer.write(textModel.getObject()); + textModel.detach(); + } } \ No newline at end of file Modified: trunk/cantharella.web/src/main/java/nc/ird/cantharella/web/utils/columns/MapValuePropertyColumn.java =================================================================== --- trunk/cantharella.web/src/main/java/nc/ird/cantharella/web/utils/columns/MapValuePropertyColumn.java 2012-12-05 18:25:53 UTC (rev 36) +++ trunk/cantharella.web/src/main/java/nc/ird/cantharella/web/utils/columns/MapValuePropertyColumn.java 2012-12-21 09:32:40 UTC (rev 37) @@ -30,6 +30,7 @@ import org.apache.wicket.extensions.markup.html.repeater.data.table.AbstractColumn; import org.apache.wicket.markup.html.basic.Label; import org.apache.wicket.markup.repeater.Item; +import org.apache.wicket.model.AbstractReadOnlyModel; import org.apache.wicket.model.IModel; /** @@ -38,7 +39,7 @@ * @param <T> Type of the row model * @param <U> Type of the map key. The map is thus parametred by <U, String> */ -public class MapValuePropertyColumn<T, U> extends AbstractColumn<T> { +public class MapValuePropertyColumn<T, U> extends AbstractColumn<T> implements ExportableColumn<T> { /** wicket property expression */ private final String propertyExpression; @@ -67,4 +68,20 @@ propertyExpression, map))); } + @Override + public String getHeaderName() { + return propertyExpression; + } + + @Override + public void exportCsv(final T object, CsvWriter writer) { + IModel<?> textModel = new DisplayMapValuePropertyModel<U>(new AbstractReadOnlyModel<T>() { + @Override + public T getObject() { + return object; + } + }, propertyExpression, map); + writer.write(textModel.getObject()); + textModel.detach(); + } } Modified: trunk/cantharella.web/src/main/java/nc/ird/cantharella/web/utils/columns/ShortDatePropertyColumn.java =================================================================== --- trunk/cantharella.web/src/main/java/nc/ird/cantharella/web/utils/columns/ShortDatePropertyColumn.java 2012-12-05 18:25:53 UTC (rev 36) +++ trunk/cantharella.web/src/main/java/nc/ird/cantharella/web/utils/columns/ShortDatePropertyColumn.java 2012-12-21 09:32:40 UTC (rev 37) @@ -30,6 +30,7 @@ import org.apache.wicket.extensions.markup.html.repeater.data.table.AbstractColumn; import org.apache.wicket.markup.html.basic.Label; import org.apache.wicket.markup.repeater.Item; +import org.apache.wicket.model.AbstractReadOnlyModel; import org.apache.wicket.model.IModel; /** @@ -37,7 +38,7 @@ * @author Adrien Cheype * @param <T> Type of the row model */ -public class ShortDatePropertyColumn<T> extends AbstractColumn<T> { +public class ShortDatePropertyColumn<T> extends AbstractColumn<T> implements ExportableColumn<T> { /** wicket property expression */ private final String propertyExpression; @@ -65,5 +66,21 @@ cellItem.add(new Label(componentId, new DisplayShortDatePropertyModel(rowModel.getObject(), propertyExpression, locale))); } + + @Override + public String getHeaderName() { + return propertyExpression; + } + @Override + public void exportCsv(final T object, CsvWriter writer) { + IModel<?> textModel = new DisplayShortDatePropertyModel(new AbstractReadOnlyModel<T>() { + @Override + public T getObject() { + return object; + } + }, propertyExpression, locale); + writer.write(textModel.getObject()); + textModel.detach(); + } } Added: trunk/cantharella.web/src/main/java/nc/ird/cantharella/web/utils/links/CsvExportLink.java =================================================================== --- trunk/cantharella.web/src/main/java/nc/ird/cantharella/web/utils/links/CsvExportLink.java (rev 0) +++ trunk/cantharella.web/src/main/java/nc/ird/cantharella/web/utils/links/CsvExportLink.java 2012-12-21 09:32:40 UTC (rev 37) @@ -0,0 +1,60 @@ +package nc.ird.cantharella.web.utils.links; + +import java.io.OutputStream; +import java.util.ArrayList; +import java.util.Iterator; +import java.util.List; + +import nc.ird.cantharella.web.utils.columns.CsvWriter; +import nc.ird.cantharella.web.utils.columns.ExportableColumn; + +import org.apache.wicket.extensions.markup.html.repeater.data.table.DataTable; +import org.apache.wicket.extensions.markup.html.repeater.data.table.IColumn; +import org.apache.wicket.markup.html.link.Link; +import org.apache.wicket.request.http.WebResponse; +import org.aspectj.bridge.AbortException; + +public class CsvExportLink<T> extends Link<Void> { + private final DataTable<T> table; + + public CsvExportLink(String id, DataTable<T> table) { + super(id); + this.table = table; + } + + @Override + public void onClick() { + WebResponse response = (WebResponse) getResponse(); + response.setAttachmentHeader("export.csv"); + response.setContentType("text/csv"); + OutputStream out = getResponse().getOutputStream(); + CsvWriter writer = new CsvWriter(out); + List<ExportableColumn<T>> exportable = getExportableColumns(); + // write header + for (ExportableColumn<T> column : exportable) { + writer.write(column.getHeaderName()); + } + writer.endLine(); + // write data + Iterator<? extends T> it = table.getDataProvider().iterator(0, table.getDataProvider().size()); + while (it.hasNext()) { + T object = it.next(); + for (ExportableColumn<T> col : exportable) { + col.exportCsv(object, writer); + } + writer.endLine(); + } + writer.close(); + throw new AbortException(); + } + + private List<ExportableColumn<T>> getExportableColumns() { + List<ExportableColumn<T>> exportable = new ArrayList<ExportableColumn<T>>(table.getColumns().size()); + for (IColumn<?> column : table.getColumns()) { + if (column instanceof ExportableColumn<?>) { + exportable.add((ExportableColumn<T>) column); + } + } + return exportable; + } +} Property changes on: trunk/cantharella.web/src/main/java/nc/ird/cantharella/web/utils/links/CsvExportLink.java ___________________________________________________________________ Added: svn:keywords + Author Date Id Revision HeadURL Modified: trunk/cantharella.web/src/main/resources/commons/web_en.properties =================================================================== --- trunk/cantharella.web/src/main/resources/commons/web_en.properties 2012-12-05 18:25:53 UTC (rev 36) +++ trunk/cantharella.web/src/main/resources/commons/web_en.properties 2012-12-21 09:32:40 UTC (rev 37) @@ -280,6 +280,10 @@ SearchPage.Extractions=Extractions SearchPage.Purifications=Purifications SearchPage.ResultatTestBios=Bioassay +SearchPage.Stations=Stations +SearchPage.QuerySyntax=Search terms (or parts of words using *). For a more advanced search, consult the ${advancedLink}. +SearchPage.QuerySyntaxAdvanced=complete syntax +SearchPage.ExportCSV=Export to CSV #MODELS# Modified: trunk/cantharella.web/src/main/resources/commons/web_fr.properties =================================================================== --- trunk/cantharella.web/src/main/resources/commons/web_fr.properties 2012-12-05 18:25:53 UTC (rev 36) +++ trunk/cantharella.web/src/main/resources/commons/web_fr.properties 2012-12-21 09:32:40 UTC (rev 37) @@ -279,6 +279,10 @@ SearchPage.Extractions=Extractions SearchPage.Purifications=Purifications SearchPage.ResultatTestBios=Tests biologiques +SearchPage.Stations=Stations +SearchPage.QuerySyntax=Rechercher des termes (ou des parties de termes avec *). Pour une utilisation plus avancée de la recherche, consulter la ${advancedLink}. +SearchPage.QuerySyntaxAdvanced=synthaxe complète +SearchPage.ExportCSV=Exporter en CSV #MODELS#
participants (1)
-
echatellier@users.forge.codelutin.com