/* (c) 2017 Open Source Geospatial Foundation - all rights reserved * This code is licensed under the GPL 2.0 license, available at the root * application directory. */ package org.geoserver.monitor.rest; import java.io.IOException; import java.util.Date; import org.apache.poi.hssf.usermodel.HSSFCell; import org.apache.poi.hssf.usermodel.HSSFRichTextString; import org.apache.poi.hssf.usermodel.HSSFRow; import org.apache.poi.hssf.usermodel.HSSFSheet; import org.apache.poi.hssf.usermodel.HSSFWorkbook; import org.geoserver.monitor.Monitor; import org.geoserver.monitor.RequestData; import org.geoserver.monitor.RequestDataVisitor; import org.geoserver.ows.util.OwsUtils; import org.springframework.http.HttpOutputMessage; import org.springframework.http.converter.HttpMessageNotWritableException; import org.springframework.stereotype.Component; /** * Convert MonitorResutls to an Excel spreadsheet. */ @Component public class ExcelMonitorConverter extends BaseMonitorConverter { private static final class ExcelRequestDataVisitor implements RequestDataVisitor { private final HSSFSheet sheet; int rowNumber = 1; private String[] fields; private ExcelRequestDataVisitor(HSSFSheet sheet, String[] fields) { this.sheet = sheet; this.fields = fields; } public void visit(RequestData data, Object... aggregates) { HSSFRow row = sheet.createRow(rowNumber++); for (int j = 0; j < fields.length; j++) { HSSFCell cell = row.createCell(j); Object obj = OwsUtils.get(data, fields[j]); if (obj == null) { continue; } if (obj instanceof Date) { cell.setCellValue((Date) obj); } else if (obj instanceof Number) { cell.setCellValue(((Number) obj).doubleValue()); } else { cell.setCellValue(new HSSFRichTextString(obj.toString())); } } } } public ExcelMonitorConverter() { super(MonitorRequestController.EXCEL_MEDIATYPE); } @Override protected void writeInternal(MonitorQueryResults results, HttpOutputMessage outputMessage) throws IOException, HttpMessageNotWritableException { Object object = results.getResult(); Monitor monitor = results.getMonitor(); // Create the workbook+sheet try( HSSFWorkbook wb = new HSSFWorkbook() ){ final HSSFSheet sheet = wb.createSheet("requests"); // create the header HSSFRow header = sheet.createRow(0); String[] fields = results.getFields(); for (int i = 0; i < fields.length; i++) { HSSFCell cell = header.createCell(i); cell.setCellValue(new HSSFRichTextString(fields[i])); } // write out the request handleRequests(object, new ExcelRequestDataVisitor(sheet, fields), monitor); // write to output wb.write(outputMessage.getBody()); } } }