Created
April 24, 2013 14:44
-
-
Save afterhill/5452674 to your computer and use it in GitHub Desktop.
Revisions
-
afterhill created this gist
Apr 24, 2013 .There are no files selected for viewing
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters. Learn more about bidirectional Unicode charactersOriginal file line number Diff line number Diff line change @@ -0,0 +1,5 @@ package daoannotation; public interface BaseDao { } This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters. Learn more about bidirectional Unicode charactersOriginal file line number Diff line number Diff line change @@ -0,0 +1,70 @@ package daoannotation; import java.lang.annotation.AnnotationFormatError; import java.lang.reflect.InvocationHandler; import java.lang.reflect.Method; import java.lang.reflect.Proxy; public class DaoProxyFactory { @SuppressWarnings("unchecked") public static <T> T newRoleDaoProxy(Class<T> dao) { Implement implAnnotation = dao.getAnnotation(Implement.class); if (implAnnotation == null) { throw new AnnotationFormatError("this is no annotation for this interface: " + dao.getSimpleName().toString()); } BaseDao implClass = null; try { implClass = implAnnotation.value().newInstance(); } catch (Exception e) { throw new RuntimeException("this interface cannot be instanized!", e); } return (T) Proxy.newProxyInstance( DaoProxyFactory.class.getClassLoader(), new Class<?>[] { dao }, new RoleInovationHandler(implClass)); } private static final class RoleInovationHandler implements InvocationHandler { private BaseDao target; public RoleInovationHandler(BaseDao target) { this.target = target; } @Override public Object invoke(Object proxy, Method method, Object[] args) throws Throwable { Permission permitAnnotation = method.getAnnotation(Permission.class); outter: if (permitAnnotation != null) { Role currentRole = RoleContext.INSTANCE.getCurrentRole(); for (Role role : permitAnnotation.value()) { if (role.equals(currentRole)) { break outter; } } throw new SecurityException("user is not allowed to this operation!"); } return method.invoke(target, args); } } public static void main(String[] args) { UserDao userDao = DaoProxyFactory.newRoleDaoProxy(UserDao.class); userDao.save(); userDao.delete(); //userDao.query(); } } This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters. Learn more about bidirectional Unicode charactersOriginal file line number Diff line number Diff line change @@ -0,0 +1,12 @@ package daoannotation; import java.lang.annotation.ElementType; import java.lang.annotation.Retention; import java.lang.annotation.RetentionPolicy; import java.lang.annotation.Target; @Target(ElementType.TYPE) @Retention(RetentionPolicy.RUNTIME) public @interface Implement { Class<? extends UserDao> value(); } This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters. Learn more about bidirectional Unicode charactersOriginal file line number Diff line number Diff line change @@ -0,0 +1,12 @@ package daoannotation; import java.lang.annotation.ElementType; import java.lang.annotation.Retention; import java.lang.annotation.RetentionPolicy; import java.lang.annotation.Target; @Target(ElementType.METHOD) @Retention(RetentionPolicy.RUNTIME) public @interface Permission { Role[] value(); } This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters. Learn more about bidirectional Unicode charactersOriginal file line number Diff line number Diff line change @@ -0,0 +1,15 @@ package daoannotation; public enum Role { ADMINISTRATOR, SYSTEM; public Role get() { // TODO Auto-generated method stub return null; } } This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters. Learn more about bidirectional Unicode charactersOriginal file line number Diff line number Diff line change @@ -0,0 +1,19 @@ package daoannotation; public enum RoleContext { INSTANCE; private ThreadLocal<Role> role = new ThreadLocal<>(); public Role getCurrentRole() { return Role.SYSTEM; } public void setCurrentRole(Role role) { this.role.set(role); } public static void main(String[] args) { System.out.println(RoleContext.INSTANCE.getCurrentRole()); } } This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters. Learn more about bidirectional Unicode charactersOriginal file line number Diff line number Diff line change @@ -0,0 +1,13 @@ package daoannotation; @Implement(UserDaoImpl.class) public interface UserDao extends BaseDao { @Permission({Role.ADMINISTRATOR, Role.SYSTEM}) void save(); @Permission(Role.SYSTEM) void delete(); @Permission(Role.ADMINISTRATOR) void query(); } This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters. Learn more about bidirectional Unicode charactersOriginal file line number Diff line number Diff line change @@ -0,0 +1,22 @@ package daoannotation; public class UserDaoImpl implements UserDao { @Override public void save() { System.out.println("UserDaoImpl.save()!"); } @Override public void delete() { System.out.println("UserDaoImpl.delete()!"); } @Override public void query() { System.out.println("UserDaoImpl.query()!"); } }