*/
private void addXmlConstraints(Class<?> beanClass, MetaBean metabean) throws IllegalAccessException,
InvocationTargetException {
for (final MetaConstraint<?, ? extends Annotation> metaConstraint : factoryContext.getFactory().getMetaConstraints(beanClass)) {
Meta meta;
AccessStrategy access = metaConstraint.getAccessStrategy();
boolean create = false;
if (access == null) { // class level
meta = null;
} else if (access.getElementType() == ElementType.METHOD && !metaConstraint.getMember().getName().startsWith("get")) { // TODO: better getter test
final Method method = Method.class.cast(metaConstraint.getMember());
meta = metabean.getMethod(method);
final MetaMethod metaMethod;
if (meta == null) {
meta = new MetaMethod(metabean, method);
metaMethod = MetaMethod.class.cast(meta);
metabean.addMethod(method, metaMethod);
} else {
metaMethod = MetaMethod.class.cast(meta);
}
final Integer index = metaConstraint.getIndex();
if (index != null && index >= 0) {
MetaParameter param = metaMethod.getParameter(index);
if (param == null) {
param = new MetaParameter(metaMethod, index);
metaMethod.addParameter(index, param);
}
param.addAnnotation(metaConstraint.getAnnotation());
} else {
metaMethod.addAnnotation(metaConstraint.getAnnotation());
}
continue;
} else if (access.getElementType() == ElementType.CONSTRUCTOR){
final Constructor<?> constructor = Constructor.class.cast(metaConstraint.getMember());
meta = metabean.getConstructor(constructor);
final MetaConstructor metaConstructor;
if (meta == null) {
meta = new MetaConstructor(metabean, constructor);
metaConstructor = MetaConstructor.class.cast(meta);
metabean.addConstructor(constructor, metaConstructor);
} else {
metaConstructor = MetaConstructor.class.cast(meta);
}
final Integer index = metaConstraint.getIndex();
if (index != null && index >= 0) {
MetaParameter param = metaConstructor.getParameter(index);
if (param == null) {
param = new MetaParameter(metaConstructor, index);
metaConstructor.addParameter(index, param);
}
param.addAnnotation(metaConstraint.getAnnotation());
} else {
metaConstructor.addAnnotation(metaConstraint.getAnnotation());
}
continue;
} else { // property level
meta = metabean.getProperty(access.getPropertyName());
create = meta == null;
if (create) {
meta = addMetaProperty(metabean, access);
}
}
if (!annotationProcessor.processAnnotation(metaConstraint.getAnnotation(), meta, beanClass,
metaConstraint.getAccessStrategy(), new AppendValidationToMeta(meta == null ? metabean : meta), false)
&& create) {
metabean.putProperty(access.getPropertyName(), null);
}
}
for (final AccessStrategy access : factoryContext.getFactory().getValidAccesses(beanClass)) {
if (access.getElementType() == ElementType.PARAMETER) {
continue;
}
MetaProperty metaProperty = metabean.getProperty(access.getPropertyName());
boolean create = metaProperty == null;
if (create) {
metaProperty = addMetaProperty(metabean, access);
}
if (!annotationProcessor.addAccessStrategy(metaProperty, access) && create) {
metabean.putProperty(access.getPropertyName(), null);
}
}
}