/* (c) 2014 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.monitor.ows;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import org.geoserver.catalog.Catalog;
import org.geoserver.monitor.Monitor;
import org.geoserver.monitor.RequestData;
import org.geoserver.monitor.RequestData.Category;
import org.geoserver.monitor.RequestData.Status;
import org.geoserver.monitor.ows.wcs10.DescribeCoverageHandler;
import org.geoserver.monitor.ows.wcs10.GetCoverageHandler;
import org.geoserver.monitor.ows.wfs.DescribeFeatureTypeHandler;
import org.geoserver.monitor.ows.wfs.GetFeatureHandler;
import org.geoserver.monitor.ows.wfs.LockFeatureHandler;
import org.geoserver.monitor.ows.wfs.TransactionHandler;
import org.geoserver.monitor.ows.wms.GetFeatureInfoHandler;
import org.geoserver.monitor.ows.wms.GetLegendGraphicHandler;
import org.geoserver.monitor.ows.wms.GetMapHandler;
import org.geoserver.ows.DispatcherCallback;
import org.geoserver.ows.Request;
import org.geoserver.ows.Response;
import org.geoserver.platform.GeoServerExtensions;
import org.geoserver.platform.Operation;
import org.geoserver.platform.Service;
import org.geoserver.platform.ServiceException;
public class MonitorCallback implements DispatcherCallback {
List<RequestObjectHandler> handlers = new ArrayList<RequestObjectHandler>();
Monitor monitor;
public MonitorCallback(Monitor monitor, Catalog catalog) {
this.monitor = monitor;
//wfs
handlers.add(new DescribeFeatureTypeHandler(monitor.getConfig(), catalog));
handlers.add(new GetFeatureHandler(monitor.getConfig(), catalog));
handlers.add(new LockFeatureHandler(monitor.getConfig(), catalog));
handlers.add(new TransactionHandler(monitor.getConfig(), catalog));
//wms
handlers.add(new GetFeatureInfoHandler(monitor.getConfig()));
handlers.add(new GetMapHandler(monitor.getConfig()));
handlers.add(new GetLegendGraphicHandler(monitor.getConfig()));
//wcs
handlers.add(new DescribeCoverageHandler(monitor.getConfig()));
handlers.add(new GetCoverageHandler(monitor.getConfig()));
handlers.add(new org.geoserver.monitor.ows.wcs11.DescribeCoverageHandler(monitor.getConfig()));
handlers.add(new org.geoserver.monitor.ows.wcs11.GetCoverageHandler(monitor.getConfig()));
}
public Request init(Request request) {
return null;
}
public Response responseDispatched(Request request, Operation operation, Object result,
Response response) {
return null;
}
public Service serviceDispatched(Request request, Service service) throws ServiceException {
return null;
}
public Operation operationDispatched(Request request, Operation operation) {
RequestData data = monitor.current();
if (data == null) {
//will happen in cases where the filter is not active
return operation;
}
data.setCategory(Category.OWS);
data.setService(operation.getService().getId().toUpperCase());
data.setOperation(normalizedOpId(operation));
data.setOwsVersion(operation.getService().getVersion().toString());
if (operation.getParameters().length > 0) {
//TODO: a better check for the request object
Object reqObj = operation.getParameters()[0];
for (RequestObjectHandler h : handlers) {
if (h.canHandle(reqObj)) {
h.handle(reqObj, data);
break;
}
}
}
monitor.update();
return operation;
}
public Object operationExecuted(Request request, Operation operation, Object result) {
return null;
}
public void finished(Request request) {
if (request.getError() != null) {
RequestData data = monitor.current();
if (data == null) {
//will happen in cases where the filter is not active
return;
}
data.setStatus(Status.FAILED);
data.setErrorMessage(request.getError().getLocalizedMessage());
data.setError(request.getError());
monitor.update();
}
}
Map<String,Map<String,String>> OPS;
String normalizedOpId(Operation op) {
if (OPS == null) {
synchronized (this) {
if (OPS == null) {
OPS = new HashMap<String,Map<String,String>>();
for (Service s : GeoServerExtensions.extensions(Service.class)) {
HashMap<String,String> map = new HashMap<String,String>();
OPS.put(s.getId().toUpperCase(), map);
for (String o : s.getOperations()) {
map.put(o.toUpperCase(), o);
}
}
}
}
}
Map<String,String> map = OPS.get(op.getService().getId().toUpperCase());
if (map != null) {
String normalized = map.get(op.getId().toUpperCase());
if (normalized != null) {
return normalized;
}
}
return op.getId();
}
}