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.Constants; 30 import org.dbforms.config.DbEventInterceptor; 31 import org.dbforms.config.DbEventInterceptorData; 32 import org.dbforms.config.DbFormsConfig; 33 import org.dbforms.config.DbFormsConfigRegistry; 34 import org.dbforms.config.Field; 35 import org.dbforms.config.FieldTypes; 36 import org.dbforms.config.FieldValue; 37 import org.dbforms.config.FieldValues; 38 import org.dbforms.config.GrantedPrivileges; 39 import org.dbforms.config.JDBCDataHelper; 40 import org.dbforms.config.ResultSetVector; 41 42 import org.dbforms.event.ValidationEvent; 43 44 import org.dbforms.util.FileHolder; 45 import org.dbforms.util.MessageResourcesInternal; 46 import org.dbforms.util.ParseUtil; 47 import org.dbforms.util.StringUtil; 48 import org.dbforms.util.UniqueIDGenerator; 49 import org.dbforms.util.Util; 50 51 import java.io.File ; 52 import java.io.IOException ; 53 54 import java.sql.Connection ; 55 import java.sql.PreparedStatement ; 56 import java.sql.SQLException ; 57 58 import java.util.Iterator ; 59 import java.util.Vector ; 60 61 import javax.servlet.http.HttpServletRequest ; 62 63 64 65 72 public class InsertEvent extends ValidationEvent { 73 74 static Log logCat = LogFactory.getLog(InsertEvent.class.getName()); 75 76 84 public InsertEvent(Integer tableId, 85 String keyId, 86 HttpServletRequest request, 87 DbFormsConfig config) { 88 super(tableId.intValue(), keyId, request, config); 89 } 90 91 92 102 public InsertEvent(String action, 103 HttpServletRequest request, 104 DbFormsConfig config) { 105 super(StringUtil.getEmbeddedStringAsInteger(action, 2, '_'), 106 StringUtil.getEmbeddedString(action, 3, '_'), request, config); 107 } 108 109 118 public FieldValues getFieldValues() { 119 return getFieldValues(true); 120 } 121 122 123 131 public void processEvent(Connection con) throws SQLException { 132 if (!hasUserPrivileg(GrantedPrivileges.PRIVILEG_INSERT)) { 135 String s = MessageResourcesInternal.getMessage("dbforms.events.insert.nogrant", 136 getRequest().getLocale(), 137 new String [] { 138 getTable() 139 .getName() 140 }); 141 throw new SQLException (s); 142 } 143 144 FieldValues fieldValues = getFieldValues(); 145 146 if (fieldValues.size() == 0) { 147 throw new SQLException ("no parameters"); 148 } 149 150 DbEventInterceptorData interceptorData = new DbEventInterceptorData(getRequest(), 151 getConfig(), con, getTable()); 152 interceptorData.setAttribute(DbEventInterceptorData.FIELDVALUES, fieldValues); 153 154 int operation = getTable() 156 .processInterceptors(DbEventInterceptor.PRE_INSERT, 157 interceptorData); 158 159 if ((operation == DbEventInterceptor.GRANT_OPERATION) 160 && (fieldValues.size() > 0)) { 161 if (!checkSufficentValues(fieldValues)) { 163 throw new SQLException ("unsufficent parameters"); 164 } 165 166 PreparedStatement ps = con.prepareStatement(getTable().getInsertStatement(fieldValues)); 167 168 Iterator iter = fieldValues.elements(); 171 int col = 1; 172 173 while (iter.hasNext()) { 174 FieldValue fv = (FieldValue) iter.next(); 175 176 if (fv != null) { 177 Field curField = fv.getField(); 178 logCat.debug("Retrieved curField:" + curField.getName() 179 + " type:" + curField.getType()); 180 181 int fieldType = curField.getType(); 182 Object value = null; 183 184 if (fieldType == FieldTypes.BLOB) { 185 value = fv.getFileHolder(); 187 } else if (fieldType == FieldTypes.DISKBLOB) { 188 FileHolder fileHolder = fv.getFileHolder(); 190 String fileName = fileHolder.getFileName(); 191 192 if (curField.hasEncodedSet()) { 193 int dotIndex = fileName.lastIndexOf('.'); 194 String suffix = (dotIndex != -1) 195 ? fileName.substring(dotIndex) 196 : ""; 197 fileHolder.setFileName(UniqueIDGenerator.getUniqueID() 198 + suffix); 199 200 value = fileHolder.getFileName(); 202 } else { 203 value = fileName; 205 } 206 } else { 207 value = fv.getFieldValueAsObject(); 208 } 209 210 logCat.info("PRE_INSERT: field=" + curField.getName() + " col=" 211 + col + " value=" + value + " type=" + fieldType); 212 JDBCDataHelper.fillWithData(ps, fv.getField().getEscaper(), col, 213 value, fieldType, 214 getTable().getBlobHandlingStrategy()); 215 col++; 216 } 217 } 218 219 ps.executeUpdate(); 221 ps.close(); 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 + "_ins" 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 294 297 String firstPosition = null; 298 Vector key = getTable() 299 .getKey(); 300 FieldValue[] fvEqual = new FieldValue[key.size()]; 301 302 for (int i = 0; i < key.size(); i++) { 303 Field field = (Field) key.elementAt(i); 304 String fieldName = field.getName(); 305 FieldValue fv = fieldValues.get(fieldName); 306 String value = null; 307 308 if (fv != null) { 309 value = fv.getFieldValue(); 310 } 311 312 FieldValue keyFieldValue = new FieldValue(field, value); 313 fvEqual[i] = keyFieldValue; 314 } 315 316 ResultSetVector resultSetVector = getTable() 317 .doConstrainedSelect(fvEqual, 318 null, null, 319 null, 320 Constants.COMPARE_NONE, 321 1, interceptorData); 322 323 if (resultSetVector != null) { 324 resultSetVector.moveFirst(); 325 firstPosition = getTable() 326 .getPositionString(resultSetVector); 327 } 328 329 getRequest() 330 .setAttribute("firstpos_" + getTable().getId(), firstPosition); 331 332 getTable() 335 .processInterceptors(DbEventInterceptor.POST_INSERT, interceptorData); 336 } 337 } 338 339 340 351 private boolean checkSufficentValues(FieldValues fieldValues) 352 throws SQLException { 353 Vector fields = getTable() 354 .getFields(); 355 356 for (int i = 0; i < fields.size(); i++) { 357 Field field = (Field) fields.elementAt(i); 358 359 if (!field.hasAutoIncSet() && field.hasIsKeySet()) { 362 if (fieldValues.get(field.getName()) == null) { 363 throw new SQLException ("Field " + field.getName() 364 + " is missing"); 365 } 366 } 367 else if (field.hasAutoIncSet()) { 369 if (fieldValues.get(field.getName()) != null) { 370 throw new SQLException ("Field " + field.getName() 371 + " should be calculated by RDBMS, remove it from the form"); 372 } 373 } 374 375 } 377 378 return true; 379 } 380 } 381 | Popular Tags |