package org.deegree.securityproxy.wms;
import org.deegree.securityproxy.authorization.RequestAuthorizationManager;
import org.deegree.securityproxy.authorization.logging.AuthorizationReport;
import org.deegree.securityproxy.exception.ServiceExceptionManager;
import org.deegree.securityproxy.exception.ServiceExceptionWrapper;
import org.deegree.securityproxy.filter.ServiceManager;
import org.deegree.securityproxy.filter.StatusCodeResponseBodyWrapper;
import org.deegree.securityproxy.request.OwsRequest;
import org.deegree.securityproxy.request.UnsupportedRequestTypeException;
import org.deegree.securityproxy.request.parser.OwsRequestParser;
import org.deegree.securityproxy.request.parser.RequestParsingException;
import org.deegree.securityproxy.request.parser.ServiceTypeParser;
import org.deegree.securityproxy.responsefilter.ResponseFilterException;
import org.deegree.securityproxy.responsefilter.ResponseFilterManager;
import org.deegree.securityproxy.responsefilter.logging.DefaultResponseFilterReport;
import org.deegree.securityproxy.responsefilter.logging.ResponseFilterReport;
import org.springframework.security.core.Authentication;
import javax.servlet.http.HttpServletRequest;
import java.util.List;
/**
* This is an implementation of a {@link ServiceManager} for wms-requests. It contains wms specific parser,
* authorization-manager and filter-manager. It is possible to start parsing of wms-requests, wms-authorization,
* wms-response-filtering and a check whether response-filtering is enabled.
*
* @author <a href="wanhoff@lat-lon.de">Jeronimo Wanhoff</a>
* @author last edited by: $Author: stenger $
* @version $Revision: $, $Date: $
*/
class WmsServiceManager implements ServiceManager, ServiceExceptionManager {
private final OwsRequestParser parser;
private final RequestAuthorizationManager requestAuthorizationManager;
private final List<ResponseFilterManager> filterManagers;
private final ServiceExceptionWrapper serviceExceptionWrapper;
public WmsServiceManager( OwsRequestParser parser, RequestAuthorizationManager requestAuthorizationManager,
List<ResponseFilterManager> filterManagers,
ServiceExceptionWrapper serviceExceptionWrapper ) {
this.parser = parser;
this.requestAuthorizationManager = requestAuthorizationManager;
this.filterManagers = filterManagers;
if ( serviceExceptionWrapper != null )
this.serviceExceptionWrapper = serviceExceptionWrapper;
else
this.serviceExceptionWrapper = new ServiceExceptionWrapper();
}
@Override
public OwsRequest parse( HttpServletRequest httpRequest )
throws UnsupportedRequestTypeException, RequestParsingException {
return parser.parse( httpRequest );
}
@Override
public AuthorizationReport authorize( Authentication authentication, OwsRequest owsRequest ) {
return requestAuthorizationManager.decide( authentication, owsRequest );
}
@Override
public boolean isResponseFilterEnabled( OwsRequest owsRequest ) {
for ( ResponseFilterManager filterManager : filterManagers ) {
if ( filterManager.canBeFiltered( owsRequest ) )
return true;
}
return false;
}
@Override
public ResponseFilterReport filterResponse( StatusCodeResponseBodyWrapper wrappedResponse,
Authentication authentication, OwsRequest owsRequest )
throws ResponseFilterException {
for ( ResponseFilterManager filterManager : filterManagers ) {
if ( filterManager.canBeFiltered( owsRequest ) )
return filterManager.filterResponse( wrappedResponse, owsRequest, authentication );
}
return createEmptyFilterReport();
}
@Override
public ServiceExceptionWrapper retrieveServiceExceptionWrapper() {
return serviceExceptionWrapper;
}
@Override
public boolean isServiceTypeSupported( String serviceType, HttpServletRequest request ) {
if ( serviceType != null )
return doesEqualWms( serviceType );
return doesEqualWms( new ServiceTypeParser().determineServiceType( request ) );
}
private boolean doesEqualWms( String serviceType ) {
return "wms".equalsIgnoreCase( serviceType );
}
private ResponseFilterReport createEmptyFilterReport() {
return new DefaultResponseFilterReport( "Response was not filtered! No response filter manager was found!" );
}
}