| 38 | |
| 39 | |
| 40 | public class ObjectModelAdaptor implements ModelAdaptor { |
| 41 | protected static final Member INVALID_MEMBER; |
| 42 | static { |
| 43 | Member invalidMember; |
| 44 | try { |
| 45 | invalidMember = ObjectModelAdaptor.class.getDeclaredField("INVALID_MEMBER"); |
| 46 | } |
| 47 | catch (NoSuchFieldException ex) { |
| 48 | invalidMember = null; |
| 49 | } |
| 50 | catch (SecurityException ex) { |
| 51 | invalidMember = null; |
| 52 | } |
| 53 | INVALID_MEMBER = invalidMember; |
| 54 | } |
| 55 | |
| 56 | protected static final Map<Class<?>, Map<String, Member>> membersCache = new HashMap<Class<?>, Map<String, Member>>(); |
| 57 | @Override |
| 58 | public synchronized Object getProperty(Interpreter interp, ST self, Object o, Object property, String propertyName) throws STNoSuchPropertyException { |
| 59 | if ( o==null ) { |
| 60 | throw new NullPointerException("o"); |
| 61 | } |
| 62 | Class<?> c = o.getClass(); |
| 63 | if ( property==null ) { |
| 64 | return throwNoSuchProperty(c, propertyName, null); |
| 65 | } |
| 66 | Member member = findMember(c, propertyName); |
| 67 | if ( member!=null ) { |
| 68 | try { |
| 69 | if ( member instanceof Method ) { |
| 70 | return ((Method)member).invoke(o); |
| 71 | } |
| 72 | else if ( member instanceof Field ) { |
| 73 | return ((Field)member).get(o); |
| 74 | } |
| 75 | } |
| 76 | catch (Exception e) { |
| 77 | throwNoSuchProperty(c, propertyName, e); |
| 78 | } |
| 79 | } |
| 80 | return throwNoSuchProperty(c, propertyName, null); |
| 81 | } |
| 82 | |
| 83 | protected static Member findMember(Class<?> clazz, String memberName) { |
| 84 | if ( clazz==null ) { |
| 85 | throw new NullPointerException("clazz"); |
| 86 | } |
| 87 | if ( memberName==null ) { |
| 88 | throw new NullPointerException("memberName"); |
| 89 | } |
| 90 | synchronized (membersCache) { |
| 91 | Map<String, Member> members = membersCache.get(clazz); |
| 92 | Member member; |
| 93 | if ( members!=null ) { |
| 94 | member = members.get(memberName); |
| 95 | if ( member!=null ) { |
| 96 | return member!= INVALID_MEMBER ? member : null; |
| 97 | } |
nothing calls this directly
no outgoing calls
no test coverage detected