/* (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.ows; import java.lang.reflect.Method; import java.lang.reflect.Proxy; import java.util.logging.Logger; import org.geoserver.config.ServiceInfo; import org.geoserver.ows.util.OwsUtils; import org.geoserver.platform.Operation; import org.geoserver.platform.Service; import org.geoserver.platform.ServiceException; import org.geotools.util.logging.Logging; /** * Intercepts requests to all OWS services ensuring that the service is enabled. * * @author Justin Deoliveira, OpenGEO * */ public class DisabledServiceCheck implements DispatcherCallback { static final Logger LOGGER = Logging.getLogger(DisabledServiceCheck.class); public Request init(Request request) { return request; } public Service serviceDispatched(Request request, Service service) { //first get serviceInfo object from service Object s = service.getService(); //get the getServiceInfo() method Method m = null; //if this object is actually proxied, we need to a big more work if ( s instanceof Proxy ) { Class[] interfaces = s.getClass().getInterfaces(); for ( int i = 0; m == null && i < interfaces.length; i++ ) { m = OwsUtils.getter( interfaces[i], "serviceInfo", ServiceInfo.class ); } } else { m = OwsUtils.getter( s.getClass(), "serviceInfo", ServiceInfo.class ); } if ( m != null ) { try { ServiceInfo info = (ServiceInfo) m.invoke( s , null ); if(info == null) { // log a warning, we could not perform an important check LOGGER.warning("Could not get a ServiceInfo for service " + service.getId() + " even if the service implements ServiceInfo, thus could not check if the service is enabled"); } else { // check if the service is enabled if (!info.isEnabled()) { throw new ServiceException( "Service " + info.getName() + " is disabled" ); } } } catch (Exception e) { //TODO: log this throw new ServiceException( e ); } } else { // log a warning, we could not perform an important check LOGGER.warning("Could not get a ServiceInfo for service " + service.getId() + " thus could not check if the service is enabled"); } return service; } public Operation operationDispatched(Request request, Operation operation) { return operation; } public Object operationExecuted(Request request, Operation operation, Object result) { return result; } public Response responseDispatched(Request request, Operation operation, Object result, Response response) { return response; } public void finished(Request request) { } }