/* Copyright (c) 2001 - 2011 TOPP - www.openplans.org. All rights reserved. * This code is licensed under the GPL 2.0 license, availible 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.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 { static List<RequestObjectHandler> HANDLERS = new ArrayList(); static { //wfs HANDLERS.add(new DescribeFeatureTypeHandler()); HANDLERS.add(new GetFeatureHandler()); HANDLERS.add(new LockFeatureHandler()); HANDLERS.add(new TransactionHandler()); //wms HANDLERS.add(new GetFeatureInfoHandler()); HANDLERS.add(new GetMapHandler()); HANDLERS.add(new GetLegendGraphicHandler()); //wcs HANDLERS.add(new DescribeCoverageHandler()); HANDLERS.add(new GetCoverageHandler()); HANDLERS.add(new org.geoserver.monitor.ows.wcs11.DescribeCoverageHandler()); HANDLERS.add(new org.geoserver.monitor.ows.wcs11.GetCoverageHandler()); } Monitor monitor; public MonitorCallback(Monitor monitor) { this.monitor = monitor; } 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(); for (Service s : GeoServerExtensions.extensions(Service.class)) { HashMap map = new HashMap(); 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(); } }