/* * Copyright 2004-2007 the Seasar Foundation and the Others. * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, * either express or implied. See the License for the specific language * governing permissions and limitations under the License. */ package org.seasar.dao.impl; import java.sql.Connection; import java.sql.DatabaseMetaData; import javax.sql.DataSource; import org.seasar.dao.AnnotationReaderFactory; import org.seasar.dao.BeanAnnotationReader; import org.seasar.dao.BeanEnhancer; import org.seasar.dao.BeanMetaData; import org.seasar.dao.BeanMetaDataFactory; import org.seasar.dao.DaoNamingConvention; import org.seasar.dao.Dbms; import org.seasar.dao.TableNaming; import org.seasar.dao.ValueTypeFactory; import org.seasar.dao.dbms.DbmsManager; import org.seasar.extension.jdbc.util.ConnectionUtil; import org.seasar.extension.jdbc.util.DataSourceUtil; /** * @author jflute * @author manhole */ public class BeanMetaDataFactoryImpl implements BeanMetaDataFactory { public static final String annotationReaderFactory_BINDING = "bindingType=must"; public static final String valueTypeFactory_BINDING = "bindingType=must"; public static final String dataSource_BINDING = "bindingType=must"; public static final String daoNamingConvention_BINDING = "bindingType=must"; public static final String beanEnhancer_BINDING = "bindingType=must"; protected AnnotationReaderFactory annotationReaderFactory; protected ValueTypeFactory valueTypeFactory; protected DataSource dataSource; protected DaoNamingConvention daoNamingConvention; protected BeanEnhancer beanEnhancer; public static final String tableNaming_BINDING = "bindingType=may"; protected TableNaming tableNaming = new DefaultTableNaming(); public BeanMetaData createBeanMetaData(final Class beanClass) { return createBeanMetaData(beanClass, 0); } public BeanMetaData createBeanMetaData(final Class beanClass, final int relationNestLevel) { if (beanClass == null) { throw new NullPointerException("beanClass"); } final Connection con = DataSourceUtil.getConnection(dataSource); try { final DatabaseMetaData metaData = ConnectionUtil.getMetaData(con); return createBeanMetaData(metaData, beanClass, relationNestLevel); } finally { ConnectionUtil.close(con); } } protected BeanMetaData createBeanMetaData( final DatabaseMetaData dbMetaData, final Class beanClass, final int relationNestLevel) { System.out .printf( "BeanMetaDataFactoryImpl#createBeanMetaData() [beanClass=%s, relationNestLevel=%d] begin%n", beanClass, relationNestLevel); final BeanMetaDataImpl bmd = createBeanMetaDataImpl(); final BeanEnhancer enhancer = getBeanEnhancer(); final Class originalBeanClass = enhancer.getOriginalClass(beanClass); bmd.setDatabaseMetaData(dbMetaData); final Dbms dbms = getDbms(); bmd.setDbms(dbms); final BeanAnnotationReader bar = annotationReaderFactory .createBeanAnnotationReader(originalBeanClass); bmd.setBeanAnnotationReader(bar); bmd.setValueTypeFactory(valueTypeFactory); bmd .setStopRelationCreation(isLimitRelationNestLevel(relationNestLevel)); bmd.setBeanMetaDataFactory(this); bmd.setRelationNestLevel(relationNestLevel); final DaoNamingConvention namingConvention = getDaoNamingConvention(); final String versionNoPropertyName = bar.getVersionNoPropertyName(); if (versionNoPropertyName != null) { bmd.setVersionNoPropertyName(versionNoPropertyName); } else { bmd.setVersionNoPropertyName(namingConvention .getVersionNoPropertyName()); } final String timestampPropertyName = bar.getTimestampPropertyName(); if (timestampPropertyName != null) { bmd.setTimestampPropertyName(timestampPropertyName); } else { bmd.setTimestampPropertyName(namingConvention .getTimestampPropertyName()); } bmd.setBeanClass(originalBeanClass); bmd.setTableNaming(tableNaming); long t1 = System.nanoTime(); bmd.initialize(); long t2 = System.nanoTime(); final Class enhancedBeanClass = enhancer.enhanceBeanClass(beanClass, versionNoPropertyName, timestampPropertyName); bmd.setModifiedPropertySupport(enhancer.getSupporter()); bmd.setBeanClass(enhancedBeanClass); long t3 = System.nanoTime(); System.out .printf( "BeanMetaDataFactoryImpl#createBeanMetaData() [beanClass=%s, relationNestLevel=%d] end cp1:%,15dns cp2:%,15dns%n", beanClass, relationNestLevel, (t2 - t1), (t3 - t2)); return bmd; } protected Dbms getDbms() { return DbmsManager.getDbms(dataSource); } protected BeanMetaDataImpl createBeanMetaDataImpl() { return new BeanMetaDataImpl(); } protected boolean isLimitRelationNestLevel(final int relationNestLevel) { return relationNestLevel == getLimitRelationNestLevel(); } protected int getLimitRelationNestLevel() { // You can change relation creation range by changing this. return 1; } public void setDataSource(final DataSource dataSource) { this.dataSource = dataSource; } public void setAnnotationReaderFactory( final AnnotationReaderFactory annotationReaderFactory) { this.annotationReaderFactory = annotationReaderFactory; } public void setValueTypeFactory(final ValueTypeFactory valueTypeFactory) { this.valueTypeFactory = valueTypeFactory; } public DaoNamingConvention getDaoNamingConvention() { return daoNamingConvention; } public void setDaoNamingConvention( final DaoNamingConvention daoNamingConvention) { this.daoNamingConvention = daoNamingConvention; } public BeanEnhancer getBeanEnhancer() { return beanEnhancer; } public void setBeanEnhancer(final BeanEnhancer beanEnhancer) { this.beanEnhancer = beanEnhancer; } public TableNaming getTableNaming() { return tableNaming; } public void setTableNaming(TableNaming tableNameConverter) { this.tableNaming = tableNameConverter; } }