001 package org.trails.security;
002
003 import java.beans.Introspector;
004 import java.beans.PropertyDescriptor;
005 import java.lang.reflect.Field;
006 import java.lang.reflect.Method;
007 import java.util.ArrayList;
008 import java.util.Iterator;
009 import java.util.List;
010
011 import ognl.Ognl;
012 import org.trails.descriptor.IClassDescriptor;
013 import org.trails.descriptor.IPropertyDescriptor;
014 import org.trails.security.annotation.SecurityAnnotationHandler;
015
016 public class TrailsSecurityService implements SecurityService
017 {
018
019 public TrailsSecurityService()
020 {
021 super();
022 // TODO Auto-generated constructor stub
023 }
024
025 public List buildRestrictions(IClassDescriptor classDescriptor)
026 {
027 ArrayList restrictions = new ArrayList();
028 SecurityAnnotationHandler annotationHandler = new SecurityAnnotationHandler();
029 restrictions.addAll(annotationHandler.buildClassRestrictions(classDescriptor.getType()));
030 for (Iterator iter = classDescriptor.getPropertyDescriptors().iterator(); iter.hasNext();)
031 {
032 IPropertyDescriptor propertyDescriptor = (IPropertyDescriptor) iter.next();
033 try
034 {
035 Field field = classDescriptor.getType().getDeclaredField(
036 propertyDescriptor.getName());
037 restrictions.addAll(annotationHandler.buildPropertyRestrictions(
038 field, propertyDescriptor.getName()) );
039 }
040 catch (Exception ex)
041 {
042 // that's fine
043 }
044 try
045 {
046 PropertyDescriptor beanPropDescriptor = (PropertyDescriptor) Ognl.getValue("propertyDescriptors.{? name == '" + propertyDescriptor.getName() + "'}[0]",
047 Introspector.getBeanInfo(classDescriptor.getType()));
048 Method readMethod = beanPropDescriptor.getReadMethod();
049 restrictions.addAll(annotationHandler.buildPropertyRestrictions(
050 readMethod, propertyDescriptor.getName()) );
051 }
052 catch (Exception ex)
053 {
054 // this is fine too
055 }
056 }
057 return restrictions;
058 }
059
060 public List findRestrictions(IClassDescriptor classDescriptor)
061 {
062 // TODO use cached version.
063 return buildRestrictions(classDescriptor);
064 }
065
066 }