Author: fdesbois Date: 2010-07-05 16:36:59 +0000 (Mon, 05 Jul 2010) New Revision: 588 Log: Evo #2352 : Cartography for contacts : - Rename KmlReader interface to generic - Add KmlWriter - Change implementation of PieChartData (use PieChartSeries bean) - Use proper query to contactPieChart case (with boatDistrict) Added: trunk/wao-business/src/main/java/fr/ifremer/wao/bean/ContactPieChartConstant.java trunk/wao-business/src/main/java/fr/ifremer/wao/bean/PieChartSeriesImpl.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/KmlIOFactory.java trunk/wao-business/src/main/java/fr/ifremer/wao/io/kml/KmlReader.java trunk/wao-business/src/main/java/fr/ifremer/wao/io/kml/KmlWriter.java Removed: trunk/wao-business/src/main/java/fr/ifremer/wao/io/kml/BoatDistrictKmlReader.java trunk/wao-business/src/main/java/fr/ifremer/wao/io/kml/BoatDistrictKmlReaderFactory.java Modified: trunk/changelog.txt trunk/wao-business/src/main/java/fr/ifremer/wao/bean/PieChartDataImpl.java trunk/wao-business/src/main/java/fr/ifremer/wao/io/kml/BoatDistrictKmlReaderJak.java trunk/wao-business/src/main/java/fr/ifremer/wao/io/kml/BoatDistrictKmlReaderXpp3.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/java/fr/ifremer/wao/service/ServiceSynthesisImpl.java trunk/wao-business/src/main/resources/i18n/wao-business-en_GB.properties trunk/wao-business/src/main/resources/i18n/wao-business-fr_FR.properties trunk/wao-business/src/main/xmi/wao.zargo trunk/wao-business/src/test/java/fr/ifremer/wao/bean/PieChartDataImplTest.java trunk/wao-business/src/test/java/fr/ifremer/wao/service/ServiceCartographyImplTest.java trunk/wao-business/src/test/java/fr/ifremer/wao/service/ServiceSynthesisImplTest.java trunk/wao-ui/src/main/java/fr/ifremer/wao/ui/services/ServiceChartServlet.java Modified: trunk/changelog.txt =================================================================== --- trunk/changelog.txt 2010-07-01 16:50:15 UTC (rev 587) +++ trunk/changelog.txt 2010-07-05 16:36:59 UTC (rev 588) @@ -3,6 +3,17 @@ Historique des versions +1.5 +--- + +Evolutions +++++++++++ + +Mise à jour librairies +++++++++++++++++++++++ + +- **mavenpom4labs** 2.2 -> 2.2.1 [http://maven-site.nuiton.org/mavenpom/mavenpom4labs] + 1.4.1 ----- Added: trunk/wao-business/src/main/java/fr/ifremer/wao/bean/ContactPieChartConstant.java =================================================================== --- trunk/wao-business/src/main/java/fr/ifremer/wao/bean/ContactPieChartConstant.java (rev 0) +++ trunk/wao-business/src/main/java/fr/ifremer/wao/bean/ContactPieChartConstant.java 2010-07-05 16:36:59 UTC (rev 588) @@ -0,0 +1,33 @@ +package fr.ifremer.wao.bean; + +/** + * Created: 5 juil. 2010 + * + * @author fdesbois <fdesbois at codelutin.com> + * @version $Id$ + */ +public enum ContactPieChartConstant { + + REALIZED("Réalisés", "0000FF"), + + REFUSED("Refusés", "FF0000"), + + OTHER("Autres", "FFFF10"); + + String label; + + String color; + + ContactPieChartConstant(String label, String color) { + this.label = label; + this.color = color; + } + + public String getLabel() { + return label; + } + + public String getColor() { + return color; + } +} 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-01 16:50:15 UTC (rev 587) +++ trunk/wao-business/src/main/java/fr/ifremer/wao/bean/PieChartDataImpl.java 2010-07-05 16:36:59 UTC (rev 588) @@ -4,6 +4,7 @@ import java.util.ArrayList; import java.util.Arrays; +import java.util.List; /** * Created: 1 juil. 2010 @@ -13,65 +14,63 @@ */ public class PieChartDataImpl extends PieChartData { - private static final String VALUE_SEPARATOR = ","; + private static final String SERIES_SEPARATOR = "|"; - private static final String PROPERTY_SEPARATOR = "|"; + protected double total; public PieChartDataImpl() { - labels = new ArrayList<String>(); - values = new ArrayList<Double>(); - colors = new ArrayList<String>(); + series = new ArrayList<PieChartSeries>(); } + @Override + public void incValue(int index, double value) { + PieChartSeries curr = series.get(index); + curr.inc(value); + total += value; + } @Override - public void addData(String label, Double value, String color) { - labels.add(label); - values.add(value); - colors.add(color); + public void addSeries(PieChartSeries series) { + this.series.add(series); } + @Override + public void computeSeries() { + for (PieChartSeries curr : series) { + double value = curr.getValue(); + // calculate percentage + curr.setValue(value / total * 100); + } + } + /** * This method is used to set all data from a input string {@code data}. * The data as string is created using {@link #getData()}. * * @param data input string of data to set + * @see PieChartSeriesImpl#create(String) */ @Override public void setData(String data) { // need to escape separator | - String[] properties = data.split("\\" + PROPERTY_SEPARATOR); - labels.clear(); - for (String value : properties[0].split(VALUE_SEPARATOR)) { - labels.add(value); + for (String curr : data.split("\\" + SERIES_SEPARATOR)) { + addSeries(PieChartSeriesImpl.create(curr)); } - values.clear(); - for (String value : properties[1].split(VALUE_SEPARATOR)) { - values.add(Double.valueOf(value)); - } - colors.clear(); - for (String value : properties[2].split(VALUE_SEPARATOR)) { - colors.add(value); - } } /** - * Concatenate all data as a string. Each property (labels, values and - * colors) are separated by {@link #PROPERTY_SEPARATOR} and each value - * are separated by {@link #VALUE_SEPARATOR}. Properties order is : - * labels, values and colors. + * Concatenate all data as a string. Each series are concatenate using + * {@link #SERIES_SEPARATOR}. * * @return a String corresponding to all data + * @see PieChartSeriesImpl#TO_STRING */ @Override public String getData() { - String[] data = new String[] { - StringUtil.join(labels, VALUE_SEPARATOR, true), - StringUtil.join(values, VALUE_SEPARATOR, true), - StringUtil.join(colors, VALUE_SEPARATOR, true) - }; - String result = StringUtil.join(Arrays.asList(data), PROPERTY_SEPARATOR, true); + String result = StringUtil.join(series, + PieChartSeriesImpl.TO_STRING, SERIES_SEPARATOR, true); + return result; } Added: trunk/wao-business/src/main/java/fr/ifremer/wao/bean/PieChartSeriesImpl.java =================================================================== --- trunk/wao-business/src/main/java/fr/ifremer/wao/bean/PieChartSeriesImpl.java (rev 0) +++ trunk/wao-business/src/main/java/fr/ifremer/wao/bean/PieChartSeriesImpl.java 2010-07-05 16:36:59 UTC (rev 588) @@ -0,0 +1,59 @@ +package fr.ifremer.wao.bean; + +import org.nuiton.util.StringUtil; + +/** + * Created: 5 juil. 2010 + * + * @author fdesbois <fdesbois at codelutin.com> + * @version $Id$ + */ +public class PieChartSeriesImpl extends PieChartSeries { + + protected static final String PROPERTY_SEPARATOR = ","; + + /** + * Implement {@link StringUtil.ToString} to represent a PieChartSeries + * as a string. + */ + public static final StringUtil.ToString<PieChartSeries> TO_STRING = + new StringUtil.ToString<PieChartSeries>() { + + @Override + public String toString(PieChartSeries series) { + StringBuilder builder = + new StringBuilder(series.getLabel()). + append(PROPERTY_SEPARATOR). + append(series.getValue()). + append(PROPERTY_SEPARATOR). + append(series.getColor()); + return builder.toString(); + } + }; + + /** + * This method is used to create a PieChartSeries from a {@code str} input + * string. The creation depends on implementation of {@link #TO_STRING} + * + * @param str String to create a new PieChartSeries + * @return a new PieChartSeries from a String + */ + public static PieChartSeries create(String str) { + + PieChartSeries series = new PieChartSeriesImpl(); + + String[] properties = str.split(PROPERTY_SEPARATOR); + + series.setLabel(properties[0]); + series.setValue(Double.valueOf(properties[1])); + series.setColor(properties[2]); + + return series; + } + + @Override + public void inc(double value) { + this.value += value; + } + +} Deleted: trunk/wao-business/src/main/java/fr/ifremer/wao/io/kml/BoatDistrictKmlReader.java =================================================================== --- trunk/wao-business/src/main/java/fr/ifremer/wao/io/kml/BoatDistrictKmlReader.java 2010-07-01 16:50:15 UTC (rev 587) +++ trunk/wao-business/src/main/java/fr/ifremer/wao/io/kml/BoatDistrictKmlReader.java 2010-07-05 16:36:59 UTC (rev 588) @@ -1,62 +0,0 @@ -package fr.ifremer.wao.io.kml; - -import fr.ifremer.wao.io.BoatDistrictData; - -import java.io.IOException; -import java.io.InputStream; - -/** - * Kml reader for BoatDistrict. Typical usage : - * <pre> - * BoatDistrictKmlReader reader = new ....(); - * try { - * reader.init(inputStream); - * while (reader.hasNext()) { - * BoatDistrictData data = reader.readNext(); - * // data treatment - * } - * } finally { - * reader.close(); - * } - * </pre> - * Known implementations : - * {@link BoatDistrictKmlReaderJak} and {@link BoatDistrictKmlReaderXpp3} - * <p /> - * Created: 30 juin 2010 - * - * @author fdesbois <fdesbois at codelutin.com> - * @version $Id$ - * @since 1.5 - * @see BoatDistrictKmlReaderFactory - */ -public interface BoatDistrictKmlReader { - - /** - * Initialize the Reader with {@code stream} as input data (kml file). - * - * @param stream Stream data from Kml file - * @throws IOException for error on initialization - */ - void init(InputStream stream) throws IOException; - - /** - * Test if there is next element to read. - * - * @return true if other element can be read - */ - boolean hasNext(); - - /** - * Read the next BoatDistrictData element. - * - * @return the next BoatDistrictData - */ - BoatDistrictData readNext(); - - /** - * Close the reader. - * - * @throws IOException for error on close - */ - void close() throws IOException; -} Deleted: trunk/wao-business/src/main/java/fr/ifremer/wao/io/kml/BoatDistrictKmlReaderFactory.java =================================================================== --- trunk/wao-business/src/main/java/fr/ifremer/wao/io/kml/BoatDistrictKmlReaderFactory.java 2010-07-01 16:50:15 UTC (rev 587) +++ trunk/wao-business/src/main/java/fr/ifremer/wao/io/kml/BoatDistrictKmlReaderFactory.java 2010-07-05 16:36:59 UTC (rev 588) @@ -1,44 +0,0 @@ -package fr.ifremer.wao.io.kml; - -import java.io.IOException; -import java.io.InputStream; - -/** - * Factory for BoatDistrictKmlReader. - * <p /> - * Created: 30 juin 2010 - * - * @author fdesbois <fdesbois at codelutin.com> - * @version $Id$ - */ -public class BoatDistrictKmlReaderFactory { - - /** - * Create a new Reader using Jak. - * - * @param input InputStream for initialization - * @return a new instance of {@link BoatDistrictKmlReaderJak} - * @throws IOException for initilization errors - */ - public static BoatDistrictKmlReader newReaderJak(InputStream input) - throws IOException { - BoatDistrictKmlReader reader = new BoatDistrictKmlReaderJak(); - reader.init(input); - return reader; - } - - /** - * Create a new Reader using Xpp3. - * - * @param input InputStream for initialization - * @return a new instance of {@link BoatDistrictKmlReaderXpp3} - * @throws IOException for initilization errors - */ - public static BoatDistrictKmlReader newReaderXpp3(InputStream input) - throws IOException { - BoatDistrictKmlReader reader = new BoatDistrictKmlReaderXpp3(); - reader.init(input); - return reader; - } - -} Modified: trunk/wao-business/src/main/java/fr/ifremer/wao/io/kml/BoatDistrictKmlReaderJak.java =================================================================== --- trunk/wao-business/src/main/java/fr/ifremer/wao/io/kml/BoatDistrictKmlReaderJak.java 2010-07-01 16:50:15 UTC (rev 587) +++ trunk/wao-business/src/main/java/fr/ifremer/wao/io/kml/BoatDistrictKmlReaderJak.java 2010-07-05 16:36:59 UTC (rev 588) @@ -8,10 +8,8 @@ import de.micromata.opengis.kml.v_2_2_0.Point; import de.micromata.opengis.kml.v_2_2_0.SchemaData; import de.micromata.opengis.kml.v_2_2_0.SimpleData; -import fr.ifremer.wao.entity.BoatDistrict; import fr.ifremer.wao.io.BoatDistrictData; import fr.ifremer.wao.io.BoatDistrictDataImpl; -import org.apache.commons.lang.StringUtils; import java.io.IOException; import java.io.InputStream; @@ -25,7 +23,7 @@ * @author fdesbois <fdesbois at codelutin.com> * @version $Id$ */ -public class BoatDistrictKmlReaderJak implements BoatDistrictKmlReader { +public class BoatDistrictKmlReaderJak implements KmlReader<BoatDistrictData> { List<Placemark> districts; @@ -35,6 +33,10 @@ public void init(InputStream stream) throws IOException { Kml kml = Kml.unmarshal(stream); + if (kml == null) { + throw new IOException ("Kml stream can't be unmarshall, check the file format."); + } + Document document = (Document) kml.getFeature(); Folder folder = (Folder) document.getFeature().get(0); Modified: trunk/wao-business/src/main/java/fr/ifremer/wao/io/kml/BoatDistrictKmlReaderXpp3.java =================================================================== --- trunk/wao-business/src/main/java/fr/ifremer/wao/io/kml/BoatDistrictKmlReaderXpp3.java 2010-07-01 16:50:15 UTC (rev 587) +++ trunk/wao-business/src/main/java/fr/ifremer/wao/io/kml/BoatDistrictKmlReaderXpp3.java 2010-07-05 16:36:59 UTC (rev 588) @@ -14,7 +14,6 @@ import java.io.IOException; import java.io.InputStream; import java.io.InputStreamReader; -import java.io.StringReader; import java.util.Iterator; import java.util.List; @@ -24,7 +23,7 @@ * @author fdesbois <fdesbois at codelutin.com> * @version $Id$ */ -public class BoatDistrictKmlReaderXpp3 implements BoatDistrictKmlReader { +public class BoatDistrictKmlReaderXpp3 implements KmlReader<BoatDistrictData> { private static final Logger logger = LoggerFactory.getLogger(BoatDistrictKmlReaderXpp3.class); Added: 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 (rev 0) +++ trunk/wao-business/src/main/java/fr/ifremer/wao/io/kml/ContactKmlWriterJak.java 2010-07-05 16:36:59 UTC (rev 588) @@ -0,0 +1,79 @@ +package fr.ifremer.wao.io.kml; + +import de.micromata.opengis.kml.v_2_2_0.Document; +import de.micromata.opengis.kml.v_2_2_0.Folder; +import de.micromata.opengis.kml.v_2_2_0.Icon; +import de.micromata.opengis.kml.v_2_2_0.Kml; +import de.micromata.opengis.kml.v_2_2_0.Placemark; +import de.micromata.opengis.kml.v_2_2_0.Point; +import de.micromata.opengis.kml.v_2_2_0.Style; +import fr.ifremer.wao.entity.GeoPoint; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; + +import java.io.FileNotFoundException; +import java.io.OutputStream; + +/** + * Created: 5 juil. 2010 + * + * @author fdesbois <fdesbois at codelutin.com> + * @version $Id$ + */ +public class ContactKmlWriterJak implements KmlWriter { + + private static final Logger logger = LoggerFactory.getLogger(ContactKmlWriterJak.class); + + Kml kml; + + Document document; + + Folder folder; + + @Override + public void init() { + kml = new Kml(); + + document = kml.createAndSetDocument(); + + folder = document.createAndAddFolder(); + folder.withName("Nombre de contacts répartis par quartier des navires"). + withOpen(true); + } + + @Override + public void record(GeoPoint geo, String iconUrl, String description) { + + if (geo.getLatitude() == null || geo.getLongitude() == null) { + throw new IllegalArgumentException("Can't record geopoint with null latitude or longitude"); + } + + String styleId = "style_" + geo.getCode(); + Style style = document.createAndAddStyle().withId(styleId); + + Icon icon = new Icon().withHref(iconUrl); + + style.createAndSetIconStyle().withScale(5.0).withIcon(icon); + style.createAndSetLabelStyle().withColor("ff43b3ff").withScale(5.0); + + Placemark placemark = folder.createAndAddPlacemark(). + withName(geo.getName()). + withStyleUrl("#" + styleId). + withDescription(description); + + // coordinates and distance (zoom level) of the viewer + placemark.createAndSetLookAt(). + withLongitude(geo.getLongitude()). + withLatitude(geo.getLatitude()). + withRange(12000000); + + placemark.createAndSetPoint(). + addToCoordinates(geo.getLongitude(), geo.getLatitude()); + } + + @Override + public void write(OutputStream stream) throws FileNotFoundException { + kml.marshal(stream); + } + +} Copied: trunk/wao-business/src/main/java/fr/ifremer/wao/io/kml/KmlIOFactory.java (from rev 584, trunk/wao-business/src/main/java/fr/ifremer/wao/io/kml/BoatDistrictKmlReaderFactory.java) =================================================================== --- trunk/wao-business/src/main/java/fr/ifremer/wao/io/kml/KmlIOFactory.java (rev 0) +++ trunk/wao-business/src/main/java/fr/ifremer/wao/io/kml/KmlIOFactory.java 2010-07-05 16:36:59 UTC (rev 588) @@ -0,0 +1,52 @@ +package fr.ifremer.wao.io.kml; + +import fr.ifremer.wao.io.BoatDistrictData; + +import java.io.IOException; +import java.io.InputStream; + +/** + * Factory for KmlReader. + * <p /> + * Created: 30 juin 2010 + * + * @author fdesbois <fdesbois at codelutin.com> + * @version $Id$ + */ +public class KmlIOFactory { + + /** + * Create a new Reader using Jak. + * + * @param input InputStream for initialization + * @return a new instance of {@link BoatDistrictKmlReaderJak} + * @throws IOException for initilization errors + */ + public static KmlReader<BoatDistrictData> newBoatDistrictReaderJak(InputStream input) + throws IOException { + KmlReader<BoatDistrictData> reader = new BoatDistrictKmlReaderJak(); + reader.init(input); + return reader; + } + + /** + * Create a new Reader using Xpp3. + * + * @param input InputStream for initialization + * @return a new instance of {@link BoatDistrictKmlReaderXpp3} + * @throws IOException for initilization errors + */ + public static KmlReader<BoatDistrictData> newBoatDistrictReaderXpp3(InputStream input) + throws IOException { + KmlReader<BoatDistrictData> reader = new BoatDistrictKmlReaderXpp3(); + reader.init(input); + return reader; + } + + public static KmlWriter newContactWriterJak() { + KmlWriter writer = new ContactKmlWriterJak(); + writer.init(); + return writer; + } + +} Copied: trunk/wao-business/src/main/java/fr/ifremer/wao/io/kml/KmlReader.java (from rev 584, trunk/wao-business/src/main/java/fr/ifremer/wao/io/kml/BoatDistrictKmlReader.java) =================================================================== --- trunk/wao-business/src/main/java/fr/ifremer/wao/io/kml/KmlReader.java (rev 0) +++ trunk/wao-business/src/main/java/fr/ifremer/wao/io/kml/KmlReader.java 2010-07-05 16:36:59 UTC (rev 588) @@ -0,0 +1,62 @@ +package fr.ifremer.wao.io.kml; + +import fr.ifremer.wao.io.BoatDistrictData; + +import java.io.IOException; +import java.io.InputStream; + +/** + * Kml reader for BoatDistrict. Typical usage : + * <pre> + * KmlReader reader = new ....(); + * try { + * reader.init(inputStream); + * while (reader.hasNext()) { + * BoatDistrictData data = reader.readNext(); + * // data treatment + * } + * } finally { + * reader.close(); + * } + * </pre> + * Known implementations : + * {@link BoatDistrictKmlReaderJak} and {@link BoatDistrictKmlReaderXpp3} + * <p /> + * Created: 30 juin 2010 + * + * @author fdesbois <fdesbois at codelutin.com> + * @version $Id$ + * @since 1.5 + * @see KmlIOFactory + */ +public interface KmlReader<D> { + + /** + * Initialize the Reader with {@code stream} as input data (kml file). + * + * @param stream Stream data from Kml file + * @throws IOException for error on initialization + */ + void init(InputStream stream) throws IOException; + + /** + * Test if there is next element to read. + * + * @return true if other element can be read + */ + boolean hasNext(); + + /** + * Read the next BoatDistrictData element. + * + * @return the next BoatDistrictData + */ + D readNext(); + + /** + * Close the reader. + * + * @throws IOException for error on close + */ + void close() throws IOException; +} Added: 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 (rev 0) +++ trunk/wao-business/src/main/java/fr/ifremer/wao/io/kml/KmlWriter.java 2010-07-05 16:36:59 UTC (rev 588) @@ -0,0 +1,22 @@ +package fr.ifremer.wao.io.kml; + +import fr.ifremer.wao.entity.GeoPoint; + +import java.io.IOException; +import java.io.OutputStream; + +/** + * Created: 5 juil. 2010 + * + * @author fdesbois <fdesbois at codelutin.com> + * @version $Id$ + */ +public interface KmlWriter { + + public void init(); + + public void record(GeoPoint geo, String iconUrl, 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-01 16:50:15 UTC (rev 587) +++ trunk/wao-business/src/main/java/fr/ifremer/wao/service/ServiceCartographyImpl.java 2010-07-05 16:36:59 UTC (rev 588) @@ -3,26 +3,31 @@ import fr.ifremer.wao.WaoContext; import fr.ifremer.wao.WaoDAOHelper; import fr.ifremer.wao.WaoException; -import fr.ifremer.wao.bean.ContactState; -import fr.ifremer.wao.bean.ContactStateStatistics; +import fr.ifremer.wao.WaoQueryHelper; import fr.ifremer.wao.bean.PieChartData; import fr.ifremer.wao.entity.Company; import fr.ifremer.wao.io.BoatDistrictData; -import fr.ifremer.wao.io.kml.BoatDistrictKmlReader; -import fr.ifremer.wao.io.kml.BoatDistrictKmlReaderFactory; +import fr.ifremer.wao.io.kml.KmlReader; +import fr.ifremer.wao.io.kml.KmlIOFactory; import fr.ifremer.wao.io.ImportResults; import fr.ifremer.wao.io.ImportResultsImpl; import fr.ifremer.wao.entity.BoatDistrict; import fr.ifremer.wao.entity.BoatDistrictDAO; +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; +import java.io.File; +import java.io.FileInputStream; +import java.io.FileOutputStream; import java.io.IOException; import java.io.InputStream; -import java.util.Collection; -import java.util.HashMap; +import java.io.OutputStream; +import java.util.List; import java.util.Map; /** @@ -80,8 +85,8 @@ BoatDistrictDAO dao = WaoDAOHelper.getBoatDistrictDAO(transaction); // Instantiate KmlReader for BoatDistrict - BoatDistrictKmlReader reader = - BoatDistrictKmlReaderFactory.newReaderJak(input); + KmlReader<BoatDistrictData> reader = + KmlIOFactory.newBoatDistrictReaderJak(input); int i = 0; while (reader.hasNext()) { @@ -129,13 +134,43 @@ @Override protected InputStream executeExportContactStatisticsKml(TopiaContext transaction, - Company company) { + Company company) + throws TopiaException, IOException { - PieChartData data = serviceSynthesis.getContactPieChartData(company); + KmlWriter writer = KmlIOFactory.newContactWriterJak(); - String miniChartUrl = serviceChart.getPieChartUrl(data, true); - String bigChartUrl = serviceChart.getPieChartUrl(data, false); + Map<BoatDistrict, PieChartData> districts = + serviceSynthesis.getContactPieChartDataByBoatDistrict(company); - return null; + for (BoatDistrict district : districts.keySet()) { + + PieChartData data = districts.get(district); + + // Replace each values by percentage + data.computeSeries(); + + String miniChartUrl = serviceChart.getPieChartUrl(data, true); + String bigChartUrl = serviceChart.getPieChartUrl(data, false); + + StringBuilder description = new StringBuilder(district.getCode()); + + writer.record(district, miniChartUrl, description.toString()); + } + + File file = File.createTempFile("wao-contacts-", ".kml"); + file.deleteOnExit(); + + OutputStream output = new FileOutputStream(file); + try { + writer.write(output); + } finally { + output.close(); + } + + if (logger.isTraceEnabled()) { + logger.trace(FileUtils.readFileToString(file)); + } + + return new FileInputStream(file); } } 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-01 16:50:15 UTC (rev 587) +++ trunk/wao-business/src/main/java/fr/ifremer/wao/service/ServiceChartEmpty.java 2010-07-05 16:36:59 UTC (rev 588) @@ -20,9 +20,7 @@ public String getPieChartUrl(PieChartData data, boolean thumb) { if (logger.isDebugEnabled()) { - logger.debug("labels : " + data.getLabels()); - logger.debug("values : " + data.getValues()); - logger.debug("colors : " + data.getColors()); + logger.debug("data : " + data); logger.debug("thumb : " + thumb); } Modified: trunk/wao-business/src/main/java/fr/ifremer/wao/service/ServiceSynthesisImpl.java =================================================================== --- trunk/wao-business/src/main/java/fr/ifremer/wao/service/ServiceSynthesisImpl.java 2010-07-01 16:50:15 UTC (rev 587) +++ trunk/wao-business/src/main/java/fr/ifremer/wao/service/ServiceSynthesisImpl.java 2010-07-05 16:36:59 UTC (rev 588) @@ -34,13 +34,17 @@ import fr.ifremer.wao.bean.BoardingResultImpl; import fr.ifremer.wao.bean.ContactAverageReactivity; import fr.ifremer.wao.bean.ContactAverageReactivityImpl; +import fr.ifremer.wao.bean.ContactPieChartConstant; import fr.ifremer.wao.bean.ContactState; import fr.ifremer.wao.bean.ContactStateStatistics; import fr.ifremer.wao.bean.ContactStateStatisticsImpl; import fr.ifremer.wao.bean.PieChartData; import fr.ifremer.wao.bean.PieChartDataImpl; +import fr.ifremer.wao.bean.PieChartSeries; +import fr.ifremer.wao.bean.PieChartSeriesImpl; import fr.ifremer.wao.bean.SamplingFilter; import fr.ifremer.wao.entity.Boat; +import fr.ifremer.wao.entity.BoatDistrict; import fr.ifremer.wao.entity.Company; import fr.ifremer.wao.entity.Contact; import fr.ifremer.wao.entity.ContactDAO; @@ -370,71 +374,112 @@ TopiaContext transaction, Company company, PeriodDates period) throws TopiaException { - Map<String, ContactStateStatistics> results = - new HashMap<String, ContactStateStatistics>(); +// ContactDAO dao = WaoDAOHelper.getContactDAO(transaction); - ContactDAO dao = WaoDAOHelper.getContactDAO(transaction); - // Only for contacts not refused by the program - String contactAlias = "C"; - String validationProgramProperty = - TopiaQuery.getProperty(contactAlias, Contact.VALIDATION_PROGRAM); +// String contactAlias = "C"; +// String validationProgramProperty = +// TopiaQuery.getProperty(contactAlias, Contact.VALIDATION_PROGRAM); +// +// WaoQueryHelper.ContactProperty contactProperty = +// WaoQueryHelper.newContactProperty(); +// +// WaoQueryHelper.CompanyProperty companyProperty = +// contactProperty.observerProperty().companyProperty(); +// +// TopiaQuery query = dao.createQuery(contactProperty.$alias()). +// addWhere(WaoQueryHelper.format( +// "$1 IS NULL OR $1 = :booleanTrue", contactProperty.validationProgram()) +// ).addParam("booleanTrue", Boolean.TRUE); +//// addWhere(new StringBuilder(validationProgramProperty). +//// append(" IS NULL OR "). +//// append(validationProgramProperty). +//// append(" = :booleanTrue"). +//// toString() +//// ).addParam("booleanTrue", Boolean.TRUE); +// +//// String companyProperty = +//// TopiaQuery.getProperty(contactAlias, Contact.OBSERVER, WaoUser.COMPANY); +// +// if (company != null) { +// query.addEquals(companyProperty.$alias(), company); +// } +// +// if (period != null) { +// // Contacts include in the period +// period.initDayOfMonthExtremities(); +// +//// String tideBeginDateProperty = +//// TopiaQuery.getProperty(contactAlias, Contact.TIDE_BEGIN_DATE); +//// String createDateProperty = +//// TopiaQuery.getProperty(contactAlias, Contact.TOPIA_CREATE_DATE); +// query.addWhere(WaoQueryHelper.format( +// "($1 IS NOT NULL AND $1 BETWEEN :fromDate AND :thruDate)" + +// " OR ($1 IS NULL AND $2 BETWEEN :fromData AND :thurDate)", +// contactProperty.tideBeginDate(), +// contactProperty.topiaCreateDate()) +//// query.addWhere(new StringBuilder("("). +//// append(tideBeginDateProperty). +//// append(" IS NOT NULL AND "). +//// append(tideBeginDateProperty). +//// append(" BETWEEN :fromDate AND :thruDate)"). +//// append(" OR ("). +//// append(tideBeginDateProperty). +//// append(" IS NULL AND "). +//// append(createDateProperty). +//// append(" BETWEEN :fromDate AND :thruDate)"). +//// toString() +// ).addParam("fromDate", period.getFromDate()). +// addParam("thruDate", period.getThruDate()); +// } +// +//// String stateProperty = +//// TopiaQuery.getProperty(contactAlias, Contact.STATE); +//// String companyNameProperty = +//// TopiaQuery.getProperty(companyProperty, Company.NAME); +// +// query.addGroup(companyProperty.name(), contactProperty.state()). +// addOrder(companyProperty.name()). +// setSelect(companyProperty.name(), contactProperty.state(), "COUNT(*)"); - TopiaQuery query = dao.createQuery(contactAlias). - addWhere(new StringBuilder(validationProgramProperty). - append(" IS NULL OR "). - append(validationProgramProperty). - append(" = :booleanTrue"). - toString() + WaoQueryHelper.ContactProperty contactProperty = + WaoQueryHelper.newContactProperty(); + + WaoQueryHelper.CompanyProperty companyProperty = + contactProperty.observerProperty().companyProperty(); + + TopiaQuery query = WaoQueryHelper.createQuery(contactProperty). + addWhere(WaoQueryHelper.format( + "$1 IS NULL OR $1 = :booleanTrue", + contactProperty.validationProgram()) ).addParam("booleanTrue", Boolean.TRUE); - String companyProperty = - TopiaQuery.getProperty(contactAlias, Contact.OBSERVER, WaoUser.COMPANY); - if (company != null) { - query.addEquals(companyProperty, company); + query.addEquals(companyProperty.$alias(), company); } if (period != null) { // Contacts include in the period period.initDayOfMonthExtremities(); - String tideBeginDateProperty = - TopiaQuery.getProperty(contactAlias, Contact.TIDE_BEGIN_DATE); - String createDateProperty = - TopiaQuery.getProperty(contactAlias, Contact.TOPIA_CREATE_DATE); - - query.addWhere(new StringBuilder("("). - append(tideBeginDateProperty). - append(" IS NOT NULL AND "). - append(tideBeginDateProperty). - append(" BETWEEN :fromDate AND :thruDate)"). - append(" OR ("). - append(tideBeginDateProperty). - append(" IS NULL AND "). - append(createDateProperty). - append(" BETWEEN :fromDate AND :thruDate)"). - toString() + query.addWhere(WaoQueryHelper.format( + "($1 IS NOT NULL AND $1 BETWEEN :fromDate AND :thruDate)" + + " OR ($1 IS NULL AND $2 BETWEEN :fromDate AND :thruDate)", + contactProperty.tideBeginDate(), + contactProperty.topiaCreateDate()) ).addParam("fromDate", period.getFromDate()). addParam("thruDate", period.getThruDate()); } - String stateProperty = - TopiaQuery.getProperty(contactAlias, Contact.STATE); - String companyNameProperty = - TopiaQuery.getProperty(companyProperty, Company.NAME); + query.addGroup(companyProperty.name(), contactProperty.state()). + addOrder(companyProperty.name()). + setSelect(companyProperty.name(), contactProperty.state(), "COUNT(*)"); - query.addGroup(companyNameProperty, stateProperty). - addOrder(companyNameProperty). - setSelect(companyNameProperty, stateProperty, "COUNT(*)"); + Map<String, ContactStateStatistics> results = new HashMap<String, ContactStateStatistics>(); - if (logger.isDebugEnabled()) { - logger.debug("Query : " + query); - } + List<Object[]> queryResults = transaction.findByQuery(query); - List<Object[]> res = transaction.findByQuery(query); - - for (Object[] row : res) { + for (Object[] row : queryResults) { String rowCompanyName = (String)row[0]; int rowState = (Integer)row[1]; ContactState state = ContactState.valueOf(rowState); @@ -450,6 +495,7 @@ } stats.addResult(state, rowCount.intValue()); } + return results.values(); } @@ -520,62 +566,74 @@ } @Override - public PieChartData executeGetContactPieChartData(TopiaContext transaction, - Company company) + public Map<BoatDistrict, PieChartData> executeGetContactPieChartDataByBoatDistrict( + TopiaContext transaction, Company company) throws TopiaException { - Collection<ContactStateStatistics> data = - executeGetContactStateStatistics(transaction, company, null); + ContactDAO dao = WaoDAOHelper.getContactDAO(transaction); + WaoQueryHelper.ContactProperty contactProperty = + WaoQueryHelper.newContactProperty(); + + WaoQueryHelper.BoatDistrictProperty boatDistrictProperty = + contactProperty.boatProperty().boatDistrictProperty(); + + TopiaQuery query = dao.createQuery(contactProperty.$alias()). + addNotNull(boatDistrictProperty.latitude()). + addNotNull(boatDistrictProperty.longitude()); + + if (company != null) { + query.addEquals(contactProperty.observerProperty().company(), company); + } + + query.setSelect(boatDistrictProperty.$alias(), contactProperty.state(), "COUNT(*)"). + addGroup(boatDistrictProperty.$alias(), contactProperty.state()). + addOrder(boatDistrictProperty.$alias()); + int realized = 0, refused = 0, other = 0, total = 0; - for (ContactStateStatistics stats : data) { + List<Object[]> queryResults = transaction.findByQuery(query); - if (logger.isDebugEnabled()) { - logger.debug("Stats for : " + stats.getCompanyName()); - } + Map<BoatDistrict, PieChartData> results = new HashMap<BoatDistrict, PieChartData>(); - for (ContactState state : stats.getData().keySet()) { + for (Object[] row : queryResults) { - Integer value = stats.getData().get(state); - total += value; + BoatDistrict district = (BoatDistrict)row[0]; + ContactState state = ContactState.valueOf((Integer)row[1]); + long count = (Long)row[2]; - if (logger.isDebugEnabled()) { - logger.debug("state = " + state + " _ value = " + value); - } + PieChartData data = results.get(district); + if (data == null) { + data = createContactPieChartData(); + results.put(district, data); + } - switch (state) { - case BOARDING_DONE: - case BOARDING_EXPECTED: - realized += value; break; - case BOAT_REFUSED: - case BOAT_DEFINITIVE_REFUSED: - refused += value; break; - default: - other += value; - } + switch (state) { + case BOARDING_DONE: + case BOARDING_EXPECTED: + data.incValue(ContactPieChartConstant.REALIZED.ordinal(), count); + break; + case BOAT_REFUSED: + case BOAT_DEFINITIVE_REFUSED: + data.incValue(ContactPieChartConstant.REFUSED.ordinal(), count); + break; + default: + data.incValue(ContactPieChartConstant.OTHER.ordinal(), count); } } - if (logger.isDebugEnabled()) { - logger.debug("realized = " + realized + " (" + getPercentage(realized, total) + "%)" + - " _ refused = " + refused + " (" + getPercentage(refused, total) + "%)" + - " _ other = " + other + " (" + getPercentage(other, total) + "%)" + - " _ total = " + total + " (" + getPercentage(total, total) + "%)" - ); - } - - PieChartData result = new PieChartDataImpl(); - - result.addData("Réalisés", getPercentage(realized, total), "0000FF"); - result.addData("Refusés", getPercentage(refused, total), "FF0000"); - result.addData("Autres", getPercentage(other, total), "FFFF10"); - - return result; + return results; } - protected double getPercentage(int value, int total) { - return (double)value / (double)total * 100; + protected PieChartData createContactPieChartData() { + PieChartData data = new PieChartDataImpl(); + for (ContactPieChartConstant constant : ContactPieChartConstant.values()) { + PieChartSeries series = new PieChartSeriesImpl(); + series.setLabel(constant.getLabel()); + series.setColor(constant.getColor()); + data.addSeries(series); + } + return data; } } Modified: trunk/wao-business/src/main/resources/i18n/wao-business-en_GB.properties =================================================================== --- trunk/wao-business/src/main/resources/i18n/wao-business-en_GB.properties 2010-07-01 16:50:15 UTC (rev 587) +++ trunk/wao-business/src/main/resources/i18n/wao-business-en_GB.properties 2010-07-05 16:36:59 UTC (rev 588) @@ -64,6 +64,7 @@ wao.error.serviceSynthesis.getBoardingBoats= wao.error.serviceSynthesis.getContactDataInputDateReactivity= wao.error.serviceSynthesis.getContactPieChartData= +wao.error.serviceSynthesis.getContactPieChartDataByBoatDistrict= wao.error.serviceSynthesis.getContactStateStatistics= wao.error.serviceSynthesis.getDataSampling= wao.error.serviceSynthesis.getNonComplianceBoardingIndicator= Modified: trunk/wao-business/src/main/resources/i18n/wao-business-fr_FR.properties =================================================================== --- trunk/wao-business/src/main/resources/i18n/wao-business-fr_FR.properties 2010-07-01 16:50:15 UTC (rev 587) +++ trunk/wao-business/src/main/resources/i18n/wao-business-fr_FR.properties 2010-07-05 16:36:59 UTC (rev 588) @@ -63,6 +63,7 @@ wao.error.serviceSynthesis.getBoardingBoats=Impossible de r\u00E9cup\u00E9rer les donn\u00E9es du graphique concernant les embarquements sur les navires wao.error.serviceSynthesis.getContactDataInputDateReactivity=Impossible de r\u00E9cup\u00E9rer l'indicateur de r\u00E9activit\u00E9 sur les dates de saisies dans Allegro wao.error.serviceSynthesis.getContactPieChartData= +wao.error.serviceSynthesis.getContactPieChartDataByBoatDistrict= wao.error.serviceSynthesis.getContactStateStatistics=Impossible de r\u00E9cup\u00E9rer les statistiques sur les \u00E9tats des contacts wao.error.serviceSynthesis.getDataSampling=Impossible de r\u00E9cup\u00E9rer les donn\u00E9es pour le graphique dynamique des efforts de mar\u00E9es wao.error.serviceSynthesis.getNonComplianceBoardingIndicator=Impossible de r\u00E9cup\u00E9rer l'indicateur de non respect du nombre d'observateurs embarqu\u00E9s 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-01 16:50:15 UTC (rev 587) +++ trunk/wao-business/src/test/java/fr/ifremer/wao/bean/PieChartDataImplTest.java 2010-07-05 16:36:59 UTC (rev 588) @@ -14,21 +14,27 @@ @Test public void testSetData() throws Exception { - String input = "Réalisé,Refusé,Autres|20.0,30.0,50.0|FFFFFF,FFFFFF,FFFFFF"; + String input = "Réalisé,20.0,FFFFFF|Refusé,30.0,FFFFFF|Autres,50.0,FFFFFF"; PieChartData data = new PieChartDataImpl(); data.setData(input); - Assert.assertEquals(3, data.getLabels().size()); - Assert.assertTrue(data.getLabels().contains("Réalisé")); - Assert.assertTrue(data.getLabels().contains("Refusé")); - Assert.assertTrue(data.getLabels().contains("Autres")); - Assert.assertEquals(3, data.getValues().size()); - Assert.assertTrue(data.getValues().contains(20.0)); - Assert.assertTrue(data.getValues().contains(30.0)); - Assert.assertTrue(data.getValues().contains(50.0)); - Assert.assertEquals(3, data.getColors().size()); - Assert.assertTrue(data.getColors().contains("FFFFFF")); + Assert.assertEquals(3, data.getSeries().size()); + + PieChartSeries series0 = data.getSeries(0); + Assert.assertEquals("Réalisé", series0.getLabel()); + Assert.assertEquals(20.0, series0.getValue(), 0.); + Assert.assertEquals("FFFFFF", series0.getColor()); + + PieChartSeries series1 = data.getSeries(1); + Assert.assertEquals("Refusé", series1.getLabel()); + Assert.assertEquals(30.0, series1.getValue(), 0.); + Assert.assertEquals("FFFFFF", series1.getColor()); + + PieChartSeries series2 = data.getSeries(2); + Assert.assertEquals("Autres", series2.getLabel()); + Assert.assertEquals(50.0, series2.getValue(), 0.); + Assert.assertEquals("FFFFFF", series2.getColor()); } @Test @@ -36,11 +42,25 @@ PieChartData data = new PieChartDataImpl(); - data.addData("Réalisé", 20.0, "FFFFFF"); - data.addData("Refusé", 30.0, "FFFFFF"); - data.addData("Autres", 50.0, "FFFFFF"); + PieChartSeries series0 = new PieChartSeriesImpl(); + series0.setLabel("Réalisé"); + series0.setValue(20.0); + series0.setColor("FFFFFF"); + data.addSeries(series0); - String expected = "Réalisé,Refusé,Autres|20.0,30.0,50.0|FFFFFF,FFFFFF,FFFFFF"; + PieChartSeries series1 = new PieChartSeriesImpl(); + series1.setLabel("Refusé"); + series1.setValue(30.0); + series1.setColor("FFFFFF"); + data.addSeries(series1); + + PieChartSeries series2 = new PieChartSeriesImpl(); + series2.setLabel("Autres"); + series2.setValue(50.0); + series2.setColor("FFFFFF"); + data.addSeries(series2); + + String expected = "Réalisé,20.0,FFFFFF|Refusé,30.0,FFFFFF|Autres,50.0,FFFFFF"; Assert.assertEquals(expected, data.getData()); } Modified: trunk/wao-business/src/test/java/fr/ifremer/wao/service/ServiceCartographyImplTest.java =================================================================== --- trunk/wao-business/src/test/java/fr/ifremer/wao/service/ServiceCartographyImplTest.java 2010-07-01 16:50:15 UTC (rev 587) +++ trunk/wao-business/src/test/java/fr/ifremer/wao/service/ServiceCartographyImplTest.java 2010-07-05 16:36:59 UTC (rev 588) @@ -3,19 +3,29 @@ import fr.ifremer.wao.AbstractServiceTest; import fr.ifremer.wao.WaoBusinessException; import fr.ifremer.wao.WaoDAOHelper; +import fr.ifremer.wao.WaoException; import fr.ifremer.wao.entity.BoatDistrict; import fr.ifremer.wao.entity.BoatDistrictDAO; import fr.ifremer.wao.entity.Company; import fr.ifremer.wao.io.ImportResults; +import org.apache.commons.beanutils.ConvertUtils; +import org.apache.commons.io.FileUtils; +import org.apache.commons.lang.StringUtils; import org.junit.Assert; import org.junit.Before; import org.junit.Test; import org.nuiton.topia.TopiaContext; import org.nuiton.topia.TopiaException; +import org.nuiton.util.FileUtil; +import org.nuiton.util.StringUtil; import org.slf4j.Logger; import org.slf4j.LoggerFactory; +import java.io.File; +import java.io.FileInputStream; +import java.io.IOException; import java.io.InputStream; +import java.io.OutputStream; import java.util.HashSet; import java.util.List; import java.util.Set; @@ -79,7 +89,7 @@ } } - //@Test + @Test public void testImportBoatDistrictBadKml() throws WaoBusinessException { /** PREPARE DATA **/ InputStream input = getClass().getResourceAsStream("/import/navires.csv"); @@ -87,7 +97,11 @@ /** EXEC METHOD **/ input = getClass().getResourceAsStream("/import/activity.csv"); - ImportResults results = service.importBoatDistrictKml(input); + try { + ImportResults results = service.importBoatDistrictKml(input); + } catch (WaoException eee) { + Assert.assertEquals(IOException.class, eee.getCause().getClass()); + } } @Test @@ -99,8 +113,12 @@ Company company2 = createCompany("BIS"); prepareContactsData(company, company2); + InputStream input = getClass().getResourceAsStream("/import/boat_districts.kml"); + ImportResults results = service.importBoatDistrictKml(input); /** EXEC METHOD **/ - service.exportContactStatisticsKml(null); + InputStream stream = service.exportContactStatisticsKml(null); + + //FileUtils.readFileToString() } } Modified: trunk/wao-business/src/test/java/fr/ifremer/wao/service/ServiceSynthesisImplTest.java =================================================================== --- trunk/wao-business/src/test/java/fr/ifremer/wao/service/ServiceSynthesisImplTest.java 2010-07-01 16:50:15 UTC (rev 587) +++ trunk/wao-business/src/test/java/fr/ifremer/wao/service/ServiceSynthesisImplTest.java 2010-07-05 16:36:59 UTC (rev 588) @@ -71,7 +71,7 @@ @Before public void initialize() { - logger.info("initialize ServiceCartographyImplTest"); + logger.info("initialize ServiceSynthesisImplTest"); service = manager.getServiceSynthesis(); } 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-01 16:50:15 UTC (rev 587) +++ trunk/wao-ui/src/main/java/fr/ifremer/wao/ui/services/ServiceChartServlet.java 2010-07-05 16:36:59 UTC (rev 588) @@ -2,9 +2,13 @@ import fr.ifremer.wao.WaoProperty; import fr.ifremer.wao.bean.PieChartData; +import fr.ifremer.wao.bean.PieChartSeries; import fr.ifremer.wao.service.ServiceChart; import org.nuiton.util.StringUtil; +import java.util.ArrayList; +import java.util.List; + /** * Implementation of {@link ServiceChart} using Google PieChart Api syntax to * create urls. The property {@link WaoProperty#CHART_SERVER_PATH} defines @@ -36,10 +40,19 @@ @Override public String getPieChartUrl(PieChartData data, boolean thumb) { - String values = StringUtil.join(data.getValues(), + List<String> labelsList = new ArrayList<String>(); + List<Double> valuesList = new ArrayList<Double>(); + List<String> colorsList = new ArrayList<String>(); + for (PieChartSeries series : data.getSeries()) { + labelsList.add(series.getLabel()); + valuesList.add(series.getValue()); + colorsList.add(series.getColor()); + } + + String values = StringUtil.join(valuesList, PROPERTY_VALUE_SEPARATOR, false); - String colors = StringUtil.join(data.getColors(), + String colors = StringUtil.join(colorsList, PROPERTY_COLOR_SEPARATOR, false); StringBuilder url = new StringBuilder(getBaseUrl()); @@ -50,7 +63,7 @@ // Labels only on big image } else { - String labels = StringUtil.join(data.getLabels(), + String labels = StringUtil.join(labelsList, PROPERTY_LABEL_SEPARATOR, false); url.append(PIE_CHART_MAXI_TYPE).