Skip to content

Commit

Permalink
Monitor module migrated
Browse files Browse the repository at this point in the history
  • Loading branch information
aaime committed Mar 31, 2017
1 parent 163ff03 commit a8707c8
Show file tree
Hide file tree
Showing 21 changed files with 1,241 additions and 1,156 deletions.
7 changes: 6 additions & 1 deletion src/extension/monitor/core/pom.xml
Expand Up @@ -24,7 +24,7 @@
</dependency>
<dependency>
<groupId>org.geoserver</groupId>
<artifactId>gs-rest</artifactId>
<artifactId>gs-restconfig-ng</artifactId>
<version>2.12-SNAPSHOT</version>
</dependency>
<dependency>
Expand Down Expand Up @@ -60,6 +60,11 @@
<artifactId>xmlunit</artifactId>
<scope>test</scope>
</dependency>
<dependency>
<groupId>org.jsoup</groupId>
<artifactId>jsoup</artifactId>
<scope>test</scope>
</dependency>
</dependencies>

<build>
Expand Down
54 changes: 7 additions & 47 deletions src/extension/monitor/core/src/main/java/applicationContext.xml
@@ -1,13 +1,16 @@
<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
xmlns:mvc="http://www.springframework.org/schema/mvc"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xmlns:tx="http://www.springframework.org/schema/tx"
xmlns:context="http://www.springframework.org/schema/context"
xsi:schemaLocation="http://www.springframework.org/schema/beans
http://www.springframework.org/schema/beans/spring-beans.xsd
http://www.springframework.org/schema/tx
http://www.springframework.org/schema/tx/spring-tx.xsd"
default-autowire="byName">

http://www.springframework.org/schema/tx/spring-tx.xsd
http://www.springframework.org/schema/context
http://www.springframework.org/schema/context/spring-context.xsd" >

<!-- monitor daos -->
<bean id="memMonitorDAO" class="org.geoserver.monitor.MemoryMonitorDAO"/>

Expand All @@ -34,50 +37,7 @@
</bean>

<!-- rest bindings -->
<bean id="requestResource" class="org.geoserver.monitor.rest.RequestResource" scope="prototype">
<constructor-arg ref="monitor"/>
</bean>
<bean id="requestResourceFinder" class="org.geoserver.rest.BeanResourceFinder">
<constructor-arg value="requestResource"/>
</bean>

<bean id="owsRequestResource" class="org.geoserver.monitor.rest.OwsRequestResource" scope="prototype">
<constructor-arg ref="monitor"/>
</bean>
<bean id="owsRequestResourceFinder" class="org.geoserver.rest.BeanResourceFinder">
<constructor-arg value="owsRequestResource"/>
</bean>

<bean id="monitorRestMappings" class="org.geoserver.rest.RESTMapping">
<property name="routes">
<map>
<entry>
<key><value>/monitor/requests/ows</value></key>
<value>owsRequestResourceFinder</value>
</entry>
<entry>
<key><value>/monitor/requests/ows.{format}</value></key>
<value>owsRequestResourceFinder</value>
</entry>
<entry>
<key><value>/monitor/requests/ows/{request}.{format}</value></key>
<value>owsRequestResourceFinder</value>
</entry>
<entry>
<key><value>/monitor/requests</value></key>
<value>requestResourceFinder</value>
</entry>
<entry>
<key><value>/monitor/requests.{format}</value></key>
<value>requestResourceFinder</value>
</entry>
<entry>
<key><value>/monitor/requests/{request}.{format}</value></key>
<value>requestResourceFinder</value>
</entry>
</map>
</property>
</bean>
<context:component-scan base-package="org.geoserver.monitor.rest"/>

<!-- ows dispatcher callback for ows specific stuff -->
<bean id="monitorOwsCallback" class="org.geoserver.monitor.ows.MonitorCallback">
Expand Down
Expand Up @@ -165,9 +165,8 @@ public void clear() {

public void dispose() {
live.clear();
live = null;
history.clear();
history = null;
REQUEST_ID_GEN = new AtomicLong(1);
}

static interface Predicate {
Expand Down
@@ -0,0 +1,59 @@
/* (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.Collections;
import java.util.List;

import org.geoserver.monitor.Monitor;
import org.geoserver.monitor.Query;
import org.geoserver.monitor.RequestData;
import org.geoserver.monitor.RequestDataVisitor;
import org.geoserver.rest.converters.BaseMessageConverter;
import org.springframework.http.HttpInputMessage;
import org.springframework.http.MediaType;
import org.springframework.http.converter.HttpMessageNotReadableException;

/**
* Base class for monitor requests converters
*/
public abstract class AbstractMonitorRequestConverter extends BaseMessageConverter {

@Override
public boolean canRead(Class clazz, MediaType mediaType) {
return false;
}

@Override
public boolean canWrite(Class clazz, MediaType mediaType) {
return MonitorQueryResults.class.isAssignableFrom(clazz)
&& getSupportedMediaTypes().contains(mediaType);
}

@Override
public Object read(Class clazz, HttpInputMessage inputMessage)
throws IOException, HttpMessageNotReadableException {
throw new UnsupportedOperationException();
}

static void handleRequests(Object object, RequestDataVisitor visitor, Monitor monitor) {
if (object instanceof Query) {
monitor.query((Query) object, visitor);
} else {
List<RequestData> requests;
if (object instanceof List) {
requests = (List) object;
} else {
requests = Collections.singletonList((RequestData) object);
}
for (RequestData data : requests) {
visitor.visit(data, null);
}
}
}


}
@@ -0,0 +1,101 @@
/* (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.BufferedWriter;
import java.io.IOException;
import java.io.OutputStream;
import java.io.OutputStreamWriter;
import java.util.Arrays;
import java.util.Date;
import java.util.List;
import java.util.regex.Matcher;
import java.util.regex.Pattern;

import org.geoserver.monitor.Monitor;
import org.geoserver.monitor.RequestData;
import org.geoserver.monitor.RequestDataVisitor;
import org.geoserver.ows.util.OwsUtils;
import org.geotools.feature.type.DateUtil;
import org.springframework.http.HttpOutputMessage;
import org.springframework.http.MediaType;
import org.springframework.http.converter.HttpMessageNotWritableException;
import org.springframework.stereotype.Component;

@Component
public class CSVMonitorConverter extends AbstractMonitorRequestConverter {

static Pattern ESCAPE_REQUIRED = Pattern.compile("[\\,\\s\"]");

@Override
public List getSupportedMediaTypes() {
return Arrays.asList(MonitorRequestController.CSV_MEDIATYPE);
}

@Override
public void write(Object t, MediaType contentType, HttpOutputMessage outputMessage)
throws IOException, HttpMessageNotWritableException {
MonitorQueryResults results = (MonitorQueryResults) t;
Object result = results.getResult();
String[] fields = results.getFields();
Monitor monitor = results.getMonitor();

OutputStream os = outputMessage.getBody();
write(result, fields, monitor, os);
}

void write(Object result, String[] fields, Monitor monitor, OutputStream os)
throws IOException {
final BufferedWriter w = new BufferedWriter(new OutputStreamWriter(os));

// write out the header
StringBuffer sb = new StringBuffer();
for (String fld : fields) {
sb.append(fld).append(",");
}
sb.setLength(sb.length() - 1);
w.write(sb.append("\n").toString());

handleRequests(result, new RequestDataVisitor() {
public void visit(RequestData data, Object... aggregates) {
try {
writeRequest(data, w, fields);
} catch (IOException e) {
throw new RuntimeException(e);
}
}
}, monitor);

w.flush();
}

void writeRequest(RequestData data, BufferedWriter w, String[] fields) throws IOException {
StringBuffer sb = new StringBuffer();

for (String fld : fields) {
Object val = OwsUtils.get(data, fld);
if (val instanceof Date) {
val = DateUtil.serializeDateTime((Date) val);
}
if (val != null) {
String string = val.toString();
Matcher match = ESCAPE_REQUIRED.matcher(string);
if (match.find()) { // may need escaping, so escape
string = string.replaceAll("\"", "\"\"");// Double all double quotes to escape
sb.append("\"");
sb.append(string);
sb.append("\"");
} else { // No need for escaping
sb.append(string);
}
}
sb.append(",");
}
sb.setLength(sb.length() - 1); // Remove trailing comma
sb.append("\n");
w.write(sb.toString());
}

}
@@ -0,0 +1,81 @@
/* (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.Arrays;
import java.util.Date;
import java.util.List;

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.MediaType;
import org.springframework.http.converter.HttpMessageNotWritableException;
import org.springframework.stereotype.Component;

@Component
public class ExcelMonitorConverter extends AbstractMonitorRequestConverter {

@Override
public List getSupportedMediaTypes() {
return Arrays.asList(MonitorRequestController.EXCEL_MEDIATYPE);
}

@Override
public void write(Object t, MediaType contentType, HttpOutputMessage outputMessage)
throws IOException, HttpMessageNotWritableException {
MonitorQueryResults results = (MonitorQueryResults) t;
Object object = results.getResult();
Monitor monitor = results.getMonitor();

// Create the workbook+sheet
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 RequestDataVisitor() {
int i = 1;

public void visit(RequestData data, Object... aggregates) {
HSSFRow row = sheet.createRow(i++);
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()));
}
}
}
}, monitor);

// write to output
wb.write(outputMessage.getBody());
}

}
@@ -0,0 +1,21 @@
/* (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 org.geoserver.rest.MediaTypeCallback;
import org.springframework.stereotype.Component;
import org.springframework.web.servlet.config.annotation.ContentNegotiationConfigurer;

@Component
public class MonitorMediaTypeCallback implements MediaTypeCallback {

@Override
public void configure(ContentNegotiationConfigurer configurer) {
configurer.mediaType("csv", MonitorRequestController.CSV_MEDIATYPE);
configurer.mediaType("zip", MonitorRequestController.ZIP_MEDIATYPE);
configurer.mediaType("xls", MonitorRequestController.EXCEL_MEDIATYPE);
}

}

0 comments on commit a8707c8

Please sign in to comment.