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    }