[Suiviobsmer-commits] r629 - in trunk: wao-business/src/main/java/fr/ifremer/wao/bean wao-business/src/main/java/fr/ifremer/wao/io/kml wao-business/src/main/java/fr/ifremer/wao/service wao-business/src/main/xmi wao-business/src/test/java/fr/ifremer/wao/bean wao-ui/src/main/java/fr/ifremer/wao/ui/pages wao-ui/src/main/java/fr/ifremer/wao/ui/services
Author: fdesbois Date: 2010-07-24 21:56:24 +0000 (Sat, 24 Jul 2010) New Revision: 629 Log: Evo #2370 : - Change pieChart size depends on contacts number on each district Added: trunk/wao-business/src/main/java/fr/ifremer/wao/io/kml/IconSizeHelper.java Modified: trunk/wao-business/src/main/java/fr/ifremer/wao/bean/PieChartDataImpl.java trunk/wao-business/src/main/java/fr/ifremer/wao/io/kml/ContactKmlWriterJak.java trunk/wao-business/src/main/java/fr/ifremer/wao/io/kml/KmlWriter.java trunk/wao-business/src/main/java/fr/ifremer/wao/service/ServiceCartographyImpl.java trunk/wao-business/src/main/java/fr/ifremer/wao/service/ServiceChartEmpty.java trunk/wao-business/src/main/xmi/wao.zargo trunk/wao-business/src/test/java/fr/ifremer/wao/bean/PieChartDataImplTest.java trunk/wao-ui/src/main/java/fr/ifremer/wao/ui/pages/KmlLoader.java trunk/wao-ui/src/main/java/fr/ifremer/wao/ui/pages/PieChart.java trunk/wao-ui/src/main/java/fr/ifremer/wao/ui/services/ServiceChartImpl.java trunk/wao-ui/src/main/java/fr/ifremer/wao/ui/services/ServiceChartServlet.java Modified: trunk/wao-business/src/main/java/fr/ifremer/wao/bean/PieChartDataImpl.java =================================================================== --- trunk/wao-business/src/main/java/fr/ifremer/wao/bean/PieChartDataImpl.java 2010-07-24 18:10:31 UTC (rev 628) +++ trunk/wao-business/src/main/java/fr/ifremer/wao/bean/PieChartDataImpl.java 2010-07-24 21:56:24 UTC (rev 629) @@ -37,9 +37,8 @@ public class PieChartDataImpl extends PieChartData { private static final String SERIES_SEPARATOR = "|"; + private static final String TOTAL_SEPARATOR = "::"; - protected double total; - public PieChartDataImpl() { series = new ArrayList<PieChartSeries>(); } @@ -56,7 +55,7 @@ for (PieChartSeries curr : series) { double value = curr.getValue(); // calculate percentage - curr.setValue(value / total * 100); + curr.setValue(value / (double)total * 100); } } @@ -69,8 +68,12 @@ */ @Override public void setData(String data) { + + String[] split = data.split(TOTAL_SEPARATOR); + total = Double.parseDouble(split[1]); + // need to escape separator | - for (String curr : data.split("\\" + SERIES_SEPARATOR)) { + for (String curr : split[0].split("\\" + SERIES_SEPARATOR)) { addSeries(PieChartSeriesImpl.create(curr)); } } @@ -88,6 +91,8 @@ String result = StringUtil.join(series, PieChartSeriesImpl.TO_STRING, SERIES_SEPARATOR, true); + result += TOTAL_SEPARATOR + String.valueOf(total); + return result; } Modified: trunk/wao-business/src/main/java/fr/ifremer/wao/io/kml/ContactKmlWriterJak.java =================================================================== --- trunk/wao-business/src/main/java/fr/ifremer/wao/io/kml/ContactKmlWriterJak.java 2010-07-24 18:10:31 UTC (rev 628) +++ trunk/wao-business/src/main/java/fr/ifremer/wao/io/kml/ContactKmlWriterJak.java 2010-07-24 21:56:24 UTC (rev 629) @@ -64,7 +64,7 @@ } @Override - public void record(GeoPoint geo, String iconUrl, String description) { + public void record(GeoPoint geo, String iconUrl, double iconScale, String description) { if (geo.getLatitude() == null || geo.getLongitude() == null) { throw new IllegalArgumentException("Can't record geopoint with null latitude or longitude"); @@ -75,7 +75,7 @@ Icon icon = new Icon().withHref(iconUrl); - style.createAndSetIconStyle().withScale(1.0).withIcon(icon); + style.createAndSetIconStyle().withScale(iconScale).withIcon(icon); style.createAndSetLabelStyle().withColor("ff43b3ff").withScale(1.0); Placemark placemark = folder.createAndAddPlacemark(). Added: trunk/wao-business/src/main/java/fr/ifremer/wao/io/kml/IconSizeHelper.java =================================================================== --- trunk/wao-business/src/main/java/fr/ifremer/wao/io/kml/IconSizeHelper.java (rev 0) +++ trunk/wao-business/src/main/java/fr/ifremer/wao/io/kml/IconSizeHelper.java 2010-07-24 21:56:24 UTC (rev 629) @@ -0,0 +1,123 @@ +package fr.ifremer.wao.io.kml; + +import fr.ifremer.wao.bean.PieChartData; + +import java.util.Collection; + +/** + * Size will be rendered between {@link #BASE_SCALE} and {@link #BASE_SCALE} + + * {@link #NB_STEPS} * {@link #SCALE_STEP}. + * The constant {@link #NB_STEPS} defines the number of available sizes. + * This class must be initialized with a max reference to calculate the + * correct size and scale. This reference can be calculated from a collection + * of {@link PieChartData} : the max total found will be used. The reference + * size is defined by {@link #REF_SIZE} and is used by Kml file to render icons. + * + * Created: 24 juil. 2010 + * + * @author fdesbois <fdesbois at codelutin.com> + * @version $Id$ + */ +public class IconSizeHelper { + + /** Step for scale */ + private static final double SCALE_STEP = 0.125; + + /** Reference size (scale 1.0) */ + private static final int REF_SIZE = 32; + + /** + * Number of available size or steps for scale + * (max scale = BASE_SCALE + NB_STEPS * SCALE_STEP) + */ + private static final int NB_STEPS = 10; + + /** Base scale used for minimum size */ + private static final double BASE_SCALE = 0.5; + + /** Divided calculated from maxReference used to calculate scale */ + protected int divided; + + protected double reference; + + /** + * Initialize IconSizeHelper using {@code data}. The max total found from + * the collection will be used as reference for this instance. + * + * @param data Collection of PieChartData that contains total elements for each data + */ + public IconSizeHelper(Collection<PieChartData> data) { + double max = 0.; + for (PieChartData curr : data) { + if (curr.getTotal() > max) { + max = curr.getTotal(); + } + } + this.reference = max; + init(); + } + + public IconSizeHelper(double maxReference) { + this.reference = maxReference; + init(); + } + + /** + * Initialize the divided to calculate the scale. + */ + protected void init() { + // Ex : 215 / 15 = 14.33 --> res = 15 + Double res = reference / (double)NB_STEPS; + res = Math.ceil(res); + divided = res.intValue(); + } + + /** + * Return the reference used to calculate scale and size. + * + * @return the reference initialized on instantiation. + */ + public double getReference() { + return reference; + } + + /** + * Retrieve the scale for {@code nbElements}. This scale is used for IconStyle + * in Kml file. + * + * @param nbElements Number of elements to check the correct scale. + * @return the scale calculated + */ + public double getScale(double nbElements) { + // Ex : 160 / 15 = 10.66 --> multiplicator = 11 + Double res = nbElements / (double)divided; + res = Math.ceil(res); + int multiplicator = res.intValue(); + // Ex : scale = 11 * 0.125 = 1.375 + double scale = multiplicator * SCALE_STEP; + return BASE_SCALE + scale; + } + + /** + * Retrieve the size for {@code nbElements}. + * + * @param nbElements The number of elements to check the correct size. + * @return the size calculated + */ + public int getSize(double nbElements) { + return getSizeFromScale(getScale(nbElements)); + } + + /** + * Retrieve the size from a previously calculated {@code scale}. + * + * @param scale Scale to use with {@link #REF_SIZE}. + * @return the size calculated + */ + public int getSizeFromScale(double scale) { + // Ex : size = 1.375 * 32 = 44 px + Double size = scale * (double)REF_SIZE; + return size.intValue(); + } + +} Property changes on: trunk/wao-business/src/main/java/fr/ifremer/wao/io/kml/IconSizeHelper.java ___________________________________________________________________ Added: svn:keywords + Id HeadURL Modified: trunk/wao-business/src/main/java/fr/ifremer/wao/io/kml/KmlWriter.java =================================================================== --- trunk/wao-business/src/main/java/fr/ifremer/wao/io/kml/KmlWriter.java 2010-07-24 18:10:31 UTC (rev 628) +++ trunk/wao-business/src/main/java/fr/ifremer/wao/io/kml/KmlWriter.java 2010-07-24 21:56:24 UTC (rev 629) @@ -36,7 +36,7 @@ public void init(); - public void record(GeoPoint geo, String iconUrl, String description); + public void record(GeoPoint geo, String iconUrl, double scale, String description); public void write(OutputStream stream) throws IOException; Modified: trunk/wao-business/src/main/java/fr/ifremer/wao/service/ServiceCartographyImpl.java =================================================================== --- trunk/wao-business/src/main/java/fr/ifremer/wao/service/ServiceCartographyImpl.java 2010-07-24 18:10:31 UTC (rev 628) +++ trunk/wao-business/src/main/java/fr/ifremer/wao/service/ServiceCartographyImpl.java 2010-07-24 21:56:24 UTC (rev 629) @@ -24,26 +24,22 @@ import fr.ifremer.wao.WaoContext; import fr.ifremer.wao.WaoDAOHelper; import fr.ifremer.wao.WaoException; -import fr.ifremer.wao.WaoQueryBuilder; -import fr.ifremer.wao.WaoQueryHelper; import fr.ifremer.wao.bean.ContactFilter; import fr.ifremer.wao.bean.ContactPieChartConstant; import fr.ifremer.wao.bean.ContactState; import fr.ifremer.wao.bean.PieChartData; import fr.ifremer.wao.entity.BoatDistrict; import fr.ifremer.wao.entity.BoatDistrictDAO; -import fr.ifremer.wao.entity.Company; -import fr.ifremer.wao.entity.ContactDAO; import fr.ifremer.wao.io.BoatDistrictData; import fr.ifremer.wao.io.ImportResults; import fr.ifremer.wao.io.ImportResultsImpl; +import fr.ifremer.wao.io.kml.IconSizeHelper; import fr.ifremer.wao.io.kml.KmlIOFactory; import fr.ifremer.wao.io.kml.KmlReader; import fr.ifremer.wao.io.kml.KmlWriter; import org.apache.commons.io.FileUtils; import org.nuiton.topia.TopiaContext; import org.nuiton.topia.TopiaException; -import org.nuiton.topia.framework.TopiaQuery; import org.slf4j.Logger; import org.slf4j.LoggerFactory; @@ -170,19 +166,8 @@ Map<String, PieChartData> districts = serviceSynthesis.getContactPieChartDataByBoatDistrict(filter); - // Get the max of nbContacts to calculate size of each pieChart -// ContactDAO contactDAO = WaoDAOHelper.getContactDAO(transaction); -// WaoQueryBuilder builder = contactDAO.createQueryWithBoatDistrictCoordinates(filter); -// WaoQueryHelper.BoatDistrictProperty boatDistrictProperty = -// builder.getContactProperty().boatProperty().boatDistrictProperty(); -// -// long max = builder.getQuery(). -// addGroup(boatDistrictProperty.topiaId()). -// executeToInteger(transaction, "MAX(COUNT(*))"); -// -// if (logger.isDebugEnabled()) { -// logger.debug("Max contacts : " + max); -// } + // Create new IconSizeHelper to calculate icon size and scale for pieCharts + IconSizeHelper sizeHelper = new IconSizeHelper(districts.values()); NumberFormat numberFormat = NumberFormat.getInstance(); // Only 2 digits maximum after the comma @@ -243,9 +228,18 @@ append(" (").append(other).append(" %)"). append("</p>\n"); - String miniChartUrl = serviceChart.getPieChartUrl(data, true); + double scale = sizeHelper.getScale(data.getTotal()); + int size = sizeHelper.getSizeFromScale(scale); - writer.record(district, miniChartUrl, description.toString()); + if (logger.isDebugEnabled()) { + logger.debug("Chart : nbElements = " + data.getTotal() + + " _ size = " + size + " _ scale = " + scale + + " _ ref = " + sizeHelper.getReference()); + } + + String miniChartUrl = serviceChart.getPieChartUrl(data, size, true); + + writer.record(district, miniChartUrl, scale, description.toString()); } File file = File.createTempFile("wao-contacts-", ".kml"); @@ -264,7 +258,7 @@ return new FileInputStream(file); } - + protected double getSeriesValue(PieChartData data, ContactPieChartConstant series) { return data.getSeries(series.ordinal()).getValue(); } Modified: trunk/wao-business/src/main/java/fr/ifremer/wao/service/ServiceChartEmpty.java =================================================================== --- trunk/wao-business/src/main/java/fr/ifremer/wao/service/ServiceChartEmpty.java 2010-07-24 18:10:31 UTC (rev 628) +++ trunk/wao-business/src/main/java/fr/ifremer/wao/service/ServiceChartEmpty.java 2010-07-24 21:56:24 UTC (rev 629) @@ -38,10 +38,11 @@ private static final Logger logger = LoggerFactory.getLogger(ServiceChartEmpty.class); @Override - public String getPieChartUrl(PieChartData data, boolean thumb) { + public String getPieChartUrl(PieChartData data, int size, boolean thumb) { if (logger.isDebugEnabled()) { logger.debug("data : " + data); + logger.debug("size : " + size); logger.debug("thumb : " + thumb); } Modified: trunk/wao-business/src/main/xmi/wao.zargo =================================================================== (Binary files differ) Modified: trunk/wao-business/src/test/java/fr/ifremer/wao/bean/PieChartDataImplTest.java =================================================================== --- trunk/wao-business/src/test/java/fr/ifremer/wao/bean/PieChartDataImplTest.java 2010-07-24 18:10:31 UTC (rev 628) +++ trunk/wao-business/src/test/java/fr/ifremer/wao/bean/PieChartDataImplTest.java 2010-07-24 21:56:24 UTC (rev 629) @@ -35,12 +35,13 @@ @Test public void testSetData() throws Exception { - String input = "Réalisé,20.0,FFFFFF|Refusé,30.0,FFFFFF|Autres,50.0,FFFFFF"; + String input = "Réalisé,20.0,FFFFFF|Refusé,30.0,FFFFFF|Autres,50.0,FFFFFF::18.0"; PieChartData data = new PieChartDataImpl(); data.setData(input); Assert.assertEquals(3, data.getSeries().size()); + Assert.assertEquals(18.0, data.getTotal(), 0); PieChartSeries series0 = data.getSeries(0); Assert.assertEquals("Réalisé", series0.getLabel()); @@ -63,6 +64,8 @@ PieChartData data = new PieChartDataImpl(); + data.setTotal(18.0); + PieChartSeries series0 = new PieChartSeriesImpl(); series0.setLabel("Réalisé"); series0.setValue(20.0); @@ -81,7 +84,7 @@ series2.setColor("FFFFFF"); data.addSeries(series2); - String expected = "Réalisé,20.0,FFFFFF|Refusé,30.0,FFFFFF|Autres,50.0,FFFFFF"; + String expected = "Réalisé,20.0,FFFFFF|Refusé,30.0,FFFFFF|Autres,50.0,FFFFFF:18.0"; Assert.assertEquals(expected, data.getData()); } Modified: trunk/wao-ui/src/main/java/fr/ifremer/wao/ui/pages/KmlLoader.java =================================================================== --- trunk/wao-ui/src/main/java/fr/ifremer/wao/ui/pages/KmlLoader.java 2010-07-24 18:10:31 UTC (rev 628) +++ trunk/wao-ui/src/main/java/fr/ifremer/wao/ui/pages/KmlLoader.java 2010-07-24 21:56:24 UTC (rev 629) @@ -70,7 +70,7 @@ * * @param activationContext Context of the page. * @return the StreamResponse that contains Kml data. - * @throws IOException + * @throws IOException from stream error * @see KmlLoaderStrategy#getStreamResponse(WaoFilter) */ StreamResponse onActivate(Object... activationContext) throws IOException { Modified: trunk/wao-ui/src/main/java/fr/ifremer/wao/ui/pages/PieChart.java =================================================================== --- trunk/wao-ui/src/main/java/fr/ifremer/wao/ui/pages/PieChart.java 2010-07-24 18:10:31 UTC (rev 628) +++ trunk/wao-ui/src/main/java/fr/ifremer/wao/ui/pages/PieChart.java 2010-07-24 21:56:24 UTC (rev 629) @@ -46,10 +46,10 @@ @InjectService("serviceChartServlet") private ServiceChart chartServlet; - URL onActivate(PieChartData data, boolean thumb) + URL onActivate(PieChartData data, int size, boolean thumb) throws MalformedURLException { - return new URL(chartServlet.getPieChartUrl(data, thumb)); + return new URL(chartServlet.getPieChartUrl(data, size, thumb)); } } Modified: trunk/wao-ui/src/main/java/fr/ifremer/wao/ui/services/ServiceChartImpl.java =================================================================== --- trunk/wao-ui/src/main/java/fr/ifremer/wao/ui/services/ServiceChartImpl.java 2010-07-24 18:10:31 UTC (rev 628) +++ trunk/wao-ui/src/main/java/fr/ifremer/wao/ui/services/ServiceChartImpl.java 2010-07-24 21:56:24 UTC (rev 629) @@ -51,11 +51,11 @@ } @Override - public String getPieChartUrl(PieChartData data, boolean thumb) { + public String getPieChartUrl(PieChartData data, int size, boolean thumb) { // Create link to PieChart. This page is used to redirect // data to the correct chartServlet Link link = pageRender.createPageRenderLinkWithContext( - PieChart.class, data, thumb); + PieChart.class, data, size, thumb); return getBaseUrl() + link.toAbsoluteURI(); } Modified: trunk/wao-ui/src/main/java/fr/ifremer/wao/ui/services/ServiceChartServlet.java =================================================================== --- trunk/wao-ui/src/main/java/fr/ifremer/wao/ui/services/ServiceChartServlet.java 2010-07-24 18:10:31 UTC (rev 628) +++ trunk/wao-ui/src/main/java/fr/ifremer/wao/ui/services/ServiceChartServlet.java 2010-07-24 21:56:24 UTC (rev 629) @@ -26,6 +26,8 @@ import fr.ifremer.wao.bean.PieChartSeries; import fr.ifremer.wao.service.ServiceChart; import org.nuiton.util.StringUtil; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; import java.util.ArrayList; import java.util.Date; @@ -43,6 +45,8 @@ */ public class ServiceChartServlet implements ServiceChart { + private static final Logger logger = LoggerFactory.getLogger(ServiceChartServlet.class); + private static final String PROPERTY_SEPARATOR = "&"; private static final String PROPERTY_VALUE_SEPARATOR = ","; private static final String PROPERTY_LABEL_SEPARATOR = "|"; @@ -62,12 +66,12 @@ private static final String PIE_CHART_MINI_TYPE = PROPERTY_TYPE + "p3"; private static final String PIE_CHART_MAXI_TYPE = PROPERTY_TYPE + "p3"; - private static final String PIE_CHART_MINI_SIZE = PROPERTY_SIZE + "28x28"; + private static final String PIE_CHART_MINI_SIZE = PROPERTY_SIZE + "32x32"; private static final String PIE_CHART_MAXI_SIZE = PROPERTY_SIZE + PIE_CHART_MAXI_WIDTH + "x" + PIE_CHART_MAXI_HEIGHT; @Override - public String getPieChartUrl(PieChartData data, boolean thumb) { + public String getPieChartUrl(PieChartData data, int size, boolean thumb) { List<String> labelsList = new ArrayList<String>(); List<Double> valuesList = new ArrayList<Double>(); @@ -88,9 +92,17 @@ StringBuilder url = new StringBuilder(getBaseUrl()); if (thumb) { - url.append(PIE_CHART_MINI_TYPE). - append(PROPERTY_SEPARATOR).append(PIE_CHART_MINI_SIZE); + url.append(PIE_CHART_MINI_TYPE).append(PROPERTY_SEPARATOR); + // Size + if (size != -1) { + url.append(PROPERTY_SIZE). + append(size).append('x').append(size); + // Default size for little chart + } else { + url.append(PIE_CHART_MINI_SIZE); + } + // Labels only on big image } else { String labels = StringUtil.join(labelsList, @@ -112,7 +124,7 @@ @Override public String getHtmlImgTag(PieChartData data, String text, boolean thumb) { StringBuilder builder = new StringBuilder("<img src=\""). - append(getPieChartUrl(data, thumb)). + append(getPieChartUrl(data, -1, thumb)). append("\" alt=\""). append(text). append("\" height=\"").
participants (1)
-
fdesbois@users.labs.libre-entreprise.org