KickJava   Java API By Example, From Geeks To Geeks.

Java > Open Source Codes > org > ofbiz > entityext > data > EntityDataServices


1 /*
2  * $Id: EntityDataServices.java 5759 2005-09-17 04:45:42Z jonesde $
3  *
4  * Copyright (c) 2001-2003 The Open For Business Project - www.ofbiz.org
5  *
6  * Permission is hereby granted, free of charge, to any person obtaining a
7  * copy of this software and associated documentation files (the "Software"),
8  * to deal in the Software without restriction, including without limitation
9  * the rights to use, copy, modify, merge, publish, distribute, sublicense,
10  * and/or sell copies of the Software, and to permit persons to whom the
11  * Software is furnished to do so, subject to the following conditions:
12  *
13  * The above copyright notice and this permission notice shall be included
14  * in all copies or substantial portions of the Software.
15  *
16  * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS
17  * OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
18  * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.
19  * IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY
20  * CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT
21  * OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR
22  * THE USE OR OTHER DEALINGS IN THE SOFTWARE.
23  *
24  */

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 JavaDoc;
45 import java.net.URL JavaDoc;
46 import java.net.URISyntaxException JavaDoc;
47
48 /**
49  * Entity Data Import/Export Services
50  *
51  * @author <a HREF="mailto:jaz@ofbiz.org">Andy Zeneski</a>
52  * @version $Rev: 5759 $
53  * @since 2.1
54  */

55 public class EntityDataServices {
56
57     public static final String JavaDoc 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         // check permission
69
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         // get the directory & delimiter
75
String JavaDoc rootDirectory = (String JavaDoc) 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 JavaDoc delimiter = (String JavaDoc) context.get("delimiter");
82         if (delimiter == null) {
83             // default delimiter is tab
84
delimiter = "\t";
85         }
86
87         File root = null;
88         try {
89             root = new File(new URI JavaDoc(rootDirectoryUrl.toExternalForm()));
90         } catch (URISyntaxException JavaDoc 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         // get the file list
99
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         // check permission
123
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 JavaDoc delimiter = (String JavaDoc) context.get("delimiter");
129         if (delimiter == null) {
130             // default delimiter is tab
131
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 JavaDoc(records));
155         return result;
156     }
157
158     private static List getFileList(File root) {
159         List fileList = new ArrayList();
160
161         // check for a file list file
162
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                 // read each line as a file name to load
173
String JavaDoc 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                 // close the reader
187
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 JavaDoc 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 JavaDoc[] readEntityHeader(File file, String JavaDoc delimiter, BufferedReader dataReader) throws IOException {
209         String JavaDoc filePath = file.getPath().replace('\\', '/');
210
211         String JavaDoc[] 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         // read one line from either the header file or the data file if no header file exists
224
String JavaDoc 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 JavaDoc delimiter, GenericDelegator delegator) throws IOException, GeneralException {
237         String JavaDoc 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 JavaDoc[] header = readEntityHeader(file, delimiter, reader);
244
245         //Debug.log("Opened data file [" + file.getName() + "] now running...", module);
246
GeneralException exception = null;
247         String JavaDoc line = null;
248         int lineNumber = 1;
249         while ((line = reader.readLine()) != null) {
250             // process the record
251
String JavaDoc fields[] = line.split(delimiter);
252             //Debug.log("Split record", module);
253
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             //Debug.log("Made value object", module);
260
newValue = delegator.createOrStore(newValue);
261             //Debug.log("Stored record", module);
262

263             if (lineNumber % 500 == 0 || lineNumber == 1) {
264                 Debug.log("Records Stored [" + file.getName() + "]: " + lineNumber, module);
265                 //Debug.log("Last record : " + newValue, module);
266
}
267
268             lineNumber++;
269         }
270         reader.close();
271
272         // now that we closed the reader; throw the exception
273
if (exception != null) {
274             throw exception;
275         }
276
277         return lineNumber;
278     }
279
280     private static GenericValue makeGenericValue(GenericDelegator delegator, String JavaDoc entityName, String JavaDoc[] header, String JavaDoc[] line) {
281         GenericValue newValue = delegator.makeValue(entityName, null);
282         for (int i = 0; i < header.length; i++) {
283             String JavaDoc name = header[i].trim();
284
285             String JavaDoc value = null;
286             if (i < line.length) {
287                 value = line[i];
288             }
289
290             // check for null values
291
if (value != null && value.length() > 0) {
292                 char first = value.charAt(0);
293                 if (first == 0x00) {
294                     value = null;
295                 }
296
297                 // trim non-null values
298
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             // convert and set the fields
310
newValue.setString(name, value);
311         }
312         return newValue;
313     }
314
315     private String JavaDoc[] getEntityFieldNames(GenericDelegator delegator, String JavaDoc 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 JavaDoc[] fieldNames = new String JavaDoc[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         // check permission
339
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 JavaDoc groupName = (String JavaDoc) context.get("groupName");
345         Boolean JavaDoc fixSizes = (Boolean JavaDoc) context.get("fixColSizes");
346         if (fixSizes == null) fixSizes = new Boolean JavaDoc(false);
347         List messages = new ArrayList();
348
349         String JavaDoc 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         // step 1 - remove FK indices
357
Debug.logImportant("Removing all foreign key indices", module);
358         modelEntityNameIter = modelEntityNames.iterator();
359         while (modelEntityNameIter.hasNext()) {
360             String JavaDoc modelEntityName = (String JavaDoc) modelEntityNameIter.next();
361             ModelEntity modelEntity = (ModelEntity) modelEntities.get(modelEntityName);
362             dbUtil.deleteForeignKeyIndices(modelEntity, messages);
363         }
364         modelEntityNameIter = null;
365
366         // step 2 - remove FKs
367
Debug.logImportant("Removing all foreign keys", module);
368         modelEntityNameIter = modelEntityNames.iterator();
369         while (modelEntityNameIter.hasNext()) {
370             String JavaDoc modelEntityName = (String JavaDoc) modelEntityNameIter.next();
371             ModelEntity modelEntity = (ModelEntity) modelEntities.get(modelEntityName);
372             dbUtil.deleteForeignKeys(modelEntity, modelEntities, messages);
373         }
374         modelEntityNameIter = null;
375
376         // step 3 - remove PKs
377
Debug.logImportant("Removing all primary keys", module);
378         modelEntityNameIter = modelEntityNames.iterator();
379         while (modelEntityNameIter.hasNext()) {
380             String JavaDoc modelEntityName = (String JavaDoc) modelEntityNameIter.next();
381             ModelEntity modelEntity = (ModelEntity) modelEntities.get(modelEntityName);
382             dbUtil.deletePrimaryKey(modelEntity, messages);
383         }
384         modelEntityNameIter = null;
385
386         // step 4 - remove declared indices
387
Debug.logImportant("Removing all declared indices", module);
388         modelEntityNameIter = modelEntityNames.iterator();
389         while (modelEntityNameIter.hasNext()) {
390             String JavaDoc modelEntityName = (String JavaDoc) modelEntityNameIter.next();
391             ModelEntity modelEntity = (ModelEntity) modelEntities.get(modelEntityName);
392             dbUtil.deleteDeclaredIndices(modelEntity, messages);
393         }
394         modelEntityNameIter = null;
395
396         // step 5 - repair field sizes
397
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 JavaDoc thisMsg = "No field sizes to update";
405                 messages.add(thisMsg);
406                 Debug.logImportant(thisMsg, module);
407             }
408         }
409
410         // step 6 - create PKs
411
Debug.logImportant("Creating all primary keys", module);
412         modelEntityNameIter = modelEntityNames.iterator();
413         while (modelEntityNameIter.hasNext()) {
414             String JavaDoc modelEntityName = (String JavaDoc) modelEntityNameIter.next();
415             ModelEntity modelEntity = (ModelEntity) modelEntities.get(modelEntityName);
416             dbUtil.createPrimaryKey(modelEntity, messages);
417         }
418         modelEntityNameIter = null;
419
420         // step 7 - create FK indices
421
Debug.logImportant("Creating all foreign key indices", module);
422         modelEntityNameIter = modelEntityNames.iterator();
423         while (modelEntityNameIter.hasNext()) {
424             String JavaDoc modelEntityName = (String JavaDoc) modelEntityNameIter.next();
425             ModelEntity modelEntity = (ModelEntity) modelEntities.get(modelEntityName);
426             dbUtil.createForeignKeyIndices(modelEntity, messages);
427         }
428         modelEntityNameIter = null;
429
430         // step 8 - create FKs
431
Debug.logImportant("Creating all foreign keys", module);
432         modelEntityNameIter = modelEntityNames.iterator();
433         while (modelEntityNameIter.hasNext()) {
434             String JavaDoc modelEntityName = (String JavaDoc) modelEntityNameIter.next();
435             ModelEntity modelEntity = (ModelEntity) modelEntities.get(modelEntityName);
436             dbUtil.createForeignKeys(modelEntity, modelEntities, messages);
437         }
438         modelEntityNameIter = null;
439
440         // step 8 - create FKs
441
Debug.logImportant("Creating all declared indices", module);
442         modelEntityNameIter = modelEntityNames.iterator();
443         while (modelEntityNameIter.hasNext()) {
444             String JavaDoc modelEntityName = (String JavaDoc) modelEntityNameIter.next();
445             ModelEntity modelEntity = (ModelEntity) modelEntities.get(modelEntityName);
446             dbUtil.createDeclaredIndices(modelEntity, messages);
447         }
448         modelEntityNameIter = null;
449
450         // step 8 - checkdb
451
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