Sparkle’s Workshop

annotation for acegi

Posted on April 19, 2005 - Filed Under Java |

UPDATE: The new version of acegi has itself’s annotation implement. So you don’t need this any more.

annotation is so good that i can’t wait to use it in acegi

code sample

    import java.util.List;
    import org.gotblog.common.acegi.SecurityConfig;
    import org.springframework.transaction.annotation.Transactional;
    public interface BookManager {
	@Transactional
	@SecurityConfig( { "ROLE_USER", "ROLE_ANONYMOUS" })
	public List listBook();
    }

here’s my implementation for it

    package org.gotblog.common.acegi;
 
    import static java.lang.annotation.ElementType.METHOD;
    import static java.lang.annotation.ElementType.TYPE;
    import static java.lang.annotation.RetentionPolicy.RUNTIME;
 
    import java.lang.annotation.Retention;
    import java.lang.annotation.Target;
 
    @Target( { TYPE, METHOD })
    @Retention(RUNTIME)
    public @interface SecurityConfig {
	String[] value();
    }
    package org.gotblog.common.acegi;
 
    import java.lang.annotation.Annotation;
    import java.lang.reflect.Field;
    import java.lang.reflect.Method;
    import java.util.Collection;
    import java.util.HashSet;
    import java.util.Set;
 
    import org.springframework.metadata.Attributes;
 
    public class AcegiAnnotationAttributes implements Attributes {
	// TODO need to add cache
 
	public Collection getAttributes(Class targetClass) {
		Set<net.sf.acegisecurity.SecurityConfig> configs = 
			new HashSet<net.sf.acegisecurity.SecurityConfig>();
		for (Annotation annotation : targetClass.getAnnotations()) {
			if (annotation instanceof SecurityConfig) {
				SecurityConfig config = (SecurityConfig) annotation;
				for (String value : config.value()) {
					configs.add(new net.sf.acegisecurity.SecurityConfig(value));
				}
				break;
			}
		}
		return configs;
	}
 
	public Collection getAttributes(Class targetClass, Class filter) {
		throw new IllegalArgumentException("Not support filter");
	}
 
	public Collection getAttributes(Method targetMethod) {
		Set<net.sf.acegisecurity.SecurityConfig> configs = 
			new HashSet<net.sf.acegisecurity.SecurityConfig>();
		for (Annotation annotation : targetMethod.getAnnotations()) {
			if (annotation instanceof SecurityConfig) {
				SecurityConfig config = (SecurityConfig) annotation;
				for (String value : config.value()) {
					configs.add(new net.sf.acegisecurity.SecurityConfig(value));
				}
				break;
			}
		}
		return configs;
	}
 
	public Collection getAttributes(Method targetMethod, Class filter) {
		throw new IllegalArgumentException("Not support filter");
	}
 
	public Collection getAttributes(Field targetField) {
		throw new IllegalArgumentException("Not support field annotation");
	}
 
	public Collection getAttributes(Field targetField, Class filter) {
		throw new IllegalArgumentException("Not support field annotation");
	}
 
    }
    <bean id="acegiAnnotationAttributes" 
	class="org.gotblog.common.acegi.AcegiAnnotationAttributes"/>
    <bean id="objectDefinitionSource" 
	class="net.sf.acegisecurity.intercept.method.MethodDefinitionAttributes">
	<property name="attributes">
		<ref local="acegiAnnotationAttributes"/>
	</property>
    </bean>

it works fine and i haven’t optimized it for performance

Most Commented Posts

Comments

Leave a Reply