OSDN Git Service

f1c285ff02a31db756b83d2530275eb5e4fb5743
[ea2ddl/ea2ddl.git] / ea2ddl-dao / src / main / java / jp / sourceforge / ea2ddl / dao / allcommon / s2dao / internal / sqlhandler / InternalAbstractAutoHandler.java
1 package jp.sourceforge.ea2ddl.dao.allcommon.s2dao.internal.sqlhandler;\r
2 \r
3 import java.sql.Connection;\r
4 import java.sql.PreparedStatement;\r
5 import java.sql.SQLException;\r
6 import java.sql.Timestamp;\r
7 import java.util.ArrayList;\r
8 import java.util.Date;\r
9 import java.util.List;\r
10 \r
11 import javax.sql.DataSource;\r
12 \r
13 import org.seasar.dao.BeanMetaData;\r
14 import org.seasar.extension.jdbc.PropertyType;\r
15 import org.seasar.extension.jdbc.StatementFactory;\r
16 import org.seasar.extension.jdbc.ValueType;\r
17 import org.seasar.framework.beans.PropertyDesc;\r
18 import org.seasar.framework.util.IntegerConversionUtil;\r
19 \r
20 /**\r
21  * @author DBFlute(AutoGenerator)\r
22  */\r
23 public abstract class InternalAbstractAutoHandler extends InternalBasicHandler {\r
24 \r
25     // ===================================================================================\r
26     //                                                                           Attribute\r
27     //                                                                           =========\r
28     protected BeanMetaData beanMetaData;\r
29     protected Object[] bindVariables;\r
30     protected ValueType[] bindVariableValueTypes;\r
31     protected Timestamp timestamp;\r
32     protected Integer versionNo;\r
33     protected PropertyType[] propertyTypes;\r
34     protected boolean versionNoAutoIncrementOnMemory = true;\r
35 \r
36     // ===================================================================================\r
37     //                                                                         Constructor\r
38     //                                                                         ===========\r
39     public InternalAbstractAutoHandler(DataSource dataSource,\r
40             StatementFactory statementFactory, BeanMetaData beanMetaData,\r
41             PropertyType[] propertyTypes) {\r
42         super(dataSource, statementFactory);\r
43         this.beanMetaData = beanMetaData;\r
44         this.propertyTypes = propertyTypes;\r
45     }\r
46 \r
47     public int execute(Object[] args) {\r
48         Connection connection = getConnection();\r
49         try {\r
50             return execute(connection, args[0]);\r
51         } finally {\r
52             close(connection);\r
53         }\r
54     }\r
55 \r
56     public int execute(Object[] args, Class<?>[] argTypes) {\r
57         return execute(args);\r
58     }\r
59 \r
60     protected int execute(Connection connection, Object bean) {\r
61         preUpdateBean(bean);\r
62         setupBindVariables(bean);\r
63         logSql(bindVariables, getArgTypes(bindVariables));\r
64         PreparedStatement ps = prepareStatement(connection);\r
65         int ret = -1;\r
66         try {\r
67             bindArgs(ps, bindVariables, bindVariableValueTypes);\r
68             ret = executeUpdate(ps);\r
69         } finally {\r
70             close(ps);\r
71         }\r
72         postUpdateBean(bean, ret);\r
73         return ret;\r
74     }\r
75 \r
76     protected void bindArgs(PreparedStatement ps, Object[] args, ValueType[] valueTypes) {\r
77         if (args == null) {\r
78             return;\r
79         }\r
80         for (int i = 0; i < args.length; ++i) {\r
81             ValueType valueType = valueTypes[i];\r
82             try {\r
83                 valueType.bindValue(ps, i + 1, args[i]);\r
84             } catch (SQLException e) {\r
85                 handleSQLException(e, ps);\r
86             }\r
87         }\r
88     }\r
89 \r
90     protected void preUpdateBean(Object bean) {\r
91     }\r
92 \r
93     protected void postUpdateBean(Object bean, int ret) {\r
94     }\r
95 \r
96     protected abstract void setupBindVariables(Object bean);\r
97 \r
98     protected void setupInsertBindVariables(Object bean) {\r
99         final List<Object> varList = new ArrayList<Object>();\r
100         final List<ValueType> varValueTypeList = new ArrayList<ValueType>();\r
101         final BeanMetaData bmd = getBeanMetaData();\r
102         final String timestampPropertyName = bmd.getTimestampPropertyName();\r
103         final String versionNoPropertyName = bmd.getVersionNoPropertyName();\r
104         for (int i = 0; i < propertyTypes.length; ++i) {\r
105             PropertyType pt = propertyTypes[i];\r
106             if (pt.getPropertyName().equalsIgnoreCase(timestampPropertyName)) {\r
107                 setTimestamp(new Timestamp(new Date().getTime()));\r
108                 varList.add(getTimestamp());\r
109             } else if (pt.getPropertyName().equalsIgnoreCase(versionNoPropertyName)) {\r
110                 setVersionNo(new Integer(0));\r
111                 varList.add(getVersionNo());\r
112             } else {\r
113                 varList.add(pt.getPropertyDesc().getValue(bean));\r
114             }\r
115             varValueTypeList.add(pt.getValueType());\r
116         }\r
117         setBindVariables(varList.toArray());\r
118         setBindVariableValueTypes((ValueType[])varValueTypeList.toArray(new ValueType[varValueTypeList.size()]));\r
119     }\r
120 \r
121     protected void setupUpdateBindVariables(Object bean) {\r
122         final List<Object> varList = new ArrayList<Object>();\r
123         final List<ValueType> varValueTypeList = new ArrayList<ValueType>();\r
124         final BeanMetaData bmd = getBeanMetaData();\r
125         final String timestampPropertyName = bmd.getTimestampPropertyName();\r
126         final String versionNoPropertyName = bmd.getVersionNoPropertyName();\r
127         for (int i = 0; i < propertyTypes.length; ++i) {\r
128             PropertyType pt = propertyTypes[i];\r
129             if (pt.getPropertyName().equalsIgnoreCase(timestampPropertyName)) {\r
130                 setTimestamp(new Timestamp(new Date().getTime()));\r
131                 varList.add(getTimestamp());\r
132             } else if (pt.getPropertyName().equalsIgnoreCase(versionNoPropertyName)) {\r
133                 if (!isVersionNoAutoIncrementOnMemory()) {\r
134                     continue;// because of always 'VERSION_NO = VERSION_NO + 1'\r
135                 }\r
136                 Object value = pt.getPropertyDesc().getValue(bean);\r
137                 if (value == null) {\r
138                     continue;// because of 'VERSION_NO = VERSION_NO + 1'\r
139                 }\r
140                 int intValue = IntegerConversionUtil.toPrimitiveInt(value) + 1;\r
141                 setVersionNo(new Integer(intValue));\r
142                 varList.add(getVersionNo());\r
143             } else {\r
144                 varList.add(pt.getPropertyDesc().getValue(bean));\r
145             }\r
146             varValueTypeList.add(pt.getValueType());\r
147         }\r
148         addAutoUpdateWhereBindVariables(varList, varValueTypeList, bean);\r
149         setBindVariables(varList.toArray());\r
150         setBindVariableValueTypes((ValueType[]) varValueTypeList.toArray(new ValueType[varValueTypeList.size()]));\r
151     }\r
152 \r
153     protected void setupDeleteBindVariables(Object bean) {\r
154         final List<Object> varList = new ArrayList<Object>();\r
155         final List<ValueType> varValueTypeList = new ArrayList<ValueType>();\r
156         addAutoUpdateWhereBindVariables(varList, varValueTypeList, bean);\r
157         setBindVariables(varList.toArray());\r
158         setBindVariableValueTypes((ValueType[])varValueTypeList.toArray(new ValueType[varValueTypeList.size()]));\r
159     }\r
160 \r
161     protected void addAutoUpdateWhereBindVariables(List<Object> varList, List<ValueType> varValueTypeList, Object bean) {\r
162         BeanMetaData bmd = getBeanMetaData();\r
163         for (int i = 0; i < bmd.getPrimaryKeySize(); ++i) {\r
164             PropertyType pt = bmd.getPropertyTypeByColumnName(bmd.getPrimaryKey(i));\r
165             PropertyDesc pd = pt.getPropertyDesc();\r
166             varList.add(pd.getValue(bean));\r
167             varValueTypeList.add(pt.getValueType());\r
168         }\r
169         if (bmd.hasVersionNoPropertyType()) {\r
170             PropertyType pt = bmd.getVersionNoPropertyType();\r
171             PropertyDesc pd = pt.getPropertyDesc();\r
172             varList.add(pd.getValue(bean));\r
173             varValueTypeList.add(pt.getValueType());\r
174         }\r
175         if (bmd.hasTimestampPropertyType()) {\r
176             PropertyType pt = bmd.getTimestampPropertyType();\r
177             PropertyDesc pd = pt.getPropertyDesc();\r
178             varList.add(pd.getValue(bean));\r
179             varValueTypeList.add(pt.getValueType());\r
180         }\r
181     }\r
182 \r
183     protected void updateTimestampIfNeed(Object bean) {\r
184         if (getTimestamp() != null) {\r
185             PropertyDesc pd = getBeanMetaData().getTimestampPropertyType().getPropertyDesc();\r
186             pd.setValue(bean, getTimestamp());\r
187         }\r
188     }\r
189 \r
190     protected void updateVersionNoIfNeed(Object bean) {\r
191         if (getVersionNo() != null) {\r
192             PropertyDesc pd = getBeanMetaData().getVersionNoPropertyType().getPropertyDesc();\r
193             pd.setValue(bean, getVersionNo());\r
194         }\r
195     }\r
196 \r
197     // ===================================================================================\r
198     //                                                                            Accessor\r
199     //                                                                            ========\r
200     public BeanMetaData getBeanMetaData() {\r
201         return beanMetaData;\r
202     }\r
203 \r
204     protected Object[] getBindVariables() {\r
205         return bindVariables;\r
206     }\r
207 \r
208     protected void setBindVariables(Object[] bindVariables) {\r
209         this.bindVariables = bindVariables;\r
210     }\r
211 \r
212     protected ValueType[] getBindVariableValueTypes() {\r
213         return bindVariableValueTypes;\r
214     }\r
215 \r
216     protected void setBindVariableValueTypes(ValueType[] bindVariableValueTypes) {\r
217         this.bindVariableValueTypes = bindVariableValueTypes;\r
218     }\r
219 \r
220     protected Timestamp getTimestamp() {\r
221         return timestamp;\r
222     }\r
223 \r
224     protected void setTimestamp(Timestamp timestamp) {\r
225         this.timestamp = timestamp;\r
226     }\r
227 \r
228     protected Integer getVersionNo() {\r
229         return versionNo;\r
230     }\r
231 \r
232     protected void setVersionNo(Integer versionNo) {\r
233         this.versionNo = versionNo;\r
234     }\r
235 \r
236     protected PropertyType[] getPropertyTypes() {\r
237         return propertyTypes;\r
238     }\r
239 \r
240     protected void setPropertyTypes(PropertyType[] propertyTypes) {\r
241         this.propertyTypes = propertyTypes;\r
242     }\r
243 \r
244     protected boolean isVersionNoAutoIncrementOnMemory() {\r
245         return versionNoAutoIncrementOnMemory;\r
246     }\r
247 \r
248     public void setVersionNoAutoIncrementOnMemory(boolean versionNoAutoIncrementOnMemory) {\r
249         this.versionNoAutoIncrementOnMemory = versionNoAutoIncrementOnMemory;\r
250     }\r
251 }\r