1 /* 2 * Copyright (c) 2010 Carman Consulting, Inc. 3 * 4 * Licensed under the Apache License, Version 2.0 (the "License"); 5 * you may not use this file except in compliance with the License. 6 * You may obtain a copy of the License at 7 * 8 * http://www.apache.org/licenses/LICENSE-2.0 9 * 10 * Unless required by applicable law or agreed to in writing, software 11 * distributed under the License is distributed on an "AS IS" BASIS, 12 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 13 * See the License for the specific language governing permissions and 14 * limitations under the License. 15 */ 16 17 package org.metastopheles; 18 19 import java.beans.BeanDescriptor; 20 import java.io.Serializable; 21 import java.lang.reflect.AnnotatedElement; 22 import java.lang.reflect.Method; 23 import java.util.HashMap; 24 import java.util.Map; 25 import java.util.Set; 26 import java.util.TreeSet; 27 28 /** 29 * @author James Carman 30 * @since 1.0 31 */ 32 public class BeanMetaData extends MetaDataObject 33 { 34 //********************************************************************************************************************** 35 // Fields 36 //********************************************************************************************************************** 37 38 private static final long serialVersionUID = 1L; 39 private final BeanDescriptor beanDescriptor; 40 private final Map<String, PropertyMetaData> propertyMetaDataMap = new HashMap<String,PropertyMetaData>(); 41 private final Map<Method,MethodMetaData> methodMethodMetaDataMap = new HashMap<Method,MethodMetaData>(); 42 private final String factoryId; 43 44 //********************************************************************************************************************** 45 // Constructors 46 //********************************************************************************************************************** 47 48 BeanMetaData(String factoryId, BeanDescriptor beanDescriptor) 49 { 50 this.factoryId = factoryId; 51 this.beanDescriptor = beanDescriptor; 52 } 53 54 //********************************************************************************************************************** 55 // Getter/Setter Methods 56 //********************************************************************************************************************** 57 58 public BeanDescriptor getBeanDescriptor() 59 { 60 return beanDescriptor; 61 } 62 63 //********************************************************************************************************************** 64 // Other Methods 65 //********************************************************************************************************************** 66 67 @Override 68 protected AnnotatedElement getDefaultAnnotationSource() 69 { 70 return beanDescriptor.getBeanClass(); 71 } 72 73 void addMethodMetaData(MethodMetaData methodMetaData) 74 { 75 methodMethodMetaDataMap.put(methodMetaData.getMethodDescriptor().getMethod(), methodMetaData); 76 } 77 78 void addPropertyMetaData(PropertyMetaData propertyMetaData) 79 { 80 propertyMetaDataMap.put(propertyMetaData.getPropertyDescriptor().getName(), propertyMetaData); 81 } 82 83 protected Object writeReplace() 84 { 85 return new SerializedForm(factoryId, beanDescriptor.getBeanClass()); 86 } 87 88 public MethodMetaData getMethodMetaData(String methodName, Class<?>... parameterTypes) 89 { 90 try 91 { 92 return methodMethodMetaDataMap.get(getBeanDescriptor().getBeanClass().getMethod(methodName, parameterTypes)); 93 } 94 catch (NoSuchMethodException e) 95 { 96 throw new IllegalArgumentException("Method " + methodName + " not found on class " + getBeanDescriptor().getBeanClass().getName() + ".", e); 97 } 98 } 99 100 /** 101 * Returns the @{link PropertyMetaData} object for the property named <code>propertyName</code>. 102 * @param propertyName the property name 103 * @return the @{link PropertyMetaData} object for the property named <code>propertyName</code> 104 */ 105 public PropertyMetaData getPropertyMetaData(String propertyName) 106 { 107 return propertyMetaDataMap.get(propertyName); 108 } 109 110 /** 111 * Returns a (modifiable) set containing all of the property names for this bean type. 112 * @return a (modifiable) set containing all of the property names for this bean type 113 */ 114 public Set<String> getPropertyNames() 115 { 116 return new TreeSet<String>(propertyMetaDataMap.keySet()); 117 } 118 119 //********************************************************************************************************************** 120 // Inner Classes 121 //********************************************************************************************************************** 122 123 private static class SerializedForm implements Serializable 124 { 125 private final String factoryId; 126 private final Class beanClass; 127 128 private SerializedForm(String factoryId, Class beanClass) 129 { 130 this.factoryId = factoryId; 131 this.beanClass = beanClass; 132 } 133 134 protected Object readResolve() 135 { 136 return BeanMetaDataFactory.get(factoryId).getBeanMetaData(beanClass); 137 } 138 } 139 }