blob: e3adbd861032b81b57f796ab34644a544dce253b [file] [log] [blame]
/*
* 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("<?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++
}
}
}
}
}