package org.conform.hibernate;
import org.conform.*;
import org.conform.validator.StringLengthValidator;
import org.conform.validator.PrecisionScaleValidator;
import org.hibernate.mapping.*;
import org.hibernate.mapping.Property;
import org.hibernate.cfg.Configuration;
import org.apache.commons.logging.LogFactory;
import java.util.*;
import java.util.Set;
import java.math.BigDecimal;
import java.math.BigInteger;
public class HibernateMappingModifier
implements Modifier
{
private static org.apache.commons.logging.Log LOG = LogFactory.getLog(Meta.class);
private static final Set integerClasses = new HashSet<Class>(Arrays.asList(new Class[] {
Byte.class,
Short.class,
Integer.class,
Long.class,
byte.class,
short.class,
int.class,
long.class,
BigInteger.class,
}));
private static final Set decimalClasses = new HashSet<Class>(Arrays.asList(new Class[] {
Float.class,
Double.class,
float.class,
double.class,
BigDecimal.class,
}));
BeanMetaProvider beanMetaProvider;
private Configuration configuration;
public HibernateMappingModifier() {
}
public HibernateMappingModifier(Configuration configuration, BeanMetaProvider beanMetaProvider) {
this.configuration = configuration;
this.beanMetaProvider = beanMetaProvider;
}
public Configuration getConfiguration() {
return configuration;
}
public void setConfiguration(Configuration configuration) {
this.configuration = configuration;
}
public BeanMetaProvider getBeanMetaProvider() {
return beanMetaProvider;
}
public void setBeanMetaProvider(BeanMetaProvider beanMetaProvider) {
this.beanMetaProvider = beanMetaProvider;
}
public void modify(BeanMeta beanMeta) {
PersistentClass classMapping = configuration.getClassMapping(beanMeta.getType().getName());
if (classMapping == null)
return;
Property property = (Property)classMapping.getIdentifierProperty();
PropertyMeta propertyMeta = beanMeta.getProperty(property.getName());
if (propertyMeta != null) {
apply(propertyMeta, property);
propertyMeta.setAttribute(PropertyMeta.ATTRIBUTE_IDENTIFIER, Boolean.TRUE);
}
Iterator propertyIterator = classMapping.getPropertyIterator();
while (propertyIterator.hasNext()) {
property = (Property)propertyIterator.next();
propertyMeta = beanMeta.getProperty(property.getName());
if (propertyMeta != null)
apply(propertyMeta, property);
}
}
private void apply(PropertyMeta propertyMeta, Property property) {
if (property.getColumnSpan() == 1) {
Column column = (Column)property.getColumnIterator().next();
Class type = propertyMeta.getType();
if (String.class.equals(type)) {
int length = column.getLength();
propertyMeta.setAttribute(PropertyMeta.ATTRIBUTE_LENGTH, new Integer(length));
propertyMeta.addValidator(new StringLengthValidator(length));
}
else {
if(integerClasses.contains(type)) {
int precision = column.getPrecision();
propertyMeta.setAttribute(PropertyMeta.ATTRIBUTE_PRECISION, new Integer(precision));
if (BigInteger.class.equals(type))
propertyMeta.addValidator(new PrecisionScaleValidator(precision));
}
else if(decimalClasses.contains(type)) {
int precision = column.getPrecision();
int scale = column.getScale();
propertyMeta.setAttribute(PropertyMeta.ATTRIBUTE_PRECISION, new Integer(precision));
propertyMeta.setAttribute(PropertyMeta.ATTRIBUTE_SCALE, new Integer(scale));
if (BigDecimal.class.equals(type))
propertyMeta.addValidator(new PrecisionScaleValidator(precision, scale));
}
}
}
}
}
|