| /* |
| * Licensed to the Apache Software Foundation (ASF) under one |
| * or more contributor license agreements. See the NOTICE file |
| * distributed with this work for additional information |
| * regarding copyright ownership. The ASF licenses this file |
| * to you under the Apache License, Version 2.0 (the |
| * "License"); you may not use this file except in compliance |
| * with the License. You may obtain a copy of the License at |
| * |
| * http://www.apache.org/licenses/LICENSE-2.0 |
| * |
| * Unless required by applicable law or agreed to in writing, |
| * software distributed under the License is distributed on an |
| * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY |
| * KIND, either express or implied. See the License for the |
| * specific language governing permissions and limitations |
| * under the License. |
| */ |
| |
| import java.util.*; |
| import java.io.*; |
| import org.ofbiz.base.util.*; |
| import org.ofbiz.entity.model.*; |
| import org.ofbiz.entity.util.*; |
| import org.ofbiz.entity.transaction.*; |
| import org.ofbiz.entity.condition.*; |
| |
| outpath = parameters.outpath; |
| filename = parameters.filename; |
| maxRecStr = parameters.maxrecords; |
| entitySyncId = parameters.entitySyncId; |
| passedEntityNames = null; |
| if (parameters.entityName) passedEntityNames = parameters.entityName instanceof Collection ? parameters.entityName as TreeSet : [parameters.entityName] as TreeSet; |
| |
| // get the max records per file setting and convert to a int |
| maxRecordsPerFile = 0; |
| if (maxRecStr) { |
| try { |
| maxRecordsPerFile = Integer.parseInt(maxRecStr); |
| } |
| catch (Exception e) { |
| } |
| } |
| |
| preConfiguredSetName = parameters.preConfiguredSetName; |
| if ("Product1".equals(preConfiguredSetName)) { |
| passedEntityNames = new LinkedHashSet(); |
| passedEntityNames.add("DataResource"); |
| passedEntityNames.add("Facility"); |
| passedEntityNames.add("ProdCatalog"); |
| passedEntityNames.add("Product"); |
| passedEntityNames.add("ProductCategory"); |
| passedEntityNames.add("ProductFeatureCategory"); |
| passedEntityNames.add("ProductFeatureType"); |
| passedEntityNames.add("ProductPriceRule"); |
| passedEntityNames.add("ProductPromo"); |
| } else if ("Product2".equals(preConfiguredSetName)) { |
| passedEntityNames = new LinkedHashSet(); |
| passedEntityNames.add("Content"); |
| passedEntityNames.add("ElectronicText"); |
| passedEntityNames.add("FacilityLocation"); |
| passedEntityNames.add("ProdCatalogCategory"); |
| passedEntityNames.add("ProdCatalogRole"); |
| passedEntityNames.add("ProductAssoc"); |
| passedEntityNames.add("ProductAttribute"); |
| passedEntityNames.add("ProductCategoryMember"); |
| passedEntityNames.add("ProductCategoryRollup"); |
| passedEntityNames.add("ProductFacility"); |
| passedEntityNames.add("ProductFeature"); |
| passedEntityNames.add("ProductFeatureCategoryAppl"); |
| passedEntityNames.add("ProductKeyword"); |
| passedEntityNames.add("ProductPrice"); |
| passedEntityNames.add("ProductPriceAction"); |
| passedEntityNames.add("ProductPriceCond"); |
| passedEntityNames.add("ProductPromoCode"); |
| passedEntityNames.add("ProductPromoCategory"); |
| passedEntityNames.add("ProductPromoProduct"); |
| passedEntityNames.add("ProductPromoRule"); |
| } else if ("Product3".equals(preConfiguredSetName)) { |
| passedEntityNames = new LinkedHashSet(); |
| passedEntityNames.add("ProdCatalogInvFacility"); |
| passedEntityNames.add("ProductContent"); |
| passedEntityNames.add("ProductFacilityLocation"); |
| passedEntityNames.add("ProductFeatureAppl"); |
| passedEntityNames.add("ProductFeatureDataResource"); |
| passedEntityNames.add("ProductFeatureGroup"); |
| passedEntityNames.add("ProductPriceChange"); |
| passedEntityNames.add("ProductPromoAction"); |
| passedEntityNames.add("ProductPromoCodeEmail"); |
| passedEntityNames.add("ProductPromoCodeParty"); |
| passedEntityNames.add("ProductPromoCond"); |
| } else if ("Product4".equals(preConfiguredSetName)) { |
| passedEntityNames = new LinkedHashSet(); |
| passedEntityNames.add("InventoryItem"); |
| passedEntityNames.add("ProductFeatureCatGrpAppl"); |
| passedEntityNames.add("ProductFeatureGroupAppl"); |
| } else if ("CatalogExport".equals(preConfiguredSetName)) { |
| passedEntityNames = new LinkedHashSet(); |
| passedEntityNames.add("ProdCatalogCategoryType"); |
| passedEntityNames.add("ProdCatalog"); |
| passedEntityNames.add("ProductCategoryType"); |
| passedEntityNames.add("ProductCategory"); |
| passedEntityNames.add("ProductCategoryRollup"); |
| passedEntityNames.add("ProdCatalogCategory"); |
| passedEntityNames.add("ProductFeatureType"); |
| passedEntityNames.add("ProductFeatureCategory"); |
| |
| passedEntityNames.add("DataResource"); |
| passedEntityNames.add("Content"); |
| passedEntityNames.add("ElectronicText"); |
| |
| passedEntityNames.add("ProductType"); |
| passedEntityNames.add("Product"); |
| passedEntityNames.add("ProductAttribute"); |
| passedEntityNames.add("GoodIdentificationType"); |
| passedEntityNames.add("GoodIdentification"); |
| passedEntityNames.add("ProductPriceType"); |
| passedEntityNames.add("ProductPrice"); |
| |
| passedEntityNames.add("ProductPriceRule"); |
| passedEntityNames.add("ProductPriceCond"); |
| passedEntityNames.add("ProductPriceAction"); |
| //passedEntityNames.add("ProductPriceChange"); |
| |
| passedEntityNames.add("ProductPromo"); |
| passedEntityNames.add("ProductPromoCode"); |
| passedEntityNames.add("ProductPromoCategory"); |
| passedEntityNames.add("ProductPromoProduct"); |
| passedEntityNames.add("ProductPromoRule"); |
| passedEntityNames.add("ProductPromoAction"); |
| passedEntityNames.add("ProductPromoCodeEmail"); |
| passedEntityNames.add("ProductPromoCodeParty"); |
| passedEntityNames.add("ProductPromoCond"); |
| |
| passedEntityNames.add("ProductCategoryMember"); |
| passedEntityNames.add("ProductAssoc"); |
| passedEntityNames.add("ProductContent"); |
| |
| passedEntityNames.add("ProductFeature"); |
| passedEntityNames.add("ProductFeatureCategoryAppl"); |
| passedEntityNames.add("ProductFeatureAppl"); |
| passedEntityNames.add("ProductFeatureDataResource"); |
| passedEntityNames.add("ProductFeatureGroup"); |
| passedEntityNames.add("ProductFeatureCatGrpAppl"); |
| passedEntityNames.add("ProductFeatureGroupAppl"); |
| |
| //passedEntityNames.add("ProductKeyword"); |
| } |
| |
| if (entitySyncId) { |
| passedEntityNames = org.ofbiz.entityext.synchronization.EntitySyncContext.getEntitySyncModelNamesToUse(dispatcher, entitySyncId); |
| } |
| checkAll = "true".equals(parameters.checkAll); |
| tobrowser = parameters.tobrowser != null; |
| context.tobrowser = tobrowser; |
| |
| entityFromCond = null; |
| entityThruCond = null; |
| entityDateCond = null; |
| if (entityFrom) { |
| entityFromCond = EntityCondition.makeCondition("lastUpdatedTxStamp", EntityComparisonOperator.GREATER_THAN, entityFrom); |
| } |
| if (entityThru) { |
| entityThruCond = EntityCondition.makeCondition("lastUpdatedTxStamp", EntityComparisonOperator.LESS_THAN, entityThru); |
| } |
| if (entityFromCond && entityThruCond) { |
| entityDateCond = EntityCondition.makeCondition(entityFromCond, EntityJoinOperator.AND, entityThruCond); |
| } else if (entityFromCond) { |
| entityDateCond = entityFromCond; |
| } else if (entityThruCond) { |
| entityDateCond = entityThruCond; |
| } |
| |
| reader = delegator.getModelReader(); |
| modelEntities = reader.getEntityCache().values() as TreeSet; |
| context.modelEntities = modelEntities; |
| |
| if (passedEntityNames) { |
| if (tobrowser) { |
| session.setAttribute("xmlrawdump_entitylist", passedEntityNames); |
| session.setAttribute("entityDateCond", entityDateCond); |
| } else { |
| efo = new EntityFindOptions(true, EntityFindOptions.TYPE_SCROLL_INSENSITIVE, EntityFindOptions.CONCUR_READ_ONLY, true); |
| numberOfEntities = passedEntityNames?.size() ?: 0; |
| context.numberOfEntities = numberOfEntities; |
| numberWritten = 0; |
| |
| // single file |
| if (filename && numberOfEntities) { |
| writer = new PrintWriter(new BufferedWriter(new OutputStreamWriter(new FileOutputStream(filename), "UTF-8"))); |
| writer.println("<?xml version=\"1.0\" encoding=\"UTF-8\"?>"); |
| writer.println("<entity-engine-xml>"); |
| |
| passedEntityNames.each { curEntityName -> |
| if (entityFrom) { |
| curModelEntity = reader.getModelEntity(curEntityName); |
| if (curModelEntity instanceof ModelViewEntity) { |
| return; |
| } |
| } |
| |
| beganTransaction = TransactionUtil.begin(3600); |
| try { |
| me = reader.getModelEntity(curEntityName); |
| if (me.getNoAutoStamp() || me instanceof ModelViewEntity) { |
| values = delegator.find(curEntityName, null, null, null, me.getPkFieldNames(), efo); |
| } else { |
| values = delegator.find(curEntityName, entityDateCond, null, null, UtilMisc.toList("-createdTxStamp"), efo); |
| } |
| |
| curNumberWritten = 0; |
| while (value = values.next()) { |
| value.writeXmlText(writer, ""); |
| numberWritten++; |
| curNumberWritten++; |
| if (curNumberWritten % 500 == 0 || curNumberWritten == 1) { |
| Debug.log("Records written [$curEntityName]: $curNumberWritten Total: $numberWritten"); |
| } |
| } |
| values.close(); |
| Debug.log("Wrote [$curNumberWritten] from entity : $curEntityName"); |
| TransactionUtil.commit(beganTransaction); |
| } catch (Exception e) { |
| errMsg = "Error reading data for XML export:"; |
| Debug.logError(e, errMsg, "JSP"); |
| TransactionUtil.rollback(beganTransaction, errMsg, e); |
| } |
| } |
| writer.println("</entity-engine-xml>"); |
| writer.close(); |
| Debug.log("Total records written from all entities: $numberWritten"); |
| context.numberWritten = numberWritten; |
| } |
| |
| // multiple files in a directory |
| results = []; |
| fileNumber = 1; |
| context.results = results; |
| if (outpath) { |
| outdir = new File(outpath); |
| if (!outdir.exists()) { |
| outdir.mkdir(); |
| } |
| if (outdir.isDirectory() && outdir.canWrite()) { |
| passedEntityNames.each { curEntityName -> |
| numberWritten = 0; |
| fileName = preConfiguredSetName ? UtilFormatOut.formatPaddedNumber((long) fileNumber, 3) + "_" : ""; |
| fileName = fileName + curEntityName; |
| |
| values = null; |
| beganTransaction = false; |
| try { |
| beganTransaction = TransactionUtil.begin(3600); |
| |
| me = delegator.getModelEntity(curEntityName); |
| if (me instanceof ModelViewEntity) { |
| results.add("[$fileNumber] [vvv] $curEntityName skipping view entity"); |
| return; |
| } |
| if (me.getNoAutoStamp() || me instanceof ModelViewEntity) { |
| values = delegator.find(curEntityName, null, null, null, me.getPkFieldNames(), efo); |
| } else { |
| values = delegator.find(curEntityName, entityDateCond, null, null, me.getPkFieldNames(), efo); |
| } |
| isFirst = true; |
| writer = null; |
| fileSplitNumber = 1; |
| while (value = values.next()) { |
| //Don't bother writing the file if there's nothing |
| //to put into it |
| if (isFirst) { |
| writer = new PrintWriter(new BufferedWriter(new OutputStreamWriter(new FileOutputStream(new File(outdir, fileName +".xml")), "UTF-8"))); |
| writer.println("<?xml version=\"1.0\" encoding=\"UTF-8\"?>"); |
| writer.println("<entity-engine-xml>"); |
| isFirst = false; |
| } |
| value.writeXmlText(writer, ""); |
| numberWritten++; |
| |
| // split into small files |
| if (maxRecordsPerFile > 0 && (numberWritten % maxRecordsPerFile == 0)) { |
| fileSplitNumber++; |
| // close the file |
| writer.println("</entity-engine-xml>"); |
| writer.close(); |
| |
| // create a new file |
| splitNumStr = UtilFormatOut.formatPaddedNumber((long) fileSplitNumber, 3); |
| writer = new PrintWriter(new BufferedWriter(new OutputStreamWriter(new FileOutputStream(new File(outdir, fileName + "_" + splitNumStr +".xml")), "UTF-8"))); |
| writer.println("<?xml version=\"1.0\" encoding=\"UTF-8\"?>"); |
| writer.println("<entity-engine-xml>"); |
| } |
| |
| if (numberWritten % 500 == 0 || numberWritten == 1) { |
| Debug.log("Records written [$curEntityName]: $numberWritten"); |
| } |
| |
| } |
| if (writer) { |
| writer.println("</entity-engine-xml>"); |
| writer.close(); |
| String thisResult = "[$fileNumber] [$numberWritten] $curEntityName wrote $numberWritten records"; |
| Debug.log(thisResult); |
| results.add(thisResult); |
| } else { |
| thisResult = "[$fileNumber] [---] $curEntityName has no records, not writing file"; |
| Debug.log(thisResult); |
| results.add(thisResult); |
| } |
| values.close(); |
| } catch (Exception ex) { |
| if (values != null) { |
| values.close(); |
| } |
| thisResult = "[$fileNumber] [xxx] Error when writing $curEntityName: $ex"; |
| Debug.log(thisResult); |
| results.add(thisResult); |
| TransactionUtil.rollback(beganTransaction, thisResult, ex); |
| } finally { |
| // only commit the transaction if we started one... this will throw an exception if it fails |
| TransactionUtil.commit(beganTransaction); |
| } |
| fileNumber++; |
| } |
| } |
| } |
| } |
| } |