/* (c) 2014 - 2016 Open Source Geospatial Foundation - all rights reserved * (c) 2001 - 2013 OpenPlans * This code is licensed under the GPL 2.0 license, available at the root * application directory. */ package org.geoserver.wfs.response; import static junit.framework.Assert.*; import java.io.IOException; import java.io.InputStream; import org.apache.poi.hssf.usermodel.HSSFWorkbook; import org.apache.poi.ss.usermodel.Cell; import org.apache.poi.ss.usermodel.Row; import org.apache.poi.ss.usermodel.Sheet; import org.apache.poi.ss.usermodel.Workbook; import org.apache.poi.xssf.usermodel.XSSFWorkbook; import org.geoserver.data.test.MockData; import org.geoserver.wfs.WFSTestSupport; import org.geotools.data.FeatureSource; import org.geotools.data.Query; import org.geotools.feature.FeatureIterator; import org.junit.Test; import org.opengis.feature.simple.SimpleFeature; import org.opengis.feature.simple.SimpleFeatureType; import org.springframework.mock.web.MockHttpServletResponse; public class ExcelOutputFormatTest extends WFSTestSupport { @Test public void testExcel97OutputFormat() throws Exception { // grab the real binary stream, avoiding mangling to due char conversion MockHttpServletResponse resp = getAsServletResponse("wfs?request=GetFeature&version=1.0.0&typeName=sf:PrimitiveGeoFeature&outputFormat=excel"); InputStream in = getBinaryInputStream(resp); // check the mime type assertEquals("application/msexcel", resp.getContentType()); // check the content disposition assertEquals("attachment; filename=PrimitiveGeoFeature.xls", resp.getHeader("Content-Disposition")); HSSFWorkbook wb = new HSSFWorkbook(in); testExcelOutputFormat( wb ); } @Test public void testExcel2007OutputFormat() throws Exception { // grab the real binary stream, avoiding mangling to due char conversion MockHttpServletResponse resp = getAsServletResponse("wfs?request=GetFeature&version=1.0.0&typeName=sf:PrimitiveGeoFeature&outputFormat=excel2007"); InputStream in = getBinaryInputStream(resp); // check the mime type assertEquals("application/vnd.openxmlformats-officedocument.spreadsheetml.sheet", resp.getContentType()); // check the content disposition assertEquals("attachment; filename=PrimitiveGeoFeature.xlsx", resp.getHeader("Content-Disposition")); XSSFWorkbook wb = new XSSFWorkbook(in); testExcelOutputFormat( wb ); } private void testExcelOutputFormat( Workbook wb ) throws IOException{ Sheet sheet = wb.getSheet("PrimitiveGeoFeature"); assertNotNull(sheet); FeatureSource fs = getFeatureSource(MockData.PRIMITIVEGEOFEATURE); // check the number of rows in the output final int feautureRows = fs.getCount(Query.ALL); assertEquals(feautureRows + 1, sheet.getPhysicalNumberOfRows()); // check the header is what we expect final SimpleFeatureType schema = (SimpleFeatureType) fs.getSchema(); final Row header = sheet.getRow(0); assertEquals("FID", header.getCell(0).getRichStringCellValue().toString()); for (int i = 0; i < schema.getAttributeCount(); i++) { assertEquals(schema.getDescriptor(i).getLocalName(), header.getCell(i + 1) .getRichStringCellValue().toString()); } // check some selected values to see if the content and data type is the one // we expect FeatureIterator fi = fs.getFeatures().features(); SimpleFeature sf = (SimpleFeature) fi.next(); fi.close(); // ... a string cell Cell cell = sheet.getRow(1).getCell(1); assertEquals( Cell.CELL_TYPE_STRING, cell.getCellType() ); assertEquals(sf.getAttribute(0), cell.getRichStringCellValue().toString()); // ... a geom cell cell = sheet.getRow(1).getCell(4); assertEquals( Cell.CELL_TYPE_STRING, cell.getCellType() ); assertEquals(sf.getAttribute(3).toString(), cell.getRichStringCellValue().toString()); // ... a number cell cell = sheet.getRow(1).getCell(6); assertEquals( Cell.CELL_TYPE_NUMERIC, cell.getCellType() ); assertEquals(((Number) sf.getAttribute(5)).doubleValue(), cell.getNumericCellValue()); // ... a date cell (they are mapped as numeric in xms?) cell = sheet.getRow(1).getCell(10); assertEquals( Cell.CELL_TYPE_NUMERIC, cell.getCellType() ); assertEquals(sf.getAttribute(9), cell.getDateCellValue()); // ... a boolean cell (they are mapped as numeric in xms?) cell = sheet.getRow(1).getCell(12); assertEquals( Cell.CELL_TYPE_BOOLEAN, cell.getCellType() ); assertEquals(sf.getAttribute(11), cell.getBooleanCellValue()); // ... an empty cell (original value is null -> no cell) cell = sheet.getRow(1).getCell(3); assertNull(cell); } @Test public void testExcel97MultipleFeatureTypes() throws Exception { // grab the real binary stream, avoiding mangling to due char conversion MockHttpServletResponse resp = getAsServletResponse("wfs?request=GetFeature&typeName=sf:PrimitiveGeoFeature,sf:GenericEntity&outputFormat=excel"); InputStream in = getBinaryInputStream(resp); Workbook wb = new HSSFWorkbook(in); testMultipleFeatureTypes( wb ); } @Test public void testExcel2007MultipleFeatureTypes() throws Exception { // grab the real binary stream, avoiding mangling to due char conversion MockHttpServletResponse resp = getAsServletResponse("wfs?request=GetFeature&typeName=sf:PrimitiveGeoFeature,sf:GenericEntity&outputFormat=excel2007"); InputStream in = getBinaryInputStream(resp); Workbook wb = new XSSFWorkbook(in); testMultipleFeatureTypes( wb ); } private void testMultipleFeatureTypes( Workbook wb ) throws IOException{ // check we have the expected sheets Sheet sheet = wb.getSheet("PrimitiveGeoFeature"); assertNotNull(sheet); // check the number of rows in the output FeatureSource fs = getFeatureSource(MockData.PRIMITIVEGEOFEATURE); assertEquals(fs.getCount(Query.ALL) + 1, sheet.getPhysicalNumberOfRows()); sheet = wb.getSheet("GenericEntity"); assertNotNull(sheet); // check the number of rows in the output fs = getFeatureSource(MockData.GENERICENTITY); assertEquals(fs.getCount(Query.ALL) + 1, sheet.getPhysicalNumberOfRows()); } }