OSDN Git Service

DBFlute-0.9.3に更新
[ea2ddl/ea2ddl.git] / ea2ddl-gen / dbflute / templates / om / java / allcommon / s2dao / S2DaoPropertyTypeFactoryBuilderExtension.vm
1 ${database.allClassCopyright}package ${glPackageBaseCommonS2Dao};\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 ${glPackageBaseCommon}.${glEntityInterfaceName};\r
19 import ${glPackageBaseCommonDBMeta}.${glDBMetaInterfaceName};\r
20 \r
21 /**\r
22  * The factory builder of property type for S2Dao. {Since S2Dao-1.0.47}\r
23  * @author ${database.ClassAuthor}\r
24  */${database.outputSuppressWarningsAfterLineSeparator()}\r
25 public class ${glDaoPropertyTypeFactoryBuilderExtension} implements PropertyTypeFactoryBuilder {\r
26 \r
27     // ===================================================================================\r
28     //                                                                           Attribute\r
29     //                                                                           =========\r
30     protected ValueTypeFactory valueTypeFactory;\r
31 \r
32     protected ColumnNaming columnNaming;\r
33 \r
34     // ===================================================================================\r
35     //                                                                               Build\r
36     //                                                                               =====\r
37     public PropertyTypeFactory build(Class beanClass, BeanAnnotationReader beanAnnotationReader) {\r
38         return new FastPropertyTypeFactoryExtension(beanClass, beanAnnotationReader, valueTypeFactory, columnNaming);\r
39     }\r
40 \r
41     public PropertyTypeFactory build(Class beanClass, BeanAnnotationReader beanAnnotationReader, Dbms dbms, DatabaseMetaData databaseMetaData) {\r
42         return new FastPropertyTypeFactoryExtension(beanClass, beanAnnotationReader, valueTypeFactory, columnNaming, dbms);\r
43     }\r
44 \r
45     // ===================================================================================\r
46     //                                                                     Extension Class\r
47     //                                                                     ===============\r
48     protected static class FastPropertyTypeFactoryExtension extends AbstractPropertyTypeFactory {\r
49 \r
50         protected ${glDBMetaInterfaceName} _dbmeta;\r
51         protected String[] _noPersisteneProps;\r
52 \r
53         public FastPropertyTypeFactoryExtension(Class beanClass, BeanAnnotationReader beanAnnotationReader,\r
54                 ValueTypeFactory valueTypeFactory, ColumnNaming columnNaming) {\r
55             super(beanClass, beanAnnotationReader, valueTypeFactory, columnNaming);\r
56             initializeResources();\r
57         }\r
58 \r
59         public FastPropertyTypeFactoryExtension(Class beanClass, BeanAnnotationReader beanAnnotationReader,\r
60                 ValueTypeFactory valueTypeFactory, ColumnNaming columnNaming, Dbms dbms) {\r
61             super(beanClass, beanAnnotationReader, valueTypeFactory, columnNaming, dbms);\r
62             initializeResources();\r
63         }\r
64 \r
65         protected void initializeResources() {\r
66             if (isEntity()) {\r
67                 _dbmeta = findDBMeta();\r
68             }\r
69             _noPersisteneProps = beanAnnotationReader.getNoPersisteneProps();\r
70         }\r
71 \r
72         protected boolean isEntity() {\r
73             return ${glEntityInterfaceName}.class.isAssignableFrom(beanClass);\r
74         }\r
75 \r
76         protected boolean hasDBMeta() {\r
77             return _dbmeta != null;\r
78         }\r
79 \r
80         protected ${glDBMetaInterfaceName} findDBMeta() {\r
81             try {\r
82                 final ${glEntityInterfaceName} entity = (${glEntityInterfaceName}) beanClass.newInstance();\r
83                 return entity.getDBMeta();\r
84             } catch (Exception e) {\r
85                 String msg = "beanClass.newInstance() threw the exception: beanClass=" + beanClass;\r
86                 throw new RuntimeException(msg, e);\r
87             }\r
88         }\r
89 \r
90         public PropertyType[] createBeanPropertyTypes(String tableName) {\r
91             final List<PropertyType> list = new ArrayList<PropertyType>();\r
92             final BeanDesc beanDesc = getBeanDesc();\r
93             for (int i = 0; i < beanDesc.getPropertyDescSize(); ++i) {\r
94                 final PropertyDesc pd = beanDesc.getPropertyDesc(i);\r
95 \r
96                 // Read-only property is unnecessary!\r
97                 if (!pd.hasWriteMethod()) {\r
98                     continue;\r
99                 }\r
100 \r
101                 // Relation property is unnecessary!\r
102                 if (isRelation(pd)) {\r
103                     continue;\r
104                 }\r
105 \r
106                 final PropertyType pt = createPropertyType(pd);\r
107                 pt.setPrimaryKey(isPrimaryKey(pd));\r
108                 pt.setPersistent(isPersistent(pt));\r
109                 list.add(pt);\r
110             }\r
111             return list.toArray(new PropertyType[list.size()]);\r
112         }\r
113 \r
114         @Override\r
115         protected boolean isRelation(PropertyDesc propertyDesc) {\r
116             final String propertyName = propertyDesc.getPropertyName();\r
117             if (hasDBMeta() && (_dbmeta.hasForeign(propertyName) || _dbmeta.hasReferrer(propertyName))) {\r
118                 return true;\r
119             }\r
120             return hasRelationNoAnnotation(propertyDesc);\r
121         }\r
122 \r
123         protected boolean hasRelationNoAnnotation(PropertyDesc propertyDesc) {\r
124             return beanAnnotationReader.hasRelationNo(propertyDesc);\r
125         }\r
126 \r
127         @Override\r
128         protected boolean isPrimaryKey(PropertyDesc propertyDesc) {\r
129             final String propertyName = propertyDesc.getPropertyName();\r
130             if (hasDBMeta() && _dbmeta.hasPrimaryKey() && _dbmeta.hasColumn(propertyName)) {\r
131                 if (_dbmeta.findColumnInfo(propertyName).isPrimary()) {\r
132                     return true;\r
133                 }\r
134             }\r
135             return hasIdAnnotation(propertyDesc);\r
136         }\r
137 \r
138         protected boolean hasIdAnnotation(PropertyDesc propertyDesc) {\r
139             final Dbms dbms = getDbms();\r
140             return beanAnnotationReader.getId(propertyDesc, dbms) != null;\r
141         }\r
142 \r
143         @Override\r
144         protected boolean isPersistent(PropertyType propertyType) {\r
145             final String propertyName = propertyType.getPropertyName();\r
146             final PropertyDesc propertyDesc = propertyType.getPropertyDesc();\r
147             if ((hasDBMeta() && _dbmeta.hasColumn(propertyName)) || hasColumnAnnotation(propertyDesc)) {\r
148                 if (!isElementOfNoPersistentProps(propertyDesc)) {\r
149                     return true;\r
150                 }\r
151             }\r
152             return false;\r
153         }\r
154 \r
155         protected boolean hasColumnAnnotation(PropertyDesc propertyDesc) {\r
156             return beanAnnotationReader.getColumnAnnotation(propertyDesc) != null;\r
157         }\r
158 \r
159         protected boolean isElementOfNoPersistentProps(PropertyDesc propertyDesc) {\r
160             final String propertyName = propertyDesc.getPropertyName();\r
161             final String[] props = _noPersisteneProps;\r
162             if (props != null && props.length >= 0) {\r
163                 for (int i = 0; i < props.length; ++i) {\r
164                     if (props[i].equals(propertyName)) {\r
165                         return true;\r
166                     }\r
167                 }\r
168             }\r
169             return false;\r
170         }\r
171     }\r
172 \r
173     // ===================================================================================\r
174     //                                                                            Accessor\r
175     //                                                                            ========\r
176     public ValueTypeFactory getValueTypeFactory() {\r
177         return valueTypeFactory;\r
178     }\r
179 \r
180     public void setValueTypeFactory(ValueTypeFactory valueTypeFactory) {\r
181         this.valueTypeFactory = valueTypeFactory;\r
182     }\r
183 \r
184     public ColumnNaming getColumnNaming() {\r
185         return columnNaming;\r
186     }\r
187 \r
188     public void setColumnNaming(ColumnNaming columnNaming) {\r
189         this.columnNaming = columnNaming;\r
190     }\r
191 }\r