HibernateMappingModifier.java :  » Workflow-Engines » osbl-1_0 » org » conform » hibernate » Java Open Source

Java Open Source » Workflow Engines » osbl 1_0 
osbl 1_0 » org » conform » hibernate » HibernateMappingModifier.java
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));
                }
            }
        }
    }
}
java2s.com  | Contact Us | Privacy Policy
Copyright 2009 - 12 Demo Source and Support. All rights reserved.
All other trademarks are property of their respective owners.