OSDN Git Service

"https://svn.sourceforge.jp/svnroot/ea2ddl" にプロジェクト "ea2ddl-dao" を共用
[ea2ddl/ea2ddl.git] / ea2ddl-dao / src / main / java / jp / sourceforge / ea2ddl / dao / allcommon / s2dao / S2DaoPropertyTypeFactoryBuilderExtension.java
1 package jp.sourceforge.ea2ddl.dao.allcommon.s2dao;\r
2 \r
3 import java.util.ArrayList;\r
4 import java.util.List;\r
5 import java.sql.DatabaseMetaData;\r
6 \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
17 \r
18 import jp.sourceforge.ea2ddl.dao.allcommon.Entity;\r
19 import jp.sourceforge.ea2ddl.dao.allcommon.dbmeta.DBMeta;\r
20 \r
21 /**\r
22  * The factory builder of property type for S2Dao. {Since S2Dao-1.0.47}\r
23  * @author DBFlute(AutoGenerator)\r
24  */
25 @SuppressWarnings("unchecked")\r
26 public class S2DaoPropertyTypeFactoryBuilderExtension implements PropertyTypeFactoryBuilder {\r
27 \r
28     // ===================================================================================\r
29     //                                                                           Attribute\r
30     //                                                                           =========\r
31     protected ValueTypeFactory valueTypeFactory;\r
32 \r
33     protected ColumnNaming columnNaming;\r
34 \r
35     // ===================================================================================\r
36     //                                                                               Build\r
37     //                                                                               =====\r
38     public PropertyTypeFactory build(Class beanClass, BeanAnnotationReader beanAnnotationReader) {\r
39         return new FastPropertyTypeFactoryExtension(beanClass, beanAnnotationReader, valueTypeFactory, columnNaming);\r
40     }\r
41 \r
42     public PropertyTypeFactory build(Class beanClass, BeanAnnotationReader beanAnnotationReader, Dbms dbms, DatabaseMetaData databaseMetaData) {\r
43         return new FastPropertyTypeFactoryExtension(beanClass, beanAnnotationReader, valueTypeFactory, columnNaming, dbms);\r
44     }\r
45 \r
46     // ===================================================================================\r
47     //                                                                     Extension Class\r
48     //                                                                     ===============\r
49     protected static class FastPropertyTypeFactoryExtension extends AbstractPropertyTypeFactory {\r
50 \r
51         protected DBMeta _dbmeta;\r
52         protected String[] _noPersisteneProps;\r
53 \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
58         }\r
59 \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
64         }\r
65 \r
66         protected void initializeResources() {\r
67             if (isEntity()) {\r
68                 _dbmeta = findDBMeta();\r
69             }\r
70             _noPersisteneProps = beanAnnotationReader.getNoPersisteneProps();\r
71         }\r
72 \r
73         protected boolean isEntity() {\r
74             return Entity.class.isAssignableFrom(beanClass);\r
75         }\r
76 \r
77         protected boolean hasDBMeta() {\r
78             return _dbmeta != null;\r
79         }\r
80 \r
81         protected DBMeta findDBMeta() {\r
82             try {\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
88             }\r
89         }\r
90 \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
96 \r
97                 // Read-only property is unnecessary!\r
98                 if (!pd.hasWriteMethod()) {\r
99                     continue;\r
100                 }\r
101 \r
102                 // Relation property is unnecessary!\r
103                 if (isRelation(pd)) {\r
104                     continue;\r
105                 }\r
106 \r
107                 final PropertyType pt = createPropertyType(pd);\r
108                 pt.setPrimaryKey(isPrimaryKey(pd));\r
109                 pt.setPersistent(isPersistent(pt));\r
110                 list.add(pt);\r
111             }\r
112             return list.toArray(new PropertyType[list.size()]);\r
113         }\r
114 \r
115         @Override\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
119                 return true;\r
120             }\r
121             return hasRelationNoAnnotation(propertyDesc);\r
122         }\r
123 \r
124         protected boolean hasRelationNoAnnotation(PropertyDesc propertyDesc) {\r
125             return beanAnnotationReader.hasRelationNo(propertyDesc);\r
126         }\r
127 \r
128         @Override\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
133                     return true;\r
134                 }\r
135             }\r
136             return hasIdAnnotation(propertyDesc);\r
137         }\r
138 \r
139         protected boolean hasIdAnnotation(PropertyDesc propertyDesc) {\r
140             final Dbms dbms = getDbms();\r
141             return beanAnnotationReader.getId(propertyDesc, dbms) != null;\r
142         }\r
143 \r
144         @Override\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
150                     return true;\r
151                 }\r
152             }\r
153             return false;\r
154         }\r
155 \r
156         protected boolean hasColumnAnnotation(PropertyDesc propertyDesc) {\r
157             return beanAnnotationReader.getColumnAnnotation(propertyDesc) != null;\r
158         }\r
159 \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
166                         return true;\r
167                     }\r
168                 }\r
169             }\r
170             return false;\r
171         }\r
172     }\r
173 \r
174     // ===================================================================================\r
175     //                                                                            Accessor\r
176     //                                                                            ========\r
177     public ValueTypeFactory getValueTypeFactory() {\r
178         return valueTypeFactory;\r
179     }\r
180 \r
181     public void setValueTypeFactory(ValueTypeFactory valueTypeFactory) {\r
182         this.valueTypeFactory = valueTypeFactory;\r
183     }\r
184 \r
185     public ColumnNaming getColumnNaming() {\r
186         return columnNaming;\r
187     }\r
188 \r
189     public void setColumnNaming(ColumnNaming columnNaming) {\r
190         this.columnNaming = columnNaming;\r
191     }\r
192 }\r