1 package jp.sourceforge.ea2ddl.dao.allcommon.s2dao;
\r
3 import java.util.ArrayList;
\r
4 import java.util.List;
\r
5 import java.sql.DatabaseMetaData;
\r
7 import org.seasar.extension.jdbc.PropertyType;
\r
8 import org.seasar.framework.beans.BeanDesc;
\r
9 import org.seasar.framework.beans.PropertyDesc;
\r
10 import org.seasar.dao.BeanAnnotationReader;
\r
11 import org.seasar.dao.ColumnNaming;
\r
12 import org.seasar.dao.Dbms;
\r
13 import org.seasar.dao.PropertyTypeFactory;
\r
14 import org.seasar.dao.PropertyTypeFactoryBuilder;
\r
15 import org.seasar.dao.ValueTypeFactory;
\r
16 import org.seasar.dao.impl.AbstractPropertyTypeFactory;
\r
18 import jp.sourceforge.ea2ddl.dao.allcommon.Entity;
\r
19 import jp.sourceforge.ea2ddl.dao.allcommon.dbmeta.DBMeta;
\r
22 * The factory builder of property type for S2Dao. {Since S2Dao-1.0.47}
\r
23 * @author DBFlute(AutoGenerator)
\r
25 @SuppressWarnings("unchecked")
\r
26 public class S2DaoPropertyTypeFactoryBuilderExtension implements PropertyTypeFactoryBuilder {
\r
28 // ===================================================================================
\r
31 protected ValueTypeFactory valueTypeFactory;
\r
33 protected ColumnNaming columnNaming;
\r
35 // ===================================================================================
\r
38 public PropertyTypeFactory build(Class beanClass, BeanAnnotationReader beanAnnotationReader) {
\r
39 return new FastPropertyTypeFactoryExtension(beanClass, beanAnnotationReader, valueTypeFactory, columnNaming);
\r
42 public PropertyTypeFactory build(Class beanClass, BeanAnnotationReader beanAnnotationReader, Dbms dbms, DatabaseMetaData databaseMetaData) {
\r
43 return new FastPropertyTypeFactoryExtension(beanClass, beanAnnotationReader, valueTypeFactory, columnNaming, dbms);
\r
46 // ===================================================================================
\r
49 protected static class FastPropertyTypeFactoryExtension extends AbstractPropertyTypeFactory {
\r
51 protected DBMeta _dbmeta;
\r
52 protected String[] _noPersisteneProps;
\r
54 public FastPropertyTypeFactoryExtension(Class beanClass, BeanAnnotationReader beanAnnotationReader,
\r
55 ValueTypeFactory valueTypeFactory, ColumnNaming columnNaming) {
\r
56 super(beanClass, beanAnnotationReader, valueTypeFactory, columnNaming);
\r
57 initializeResources();
\r
60 public FastPropertyTypeFactoryExtension(Class beanClass, BeanAnnotationReader beanAnnotationReader,
\r
61 ValueTypeFactory valueTypeFactory, ColumnNaming columnNaming, Dbms dbms) {
\r
62 super(beanClass, beanAnnotationReader, valueTypeFactory, columnNaming, dbms);
\r
63 initializeResources();
\r
66 protected void initializeResources() {
\r
68 _dbmeta = findDBMeta();
\r
70 _noPersisteneProps = beanAnnotationReader.getNoPersisteneProps();
\r
73 protected boolean isEntity() {
\r
74 return Entity.class.isAssignableFrom(beanClass);
\r
77 protected boolean hasDBMeta() {
\r
78 return _dbmeta != null;
\r
81 protected DBMeta findDBMeta() {
\r
83 final Entity entity = (Entity) beanClass.newInstance();
\r
84 return entity.getDBMeta();
\r
85 } catch (Exception e) {
\r
86 String msg = "beanClass.newInstance() threw the exception: beanClass=" + beanClass;
\r
87 throw new RuntimeException(msg, e);
\r
91 public PropertyType[] createBeanPropertyTypes(String tableName) {
\r
92 final List<PropertyType> list = new ArrayList<PropertyType>();
\r
93 final BeanDesc beanDesc = getBeanDesc();
\r
94 for (int i = 0; i < beanDesc.getPropertyDescSize(); ++i) {
\r
95 final PropertyDesc pd = beanDesc.getPropertyDesc(i);
\r
97 // Read-only property is unnecessary!
\r
98 if (!pd.hasWriteMethod()) {
\r
102 // Relation property is unnecessary!
\r
103 if (isRelation(pd)) {
\r
107 final PropertyType pt = createPropertyType(pd);
\r
108 pt.setPrimaryKey(isPrimaryKey(pd));
\r
109 pt.setPersistent(isPersistent(pt));
\r
112 return list.toArray(new PropertyType[list.size()]);
\r
116 protected boolean isRelation(PropertyDesc propertyDesc) {
\r
117 final String propertyName = propertyDesc.getPropertyName();
\r
118 if (hasDBMeta() && (_dbmeta.hasForeign(propertyName) || _dbmeta.hasReferrer(propertyName))) {
\r
121 return hasRelationNoAnnotation(propertyDesc);
\r
124 protected boolean hasRelationNoAnnotation(PropertyDesc propertyDesc) {
\r
125 return beanAnnotationReader.hasRelationNo(propertyDesc);
\r
129 protected boolean isPrimaryKey(PropertyDesc propertyDesc) {
\r
130 final String propertyName = propertyDesc.getPropertyName();
\r
131 if (hasDBMeta() && _dbmeta.hasPrimaryKey() && _dbmeta.hasColumn(propertyName)) {
\r
132 if (_dbmeta.findColumnInfo(propertyName).isPrimary()) {
\r
136 return hasIdAnnotation(propertyDesc);
\r
139 protected boolean hasIdAnnotation(PropertyDesc propertyDesc) {
\r
140 final Dbms dbms = getDbms();
\r
141 return beanAnnotationReader.getId(propertyDesc, dbms) != null;
\r
145 protected boolean isPersistent(PropertyType propertyType) {
\r
146 final String propertyName = propertyType.getPropertyName();
\r
147 final PropertyDesc propertyDesc = propertyType.getPropertyDesc();
\r
148 if ((hasDBMeta() && _dbmeta.hasColumn(propertyName)) || hasColumnAnnotation(propertyDesc)) {
\r
149 if (!isElementOfNoPersistentProps(propertyDesc)) {
\r
156 protected boolean hasColumnAnnotation(PropertyDesc propertyDesc) {
\r
157 return beanAnnotationReader.getColumnAnnotation(propertyDesc) != null;
\r
160 protected boolean isElementOfNoPersistentProps(PropertyDesc propertyDesc) {
\r
161 final String propertyName = propertyDesc.getPropertyName();
\r
162 final String[] props = _noPersisteneProps;
\r
163 if (props != null && props.length >= 0) {
\r
164 for (int i = 0; i < props.length; ++i) {
\r
165 if (props[i].equals(propertyName)) {
\r
174 // ===================================================================================
\r
177 public ValueTypeFactory getValueTypeFactory() {
\r
178 return valueTypeFactory;
\r
181 public void setValueTypeFactory(ValueTypeFactory valueTypeFactory) {
\r
182 this.valueTypeFactory = valueTypeFactory;
\r
185 public ColumnNaming getColumnNaming() {
\r
186 return columnNaming;
\r
189 public void setColumnNaming(ColumnNaming columnNaming) {
\r
190 this.columnNaming = columnNaming;
\r