/* Copyright 2006-2009 the original author or authors.
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
package org.codehaus.groovy.grails.plugins.springsecurity;
import java.util.Map;
import javax.servlet.http.HttpServletRequest;
import org.springframework.security.ConfigAttributeDefinition;
import org.springframework.security.intercept.web.FilterInvocation;
import org.springframework.util.Assert;
import org.springframework.util.StringUtils;
/**
* @author Burt Beckwith
*/
public class RequestmapFilterInvocationDefinition extends AbstractFilterInvocationDefinition {
private boolean _initialized;
private String _requestMapClass;
private String _requestMapPathFieldName;
private String _requestMapConfigAttributeField;
private RequestmapFilterInvocationDefinitionHelper _helper;
@Override
protected String determineUrl(final FilterInvocation filterInvocation) {
HttpServletRequest request = filterInvocation.getHttpRequest();
String requestUrl = request.getRequestURI().substring(request.getContextPath().length());
return lowercaseAndStringQuerystring(requestUrl);
}
@Override
protected void initialize() {
if (!_initialized) {
reset();
_initialized = true;
}
}
/**
* Call at startup or when Requestmap
instances have been added, removed, or changed.
*/
public synchronized void reset() {
Map data = _helper.loadRequestmaps();
_compiled.clear();
for (Map.Entry entry : data.entrySet()) {
String pattern = entry.getKey();
String[] tokens = StringUtils.commaDelimitedListToStringArray(entry.getValue());
storeMapping(pattern, tokens);
}
if (_log.isTraceEnabled()) {
_log.trace("configs: " + _compiled);
}
}
private void storeMapping(final String pattern, final String[] tokens) {
ConfigAttributeDefinition configAttribute = new ConfigAttributeDefinition(tokens);
Object key = getUrlMatcher().compile(pattern);
ConfigAttributeDefinition replaced = _compiled.put(key, configAttribute);
if (replaced != null) {
_log.warn("replaced rule for '" + key + "' with roles " + replaced.getConfigAttributes()
+ " with roles " + configAttribute.getConfigAttributes());
}
}
/**
* Dependency injection for the Requestmap class name.
* @param name the class name
*/
public void setRequestMapClass(final String name) {
_requestMapClass = name;
}
/**
* Dependency injection for the Requestmap config attribute (e.g. roles) field name.
* @param name
*/
public void setRequestMapConfigAttributeField(final String name) {
_requestMapConfigAttributeField = name;
}
/**
* Dependency injection for the Requestmap path field name.
* @param name
*/
public void setRequestMapPathFieldName(final String name) {
_requestMapPathFieldName = name;
}
/**
* {@inheritDoc}
* @see org.springframework.beans.factory.InitializingBean#afterPropertiesSet()
*/
@Override
public void afterPropertiesSet() {
super.afterPropertiesSet();
Assert.notNull(_requestMapClass, "Requestmap class name is required");
Assert.notNull(_requestMapPathFieldName, "Requestmap path field name is required");
Assert.notNull(_requestMapConfigAttributeField, "Requestmap config attribute field name is required");
_helper = new RequestmapFilterInvocationDefinitionHelper(_requestMapClass,
_requestMapPathFieldName, _requestMapConfigAttributeField);
}
}