1 25 package org.ofbiz.entityext.data; 26 27 import org.ofbiz.service.ServiceUtil; 28 import org.ofbiz.service.DispatchContext; 29 import org.ofbiz.service.LocalDispatcher; 30 import org.ofbiz.service.GenericServiceException; 31 import org.ofbiz.security.Security; 32 import org.ofbiz.entity.GenericDelegator; 33 import org.ofbiz.entity.GenericValue; 34 import org.ofbiz.entity.jdbc.DatabaseUtil; 35 import org.ofbiz.entity.model.ModelEntity; 36 import org.ofbiz.entity.model.ModelField; 37 import org.ofbiz.base.util.GeneralException; 38 import org.ofbiz.base.util.Debug; 39 import org.ofbiz.base.util.UtilURL; 40 import org.ofbiz.base.util.UtilMisc; 41 42 import java.util.*; 43 import java.io.*; 44 import java.net.URI ; 45 import java.net.URL ; 46 import java.net.URISyntaxException ; 47 48 55 public class EntityDataServices { 56 57 public static final String module = EntityDataServices.class.getName(); 58 59 public static Map exportDelimitedToDirectory(DispatchContext dctx, Map context) { 60 return ServiceUtil.returnError("This service is not implemented yet."); 61 } 62 63 public static Map importDelimitedFromDirectory(DispatchContext dctx, Map context) { 64 LocalDispatcher dispatcher = dctx.getDispatcher(); 65 GenericDelegator delegator = dctx.getDelegator(); 66 Security security = dctx.getSecurity(); 67 68 GenericValue userLogin = (GenericValue) context.get("userLogin"); 70 if (!security.hasPermission("ENTITY_MAINT", userLogin)) { 71 return ServiceUtil.returnError("You do not have permission to run this service."); 72 } 73 74 String rootDirectory = (String ) context.get("rootDirectory"); 76 URL rootDirectoryUrl = UtilURL.fromResource(rootDirectory); 77 if (rootDirectoryUrl == null) { 78 return ServiceUtil.returnError("Unable to locate root directory : " + rootDirectory); 79 } 80 81 String delimiter = (String ) context.get("delimiter"); 82 if (delimiter == null) { 83 delimiter = "\t"; 85 } 86 87 File root = null; 88 try { 89 root = new File(new URI (rootDirectoryUrl.toExternalForm())); 90 } catch (URISyntaxException e) { 91 return ServiceUtil.returnError("Unable to get root directory URI"); 92 } 93 94 if (!root.exists() || !root.isDirectory() || !root.canRead()) { 95 return ServiceUtil.returnError("Root directory does not exist or is not readable."); 96 } 97 98 List files = getFileList(root); 100 if (files != null && files.size() > 0) { 101 Iterator i = files.iterator(); 102 while (i.hasNext()) { 103 File file = (File) i.next(); 104 try { 105 Map serviceCtx = UtilMisc.toMap("file", file, "delimiter", delimiter, "userLogin", userLogin); 106 dispatcher.runSyncIgnore("importDelimitedEntityFile", serviceCtx); 107 } catch (GenericServiceException e) { 108 Debug.logError(e, module); 109 } 110 } 111 } else { 112 return ServiceUtil.returnError("No files available for reading in this root directory : " + rootDirectory); 113 } 114 115 return ServiceUtil.returnSuccess(); 116 } 117 118 public static Map importDelimitedFile(DispatchContext dctx, Map context) { 119 GenericDelegator delegator = dctx.getDelegator(); 120 Security security = dctx.getSecurity(); 121 122 GenericValue userLogin = (GenericValue) context.get("userLogin"); 124 if (!security.hasPermission("ENTITY_MAINT", userLogin)) { 125 return ServiceUtil.returnError("You do not have permission to run this service."); 126 } 127 128 String delimiter = (String ) context.get("delimiter"); 129 if (delimiter == null) { 130 delimiter = "\t"; 132 } 133 134 long startTime = System.currentTimeMillis(); 135 136 File file = (File) context.get("file"); 137 int records = 0; 138 try { 139 records = readEntityFile(file, delimiter, delegator); 140 } catch (GeneralException e) { 141 return ServiceUtil.returnError(e.getMessage()); 142 } catch (FileNotFoundException e) { 143 return ServiceUtil.returnError("File not found : " + file.getName()); 144 } catch (IOException e) { 145 Debug.logError(e, module); 146 return ServiceUtil.returnError("Problem reading file : " + file.getName()); 147 } 148 149 long endTime = System.currentTimeMillis(); 150 long runTime = endTime - startTime; 151 152 Debug.logInfo("Imported/Updated [" + records + "] from : " + file.getAbsolutePath() + " [" + runTime + "ms]", module); 153 Map result = ServiceUtil.returnSuccess(); 154 result.put("records", new Integer (records)); 155 return result; 156 } 157 158 private static List getFileList(File root) { 159 List fileList = new ArrayList(); 160 161 File listFile = new File(root, "FILELIST.txt"); 163 Debug.logInfo("Checking file list - " + listFile.getPath(), module); 164 if (listFile.exists()) { 165 BufferedReader reader = null; 166 try { 167 reader = new BufferedReader(new FileReader(listFile)); 168 } catch (FileNotFoundException e) { 169 Debug.logError(e, module); 170 } 171 if (reader != null) { 172 String line; 174 try { 175 while ((line = reader.readLine()) != null) { 176 line = line.trim(); 177 File thisFile = new File(root, line); 178 if (thisFile.exists()) { 179 fileList.add(thisFile); 180 } 181 } 182 } catch (IOException e) { 183 Debug.logError(e, module); 184 } 185 186 try { 188 reader.close(); 189 } catch (IOException e) { 190 Debug.logError(e, module); 191 } 192 Debug.logInfo("Read file list : " + fileList.size() + " entities.", module); 193 } 194 } else { 195 File[] files = root.listFiles(); 196 for (int i = 0; i < files.length; i++) { 197 String fileName = files[i].getName(); 198 if (!fileName.startsWith("_") && fileName.endsWith(".txt")) { 199 fileList.add(files[i]); 200 } 201 } 202 Debug.logInfo("No file list found; using directory order : " + fileList.size() + " entities.", module); 203 } 204 205 return fileList; 206 } 207 208 private static String [] readEntityHeader(File file, String delimiter, BufferedReader dataReader) throws IOException { 209 String filePath = file.getPath().replace('\\', '/'); 210 211 String [] header = null; 212 File headerFile = new File(filePath.substring(0, filePath.lastIndexOf('/')), "_" + file.getName()); 213 214 boolean uniqueHeaderFile = true; 215 BufferedReader reader = null; 216 if (headerFile.exists()) { 217 reader = new BufferedReader(new FileReader(headerFile)); 218 } else { 219 uniqueHeaderFile = false; 220 reader = dataReader; 221 } 222 223 String firstLine = reader.readLine(); 225 if (firstLine != null) { 226 header = firstLine.split(delimiter); 227 } 228 229 if (uniqueHeaderFile) { 230 reader.close(); 231 } 232 233 return header; 234 } 235 236 private static int readEntityFile(File file, String delimiter, GenericDelegator delegator) throws IOException, GeneralException { 237 String entityName = file.getName().substring(0, file.getName().lastIndexOf('.')); 238 if (entityName == null) { 239 throw new GeneralException("Entity name cannot be null : [" + file.getName() + "]"); 240 } 241 242 BufferedReader reader = new BufferedReader(new FileReader(file)); 243 String [] header = readEntityHeader(file, delimiter, reader); 244 245 GeneralException exception = null; 247 String line = null; 248 int lineNumber = 1; 249 while ((line = reader.readLine()) != null) { 250 String fields[] = line.split(delimiter); 252 if (fields.length < 1) { 254 exception = new GeneralException("Illegal number of fields [" + file.getName() + " / " + lineNumber); 255 break; 256 } 257 258 GenericValue newValue = makeGenericValue(delegator, entityName, header, fields); 259 newValue = delegator.createOrStore(newValue); 261 263 if (lineNumber % 500 == 0 || lineNumber == 1) { 264 Debug.log("Records Stored [" + file.getName() + "]: " + lineNumber, module); 265 } 267 268 lineNumber++; 269 } 270 reader.close(); 271 272 if (exception != null) { 274 throw exception; 275 } 276 277 return lineNumber; 278 } 279 280 private static GenericValue makeGenericValue(GenericDelegator delegator, String entityName, String [] header, String [] line) { 281 GenericValue newValue = delegator.makeValue(entityName, null); 282 for (int i = 0; i < header.length; i++) { 283 String name = header[i].trim(); 284 285 String value = null; 286 if (i < line.length) { 287 value = line[i]; 288 } 289 290 if (value != null && value.length() > 0) { 292 char first = value.charAt(0); 293 if (first == 0x00) { 294 value = null; 295 } 296 297 if (value != null) { 299 value = value.trim(); 300 } 301 302 if (value != null && value.length() == 0) { 303 value = null; 304 } 305 } else { 306 value = null; 307 } 308 309 newValue.setString(name, value); 311 } 312 return newValue; 313 } 314 315 private String [] getEntityFieldNames(GenericDelegator delegator, String entityName) { 316 ModelEntity entity = delegator.getModelEntity(entityName); 317 if (entity == null) { 318 return null; 319 } 320 List modelFields = entity.getFieldsCopy(); 321 if (modelFields == null) { 322 return null; 323 } 324 325 String [] fieldNames = new String [modelFields.size()]; 326 for (int i = 0; i < modelFields.size(); i++) { 327 ModelField field = (ModelField) modelFields.get(i); 328 fieldNames[i] = field.getName(); 329 } 330 331 return fieldNames; 332 } 333 334 public static Map rebuildAllIndexesAndKeys(DispatchContext dctx, Map context) { 335 GenericDelegator delegator = dctx.getDelegator(); 336 Security security = dctx.getSecurity(); 337 338 GenericValue userLogin = (GenericValue) context.get("userLogin"); 340 if (!security.hasPermission("ENTITY_MAINT", userLogin)) { 341 return ServiceUtil.returnError("You do not have permission to run this service."); 342 } 343 344 String groupName = (String ) context.get("groupName"); 345 Boolean fixSizes = (Boolean ) context.get("fixColSizes"); 346 if (fixSizes == null) fixSizes = new Boolean (false); 347 List messages = new ArrayList(); 348 349 String helperName = delegator.getGroupHelperName(groupName); 350 DatabaseUtil dbUtil = new DatabaseUtil(helperName); 351 Map modelEntities = delegator.getModelEntityMapByGroup(groupName); 352 Set modelEntityNames = new TreeSet(modelEntities.keySet()); 353 354 Iterator modelEntityNameIter = null; 355 356 Debug.logImportant("Removing all foreign key indices", module); 358 modelEntityNameIter = modelEntityNames.iterator(); 359 while (modelEntityNameIter.hasNext()) { 360 String modelEntityName = (String ) modelEntityNameIter.next(); 361 ModelEntity modelEntity = (ModelEntity) modelEntities.get(modelEntityName); 362 dbUtil.deleteForeignKeyIndices(modelEntity, messages); 363 } 364 modelEntityNameIter = null; 365 366 Debug.logImportant("Removing all foreign keys", module); 368 modelEntityNameIter = modelEntityNames.iterator(); 369 while (modelEntityNameIter.hasNext()) { 370 String modelEntityName = (String ) modelEntityNameIter.next(); 371 ModelEntity modelEntity = (ModelEntity) modelEntities.get(modelEntityName); 372 dbUtil.deleteForeignKeys(modelEntity, modelEntities, messages); 373 } 374 modelEntityNameIter = null; 375 376 Debug.logImportant("Removing all primary keys", module); 378 modelEntityNameIter = modelEntityNames.iterator(); 379 while (modelEntityNameIter.hasNext()) { 380 String modelEntityName = (String ) modelEntityNameIter.next(); 381 ModelEntity modelEntity = (ModelEntity) modelEntities.get(modelEntityName); 382 dbUtil.deletePrimaryKey(modelEntity, messages); 383 } 384 modelEntityNameIter = null; 385 386 Debug.logImportant("Removing all declared indices", module); 388 modelEntityNameIter = modelEntityNames.iterator(); 389 while (modelEntityNameIter.hasNext()) { 390 String modelEntityName = (String ) modelEntityNameIter.next(); 391 ModelEntity modelEntity = (ModelEntity) modelEntities.get(modelEntityName); 392 dbUtil.deleteDeclaredIndices(modelEntity, messages); 393 } 394 modelEntityNameIter = null; 395 396 if (fixSizes.booleanValue()) { 398 Debug.logImportant("Updating column field size changes", module); 399 List fieldsWrongSize = new LinkedList(); 400 dbUtil.checkDb(modelEntities, fieldsWrongSize, messages, true, true, true, true); 401 if (fieldsWrongSize.size() > 0) { 402 dbUtil.repairColumnSizeChanges(modelEntities, fieldsWrongSize, messages); 403 } else { 404 String thisMsg = "No field sizes to update"; 405 messages.add(thisMsg); 406 Debug.logImportant(thisMsg, module); 407 } 408 } 409 410 Debug.logImportant("Creating all primary keys", module); 412 modelEntityNameIter = modelEntityNames.iterator(); 413 while (modelEntityNameIter.hasNext()) { 414 String modelEntityName = (String ) modelEntityNameIter.next(); 415 ModelEntity modelEntity = (ModelEntity) modelEntities.get(modelEntityName); 416 dbUtil.createPrimaryKey(modelEntity, messages); 417 } 418 modelEntityNameIter = null; 419 420 Debug.logImportant("Creating all foreign key indices", module); 422 modelEntityNameIter = modelEntityNames.iterator(); 423 while (modelEntityNameIter.hasNext()) { 424 String modelEntityName = (String ) modelEntityNameIter.next(); 425 ModelEntity modelEntity = (ModelEntity) modelEntities.get(modelEntityName); 426 dbUtil.createForeignKeyIndices(modelEntity, messages); 427 } 428 modelEntityNameIter = null; 429 430 Debug.logImportant("Creating all foreign keys", module); 432 modelEntityNameIter = modelEntityNames.iterator(); 433 while (modelEntityNameIter.hasNext()) { 434 String modelEntityName = (String ) modelEntityNameIter.next(); 435 ModelEntity modelEntity = (ModelEntity) modelEntities.get(modelEntityName); 436 dbUtil.createForeignKeys(modelEntity, modelEntities, messages); 437 } 438 modelEntityNameIter = null; 439 440 Debug.logImportant("Creating all declared indices", module); 442 modelEntityNameIter = modelEntityNames.iterator(); 443 while (modelEntityNameIter.hasNext()) { 444 String modelEntityName = (String ) modelEntityNameIter.next(); 445 ModelEntity modelEntity = (ModelEntity) modelEntities.get(modelEntityName); 446 dbUtil.createDeclaredIndices(modelEntity, messages); 447 } 448 modelEntityNameIter = null; 449 450 Debug.logImportant("Running DB check with add missing enabled", module); 452 dbUtil.checkDb(modelEntities, messages, true); 453 454 Map result = ServiceUtil.returnSuccess(); 455 result.put("messages", messages); 456 return result; 457 } 458 } 459 | Popular Tags |