package com.mossle.security.client;
import java.util.ArrayList;
import java.util.LinkedHashMap;
import java.util.List;
import java.util.Map;
import com.mossle.core.util.BeanUtils;
import com.mossle.security.api.MethodSourceFetcher;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.security.access.ConfigAttribute;
import org.springframework.security.access.SecurityConfig;
import org.springframework.security.access.method.DelegatingMethodSecurityMetadataSource;
import org.springframework.security.access.method.MapBasedMethodSecurityMetadataSource;
import org.springframework.security.access.method.MethodSecurityMetadataSource;
import org.springframework.util.Assert;
public class MethodResourcePopulator {
private static Logger logger = LoggerFactory
.getLogger(MethodResourcePopulator.class);
public void execute(
DelegatingMethodSecurityMetadataSource delegatingMethodSecurityMetadataSource,
Map<String, String> resourceMap) {
Assert.notNull(delegatingMethodSecurityMetadataSource);
Assert.notNull(resourceMap);
logger.info("refresh method resource");
Map<String, List<ConfigAttribute>> methodMap = null;
methodMap = new LinkedHashMap<String, List<ConfigAttribute>>();
for (Map.Entry<String, String> entry : resourceMap.entrySet()) {
methodMap.put(entry.getKey(), SecurityConfig
.createListFromCommaDelimitedString(entry.getValue()));
}
MethodSecurityMetadataSource source = new MapBasedMethodSecurityMetadataSource(
methodMap);
List<MethodSecurityMetadataSource> sources = new ArrayList<MethodSecurityMetadataSource>();
sources.add(source);
List<MethodSecurityMetadataSource> methodSecurityMetadataSources = delegatingMethodSecurityMetadataSource
.getMethodSecurityMetadataSources();
methodSecurityMetadataSources.clear();
methodSecurityMetadataSources.addAll(sources);
Map attributeCache = (Map) BeanUtils.safeGetFieldValue(
delegatingMethodSecurityMetadataSource, "attributeCache");
attributeCache.clear();
}
}