/* * 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.apache.ofbiz.base.util.* import org.apache.ofbiz.entity.model.* import org.apache.ofbiz.entity.util.* import org.apache.ofbiz.entity.transaction.* import org.apache.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.apache.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("") writer.println("") 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("") 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("") writer.println("") isFirst = false } value.writeXmlText(writer, "") numberWritten++ // split into small files if (maxRecordsPerFile > 0 && (numberWritten % maxRecordsPerFile == 0)) { fileSplitNumber++ // close the file writer.println("") 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("") writer.println("") } if (numberWritten % 500 == 0 || numberWritten == 1) { Debug.log("Records written [$curEntityName]: $numberWritten") } } if (writer) { writer.println("") 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++ } } } } }