package org.deegree.securityproxy.wfs;
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;
import java.util.Map;
/**
* This is an implementation of a {@link ServiceManager} for wfs requests. It contains a wfs specific parser, filter
* manager and a service exception wrapper.
*
* @author <a href="stenger@lat-lon.de">Dirk Stenger</a>
* @author last edited by: $Author: stenger $
* @version $Revision: $, $Date: $
*/
public class WfsServiceManager implements ServiceManager, ServiceExceptionManager {
private final OwsRequestParser parser;
private final List<ResponseFilterManager> filterManagers;
private final ServiceExceptionWrapper serviceExceptionWrapper;
private final Map<String, String[]> additionalKeyValuePairs;
/**
* Creates a new instance of {@link WfsServiceManager} with default ServiceExceptionWrapper.
*
* @param parser
* never <code>null</code>
* @param filterManagers
* never <code>null</code>
* @param additionalKeyValuePairs
* a map containing additional key value pairs which will be attached to the incoming request, may be
* <code>null</code>
*/
public WfsServiceManager( OwsRequestParser parser, List<ResponseFilterManager> filterManagers,
Map<String, String[]> additionalKeyValuePairs ) {
this( parser, filterManagers, null, additionalKeyValuePairs );
}
/**
* Creates a new instance of {@link WfsServiceManager}.
*
* @param parser
* never <code>null</code>
* @param filterManagers
* never <code>null</code>
* @param serviceExceptionWrapper
* may be <code>null</code>
* @param additionalKeyValuePairs
* a map containing additional key value pairs which will be attached to the incoming request, may be
* <code>null</code>
*/
public WfsServiceManager( OwsRequestParser parser, List<ResponseFilterManager> filterManagers,
ServiceExceptionWrapper serviceExceptionWrapper,
Map<String, String[]> additionalKeyValuePairs ) {
this.parser = parser;
this.filterManagers = filterManagers;
if ( serviceExceptionWrapper != null )
this.serviceExceptionWrapper = serviceExceptionWrapper;
else
this.serviceExceptionWrapper = new ServiceExceptionWrapper();
this.additionalKeyValuePairs = additionalKeyValuePairs;
}
@Override
public OwsRequest parse( HttpServletRequest httpRequest )
throws UnsupportedRequestTypeException, RequestParsingException {
return parser.parse( httpRequest );
}
@Override
public AuthorizationReport authorize( Authentication authentication, OwsRequest owsRequest ) {
return new AuthorizationReport( "Authorization is disabled.", true, additionalKeyValuePairs );
}
@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 doesEqualWfs( serviceType );
return doesEqualWfs( new ServiceTypeParser().determineServiceType( request ) );
}
private boolean doesEqualWfs( String serviceType ) {
return "wfs".equalsIgnoreCase( serviceType );
}
private ResponseFilterReport createEmptyFilterReport() {
return new DefaultResponseFilterReport( "Response was not filtered! No response filter manager was found!" );
}
}