package org.geotoolkit.pending.demo.rendering;
import java.awt.BasicStroke;
import java.awt.Color;
import java.awt.Dimension;
import java.awt.Font;
import java.io.File;
import java.io.InputStream;
import java.util.Collections;
import java.util.Locale;
import java.util.Map;
import java.util.Map.Entry;
import java.util.Random;
import net.sf.jasperreports.engine.JasperReport;
import org.geotoolkit.data.FeatureStore;
import org.geotoolkit.data.FeatureStoreUtilities;
import org.geotoolkit.data.FeatureCollection;
import org.geotoolkit.data.FeatureIterator;
import org.geotoolkit.data.FeatureWriter;
import org.geotoolkit.data.memory.GenericMappingFeatureIterator;
import org.geotoolkit.data.memory.mapping.FeatureMapper;
import org.geotoolkit.data.query.QueryBuilder;
import org.geotoolkit.display.PortrayalException;
import org.geotoolkit.display2d.canvas.J2DCanvas;
import org.geotoolkit.display2d.ext.grid.DefaultGridTemplate;
import org.geotoolkit.display2d.ext.grid.GraphicGridJ2D;
import org.geotoolkit.display2d.ext.grid.GridTemplate;
import org.geotoolkit.display2d.service.CanvasDef;
import org.geotoolkit.display2d.service.OutputDef;
import org.geotoolkit.display2d.service.PortrayalExtension;
import org.geotoolkit.display2d.service.SceneDef;
import org.geotoolkit.display2d.service.ViewDef;
import org.geotoolkit.factory.FactoryFinder;
import org.geotoolkit.factory.Hints;
import org.apache.sis.feature.builder.FeatureTypeBuilder;
import org.geotoolkit.map.MapBuilder;
import org.geotoolkit.map.MapContext;
import org.geotoolkit.pending.demo.Demos;
import org.apache.sis.referencing.CRS;
import org.apache.sis.referencing.CommonCRS;
import org.geotoolkit.report.CollectionDataSource;
import org.geotoolkit.report.JasperReportService;
import org.geotoolkit.report.graphic.chart.ChartDef;
import org.geotoolkit.report.graphic.legend.LegendDef;
import org.geotoolkit.report.graphic.map.MapDef;
import org.geotoolkit.report.graphic.northarrow.NorthArrowDef;
import org.geotoolkit.report.graphic.scalebar.ScaleBarDef;
import org.apache.sis.storage.DataStoreException;
import org.geotoolkit.style.MutableStyle;
import org.geotoolkit.style.MutableStyleFactory;
import org.geotoolkit.style.RandomStyleBuilder;
import org.jfree.chart.ChartFactory;
import org.jfree.chart.JFreeChart;
import org.jfree.data.general.DefaultPieDataset;
import org.opengis.feature.Feature;
import org.opengis.feature.FeatureType;
import org.geotoolkit.storage.DataStores;
import org.opengis.util.GenericName;
import org.opengis.filter.FilterFactory;
import org.apache.sis.geometry.Envelopes;
import org.opengis.filter.Filter;
public class ReportDemo {
private static final MutableStyleFactory SF = (MutableStyleFactory)FactoryFinder.getStyleFactory(
new Hints(Hints.STYLE_FACTORY,MutableStyleFactory.class));
private static final FilterFactory FIF = FactoryFinder.getFilterFactory(null);
public static void main(String[] args) throws Exception {
Demos.init();
final InputStream template = ReportDemo.class.getResourceAsStream("/data/report/complexReport.jrxml");
final Entry<JasperReport,FeatureType> entry = JasperReportService.prepareTemplate(template);
final JasperReport report = entry.getKey();
final FeatureType type = entry.getValue();
System.out.println(type);
//source to make an atlas ----------------------------------------------------
final FeatureStore store = (FeatureStore) DataStores.open(
(Map)Collections.singletonMap("path",ReportDemo.class.getResource("/data/world/Countries.shp").toURI()));
final GenericName name = store.getNames().iterator().next();
final FeatureCollection countries = store.createSession(true).getFeatureCollection(QueryBuilder.all(name));
//Iterator over all the countries --------------------------------------------
final FeatureIterator ite = countries.iterator();
//We map the feature type to the report type ---------------------------------
final GenericMappingFeatureIterator mapped = new GenericMappingFeatureIterator(ite, new FeatureMapper(){
@Override
public FeatureType getSourceType() {
return countries.getFeatureType();
}
@Override
public FeatureType getTargetType() {
return type;
}
@Override
public Feature transform(Feature feature) {
final Feature modified = type.newInstance();
//create the main map with a single feature ------------------
final FeatureCollection col = FeatureStoreUtilities.collection(feature);
final MapContext context = MapBuilder.createContext();
final MutableStyle style = RandomStyleBuilder.createRandomVectorStyle(col.getFeatureType());
context.layers().add(MapBuilder.createFeatureLayer(col, style));
try{
//add a custom decoration on our map.
final GridTemplate gridTemplate = new DefaultGridTemplate(
CommonCRS.WGS84.normalizedGeographic(),
new BasicStroke(1.5f),
new Color(120,120,120,200),
new BasicStroke(1,BasicStroke.CAP_BUTT, BasicStroke.JOIN_MITER, 3, new float[]{5,5}, 0),
new Color(120,120,120,60),
new Font("serial", Font.BOLD, 12),
Color.GRAY,
0,
Color.WHITE,
new Font("serial", Font.ITALIC, 10),
Color.GRAY,
0,
Color.WHITE);
final PortrayalExtension ext = new PortrayalExtension() {
@Override
public void completeCanvas(J2DCanvas canvas) throws PortrayalException {
canvas.getContainer().getRoot().getChildren().add(new GraphicGridJ2D(canvas, gridTemplate));
}
};
final CanvasDef canvasDef = new CanvasDef(new Dimension(1, 1), Color.WHITE,false);
final SceneDef sceneDef = new SceneDef(context,null,ext);
final ViewDef viewDef = new ViewDef(Envelopes.transform(context.getBounds(), CRS.forCode("EPSG:3395")), 0);
final MapDef mapdef = new MapDef(canvasDef,sceneDef,viewDef,null);
modified.setPropertyValue("map3",mapdef);
}catch(Exception ex){
ex.printStackTrace();
}
//casual attributs -------------------
modified.setPropertyValue("CNTRY_NAME",feature.getProperty("CNTRY_NAME").getValue());
modified.setPropertyValue("POP_CNTRY",feature.getProperty("POP_CNTRY").getValue());
//chart -------------------------
final DefaultPieDataset pds = new DefaultPieDataset();
pds.setValue((Comparable)feature.getProperty("SOVEREIGN").getValue(), Math.random());
pds.setValue((Comparable)feature.getProperty("ISO_3DIGIT").getValue(), Math.random());
final JFreeChart chart = ChartFactory.createPieChart("Info", pds, true, true, Locale.FRENCH);
modified.setPropertyValue("chart4",new ChartDef(chart));
//legend --------------------------
modified.setPropertyValue("legend5",new LegendDef());
//scale bar -------------------
modified.setPropertyValue("scalebar6",new ScaleBarDef());
//north arow -------------------
modified.setPropertyValue("northarrow7",new NorthArrowDef());
//subtable --------------
final FeatureTypeBuilder ftb = new FeatureTypeBuilder();
ftb.setName("subdata");
ftb.addAttribute(Integer.class).setName("men");
ftb.addAttribute(Integer.class).setName("women");
ftb.addAttribute(String.class).setName("desc");
final FeatureType subType = ftb.build();
final FeatureCollection subcol = FeatureStoreUtilities.collection("sub", subType);
try {
FeatureWriter fw = subcol.getSession().getFeatureStore().getFeatureWriter(QueryBuilder.filtered(subType.getName().toString(),Filter.EXCLUDE));
for(int i=0,n=new Random().nextInt(20);i<n;i++){
Feature f =fw.next();
f.setPropertyValue("men",new Random().nextInt());
f.setPropertyValue("women",new Random().nextInt());
f.setPropertyValue("desc","some text from attribut");
fw.write();
}
fw.close();
} catch (DataStoreException ex) {
ex.printStackTrace();
}
modified.setPropertyValue("table8",new CollectionDataSource(subcol));
return modified;
}
});
//Generate the report --------------------------------------------------------
final OutputDef output = new OutputDef(JasperReportService.MIME_PDF, new File("atlas.pdf"));
JasperReportService.generateReport(report, mapped, null, output);
}
}