1 23 24 package org.dbforms.event.classic; 25 26 import org.apache.commons.logging.Log; 27 import org.apache.commons.logging.LogFactory; 28 29 import org.dbforms.config.*; 30 31 import org.dbforms.event.*; 32 33 import org.dbforms.util.*; 34 35 import java.io.*; 36 37 import java.sql.*; 38 39 import java.util.*; 40 41 import javax.servlet.http.*; 42 43 44 45 52 public class UpdateEvent extends ValidationEvent { 53 static Log logCat = LogFactory.getLog(UpdateEvent.class.getName()); 55 63 public UpdateEvent(Integer tableId, 64 String keyId, 65 HttpServletRequest request, 66 DbFormsConfig config) { 67 super(tableId.intValue(), keyId, request, config); 68 } 69 70 71 78 public UpdateEvent(String action, 79 HttpServletRequest request, 80 DbFormsConfig config) { 81 super(StringUtil.getEmbeddedStringAsInteger(action, 2, '_'), 82 StringUtil.getEmbeddedString(action, 3, '_'), request, config); 83 } 84 85 90 public FieldValues getFieldValues() { 91 String s = ParseUtil.getParameter(getRequest(), 92 Constants.FIELDNAME_OVERRIDEFIELDTEST 93 + getTable().getId()); 94 boolean flag = "true".equalsIgnoreCase(s); 95 96 return getFieldValues(flag); 97 } 98 99 100 109 public void processEvent(Connection con) throws SQLException { 110 if (!hasUserPrivileg(GrantedPrivileges.PRIVILEG_UPDATE)) { 112 String s = MessageResourcesInternal.getMessage("dbforms.events.update.nogrant", 113 getRequest().getLocale(), 114 new String [] { 115 getTable() 116 .getName() 117 }); 118 throw new SQLException(s); 119 } 120 121 FieldValues fieldValues = getFieldValues(); 123 124 if (fieldValues.size() == 0) { 125 logCat.info("no parameters to update found"); 126 127 return; 128 } 129 130 String keyValuesStr = getKeyValues(); 139 140 if (Util.isNull(keyValuesStr)) { 141 logCat.error("At least one key is required per table, check your dbforms-config.xml"); 142 143 return; 144 } 145 146 DbEventInterceptorData interceptorData = new DbEventInterceptorData(getRequest(), 147 getConfig(), con, getTable()); 148 interceptorData.setAttribute(DbEventInterceptorData.FIELDVALUES, fieldValues); 149 interceptorData.setAttribute(DbEventInterceptorData.KEYVALUES, keyValuesStr); 150 151 int operation = getTable() 153 .processInterceptors(DbEventInterceptor.PRE_UPDATE, 154 interceptorData); 155 156 if ((operation == DbEventInterceptor.GRANT_OPERATION) 157 && (fieldValues.size() > 0)) { 158 PreparedStatement ps = con.prepareStatement(getTable().getUpdateStatement(fieldValues)); 162 163 Iterator iter = fieldValues.elements(); 166 int col = 1; 167 168 while (iter.hasNext()) { 169 FieldValue fv = (FieldValue) iter.next(); 170 171 if (fv != null) { 172 Field curField = fv.getField(); 173 int fieldType = curField.getType(); 174 Object value = null; 175 176 if (fieldType == FieldTypes.BLOB) { 177 logCat.info("we are looking for fileholder with name: f_" 179 + getTable().getId() + "_" + getKeyId() + "_" 180 + curField.getId()); 181 value = fv.getFileHolder(); 182 logCat.info("and found a value=" + value); 183 } else if (fieldType == FieldTypes.DISKBLOB) { 184 FileHolder fileHolder = fv.getFileHolder(); 185 String fileName = fileHolder.getFileName(); 186 187 if (curField.hasEncodedSet()) { 189 int dotIndex = fileName.lastIndexOf('.'); 191 String suffix = (dotIndex != -1) 192 ? fileName.substring(dotIndex) 193 : ""; 194 fileHolder.setFileName(UniqueIDGenerator.getUniqueID() 195 + suffix); 196 197 value = fileHolder.getFileName(); 199 } else { 200 value = fileName; 202 } 203 } else { 204 value = fv.getFieldValueAsObject(); 206 } 207 208 JDBCDataHelper.fillWithData(ps, fv.getField().getEscaper(), col, 209 value, fieldType, 210 getTable().getBlobHandlingStrategy()); 211 col++; 212 } 213 } 214 215 getTable() 216 .populateWhereClauseWithKeyFields(keyValuesStr, ps, col); 217 218 ps.executeUpdate(); 220 ps.close(); 222 iter = fieldValues.keys(); 223 224 while (iter.hasNext()) { 225 String fieldName = (String ) iter.next(); 226 Field curField = getTable() 227 .getFieldByName(fieldName); 228 229 if (curField != null) { 230 int fieldType = curField.getType(); 231 232 String directory = null; 233 234 try { 235 directory = Util.replaceRealPath(curField.getDirectory(), 236 DbFormsConfigRegistry.instance().lookup().getRealPath()); 237 } catch (Exception e) { 238 throw new SQLException(e.getMessage()); 239 } 240 241 if (fieldType == FieldTypes.DISKBLOB) { 242 if (directory == null) { 244 throw new IllegalArgumentException ("directory-attribute needed for fields of type DISKBLOB"); 245 } 246 247 File dir = new File(directory); 249 250 if (!dir.isDirectory()) { 252 throw new IllegalArgumentException ("Not a directory: " 253 + directory); 254 } 255 256 if (!dir.canWrite()) { 258 throw new IllegalArgumentException ("Not writable: " 259 + directory); 260 } 261 262 FileHolder fileHolder = ParseUtil.getFileHolder(getRequest(), 264 "f_" 265 + getTable().getId() 266 + "_" 267 + getKeyId() 268 + "_" 269 + curField 270 .getId()); 271 272 if (fileHolder != null) { 273 try { 274 fileHolder.writeBufferToFile(dir); 275 276 logCat.info("fin + closedy"); 278 } catch (IOException ioe) { 279 throw new SQLException("could not store file '" 281 + fileHolder.getFileName() 282 + "' to dir '" + directory + "'"); 283 } 284 } else { 285 logCat.info("uh! empty fileHolder"); 286 } 287 } 288 } 289 } 290 291 getTable() 294 .processInterceptors(DbEventInterceptor.POST_UPDATE, interceptorData); 295 } 296 297 } 299 } 300 | Popular Tags |