/**
*
*/
package org.javabuilders.handler.validation;
import java.util.List;
import java.util.Map;
import java.util.logging.Logger;
import org.javabuilders.BuildException;
import org.javabuilders.BuildProcess;
import org.javabuilders.Builder;
import org.javabuilders.BuilderConfig;
import org.javabuilders.NamedObjectProperty;
import org.javabuilders.Node;
import org.javabuilders.handler.AbstractTypeHandler;
import org.javabuilders.handler.ITypeChildrenHandler;
import org.javabuilders.util.BuilderUtils;
/**
* Handler for "validate:" - integrates with Commons Validators
* @author Jacek Furmankiewicz
*/
public class DefaultValidatorTypeHandler extends AbstractTypeHandler implements ITypeChildrenHandler {
private static final DefaultValidatorTypeHandler singleton = new DefaultValidatorTypeHandler();
/**
* @return Singleton
*/
public static DefaultValidatorTypeHandler getInstance() {return singleton;}
/**
* Constructor
*/
private DefaultValidatorTypeHandler() {
super(Builder.CONTENT);
}
/* (non-Javadoc)
* @see org.javabuilders.handler.ITypeHandler#createNewInstance(org.javabuilders.BuilderConfig, org.javabuilders.BuildProcess, org.javabuilders.Node, java.lang.String, java.util.Map)
*/
public Node createNewInstance(BuilderConfig config, BuildProcess process,
Node parent, String key, Map<String, Object> typeDefinition)
throws BuildException {
BuilderValidators instance = process.getBuildResult().getValidators();
return useExistingInstance(config, process, parent, key, typeDefinition, instance);
}
/* (non-Javadoc)
* @see org.javabuilders.handler.ITypeHandler#useExistingInstance(org.javabuilders.BuilderConfig, org.javabuilders.BuildProcess, org.javabuilders.Node, java.lang.String, java.util.Map, java.lang.Object)
*/
@SuppressWarnings("unchecked")
public Node useExistingInstance(BuilderConfig config, BuildProcess process,
Node parent, String key, Map<String, Object> typeDefinition,
Object instance) throws BuildException {
Node node = new Node(parent, key, typeDefinition);
node.setMainObject(instance);
List<Object> contents = (List<Object>)typeDefinition.get(Builder.CONTENT);
for(Object validatorData : contents) {
if (validatorData instanceof Map) {
Map<String,Object> data = (Map<String,Object>)validatorData;
for(String dataKey : data.keySet()) {
NamedObjectProperty property = BuilderUtils.getParsedProperty(dataKey);
PropertyValidations validator = new PropertyValidations(property);
Map<String,Object> validatorProperties = (Map<String,Object>)data.get(dataKey);
BuilderUtils.populateObjectPropertiesFromMap(validator, validatorProperties);
process.getBuildResult().getValidators().add(validator);
}
} else {
throw new BuildException("Unable to parse validator data: " + validatorData);
}
}
return node;
}
/* (non-Javadoc)
* @see org.javabuilders.IKeyValueConsumer#getApplicableClass()
*/
public Class<?> getApplicableClass() {
return BuilderValidators.class;
}
}