package net.codjo.dataprocess.server.handler.handlerfactory; import net.codjo.database.api.Database; import net.codjo.database.api.query.PreparedQuery; import net.codjo.dataprocess.common.Log; import net.codjo.dataprocess.common.table.model.FieldModel; import net.codjo.dataprocess.common.table.model.TableModel; import net.codjo.mad.server.handler.Handler; import java.sql.SQLException; import java.util.Map; import org.picocontainer.MutablePicoContainer; import static net.codjo.mad.server.handler.XMLUtils.convertFromStringValue; /** * */ public class UpdateHandlerFactory extends AbstractHandlerFactory { public UpdateHandlerFactory(MutablePicoContainer container, TableModel tableModel) { super(container, tableModel); } public String getHandlerId() { return getTableModel().getHandlerIdProvider().getUpdateHandlerId(); } public Handler createHandler() { return new UpdateHandler(getTableModel(), getDatabase()); } private static class UpdateHandler extends AbstractSqlHandler { UpdateHandler(TableModel table, Database database) { super(table, database, new AbstractQueryFactory() { public String create(TableModel tableModel) { int idx = 0; StringBuilder sb = new StringBuilder(); for (FieldModel field : tableModel.getNotPks()) { if (idx > 0) { sb.append(", "); } sb.append(String.format("%s = ?", field.getSqlName())); idx++; } String sql = String.format("update %s set %s %s", tableModel.getName(), sb.toString(), buildWhereClause(tableModel)); Log.debug(UpdateHandler.class, sql); return sql; } }); } @Override protected void fillQuery(PreparedQuery query, Map<String, String> args) throws SQLException { int idx = 1; for (FieldModel field : getTableModel().getNotPks()) { String value = args.get(field.getName()); int sqlType = field.getType().getSqlType(); if (value != null && !"null".equals(value)) { query.setObject(idx++, value, sqlType); } else { query.setObject(idx++, null, sqlType); } } for (FieldModel field : getTableModel().getPks()) { query.setObject(idx++, convertFromStringValue(field.getJavaType(), args.get(field.getName())), field.getType().getSqlType()); } } @Override public String getId() { return getTableModel().getHandlerIdProvider().getUpdateHandlerId(); } } }