/* (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.io.PrintStream;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.List;
import java.util.zip.ZipEntry;
import java.util.zip.ZipOutputStream;
import org.geoserver.monitor.Monitor;
import org.geoserver.monitor.Query;
import org.geoserver.monitor.RequestData;
import org.geoserver.monitor.RequestDataVisitor;
import org.springframework.http.HttpOutputMessage;
import org.springframework.http.converter.HttpMessageNotWritableException;
import org.springframework.stereotype.Component;
/**
* Convert MonitorResutls to a zip file (containing csv files).
*/
@Component
public class ZIPMonitorConverter extends BaseMonitorConverter {
CSVMonitorConverter csv = new CSVMonitorConverter();
public ZIPMonitorConverter() {
super(MonitorRequestController.ZIP_MEDIATYPE);
}
@SuppressWarnings("unchecked")
@Override
protected void writeInternal(MonitorQueryResults results, HttpOutputMessage outputMessage)
throws IOException, HttpMessageNotWritableException {
Object object = results.getResult();
Monitor monitor = results.getMonitor();
List<String> fields = new ArrayList<>(Arrays.asList(results.getFields()));
final boolean body = fields.remove("Body");
final boolean error = fields.remove("Error");
final ZipOutputStream zout = new ZipOutputStream(outputMessage.getBody());
// create the csv entry
zout.putNextEntry(new ZipEntry("requests.csv"));
String[] csvFields = (String[]) fields.toArray(new String[fields.size()]);
csv.writeCSVfile(object, csvFields, monitor, zout);
if (object instanceof Query) {
monitor.query((Query) object, new RequestDataVisitor() {
public void visit(RequestData data, Object... aggregates) {
try {
writeBodyAndError(data, zout, body, error, true);
} catch (IOException e) {
throw new RuntimeException(e);
}
}
});
} else if (object instanceof List) {
for (RequestData data : (List<RequestData>) object) {
writeBodyAndError(data, zout, body, error, true);
}
} else {
writeBodyAndError((RequestData) object, zout, body, error, false);
}
zout.flush();
zout.close();
}
void writeBodyAndError(RequestData data, ZipOutputStream zout, boolean body, boolean error,
boolean postfix) throws IOException {
long id = data.getId();
if (body && data.getBody() != null) {
// TODO: figure out the proper extension for the body file
zout.putNextEntry(new ZipEntry(postfix ? "body_" + id + ".txt" : "body.txt"));
zout.write(data.getBody());
}
if (error && data.getError() != null) {
zout.putNextEntry(new ZipEntry(postfix ? "error_" + id + ".txt" : "error.txt"));
data.getError().printStackTrace(new PrintStream(zout));
}
}
}