1 package jp.sourceforge.ea2ddl.dao.allcommon.s2dao.internal.sqlhandler;
\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
11 import javax.sql.DataSource;
\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
21 * @author DBFlute(AutoGenerator)
\r
23 public abstract class InternalAbstractAutoHandler extends InternalBasicHandler {
\r
25 // ===================================================================================
\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
36 // ===================================================================================
\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
47 public int execute(Object[] args) {
\r
48 Connection connection = getConnection();
\r
50 return execute(connection, args[0]);
\r
56 public int execute(Object[] args, Class<?>[] argTypes) {
\r
57 return execute(args);
\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
67 bindArgs(ps, bindVariables, bindVariableValueTypes);
\r
68 ret = executeUpdate(ps);
\r
72 postUpdateBean(bean, ret);
\r
76 protected void bindArgs(PreparedStatement ps, Object[] args, ValueType[] valueTypes) {
\r
80 for (int i = 0; i < args.length; ++i) {
\r
81 ValueType valueType = valueTypes[i];
\r
83 valueType.bindValue(ps, i + 1, args[i]);
\r
84 } catch (SQLException e) {
\r
85 handleSQLException(e, ps);
\r
90 protected void preUpdateBean(Object bean) {
\r
93 protected void postUpdateBean(Object bean, int ret) {
\r
96 protected abstract void setupBindVariables(Object bean);
\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
113 varList.add(pt.getPropertyDesc().getValue(bean));
\r
115 varValueTypeList.add(pt.getValueType());
\r
117 setBindVariables(varList.toArray());
\r
118 setBindVariableValueTypes((ValueType[])varValueTypeList.toArray(new ValueType[varValueTypeList.size()]));
\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
136 Object value = pt.getPropertyDesc().getValue(bean);
\r
137 if (value == null) {
\r
138 continue;// because of 'VERSION_NO = VERSION_NO + 1'
\r
140 int intValue = IntegerConversionUtil.toPrimitiveInt(value) + 1;
\r
141 setVersionNo(new Integer(intValue));
\r
142 varList.add(getVersionNo());
\r
144 varList.add(pt.getPropertyDesc().getValue(bean));
\r
146 varValueTypeList.add(pt.getValueType());
\r
148 addAutoUpdateWhereBindVariables(varList, varValueTypeList, bean);
\r
149 setBindVariables(varList.toArray());
\r
150 setBindVariableValueTypes((ValueType[]) varValueTypeList.toArray(new ValueType[varValueTypeList.size()]));
\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
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
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
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
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
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
197 // ===================================================================================
\r
200 public BeanMetaData getBeanMetaData() {
\r
201 return beanMetaData;
\r
204 protected Object[] getBindVariables() {
\r
205 return bindVariables;
\r
208 protected void setBindVariables(Object[] bindVariables) {
\r
209 this.bindVariables = bindVariables;
\r
212 protected ValueType[] getBindVariableValueTypes() {
\r
213 return bindVariableValueTypes;
\r
216 protected void setBindVariableValueTypes(ValueType[] bindVariableValueTypes) {
\r
217 this.bindVariableValueTypes = bindVariableValueTypes;
\r
220 protected Timestamp getTimestamp() {
\r
224 protected void setTimestamp(Timestamp timestamp) {
\r
225 this.timestamp = timestamp;
\r
228 protected Integer getVersionNo() {
\r
232 protected void setVersionNo(Integer versionNo) {
\r
233 this.versionNo = versionNo;
\r
236 protected PropertyType[] getPropertyTypes() {
\r
237 return propertyTypes;
\r
240 protected void setPropertyTypes(PropertyType[] propertyTypes) {
\r
241 this.propertyTypes = propertyTypes;
\r
244 protected boolean isVersionNoAutoIncrementOnMemory() {
\r
245 return versionNoAutoIncrementOnMemory;
\r
248 public void setVersionNoAutoIncrementOnMemory(boolean versionNoAutoIncrementOnMemory) {
\r
249 this.versionNoAutoIncrementOnMemory = versionNoAutoIncrementOnMemory;
\r