From 53a8d108adc0494cc0353e75aa0ca1c06bc52762 Mon Sep 17 00:00:00 2001 From: Deepak Dixit Date: Tue, 5 May 2026 18:27:22 +0530 Subject: [PATCH 1/3] Improve XmlDsDump performance and resource handling using EntityQuery and auto-closing iterators --- .../ofbiz/webtools/entity/XmlDsDump.groovy | 27 ++++++++----------- 1 file changed, 11 insertions(+), 16 deletions(-) diff --git a/framework/webtools/src/main/groovy/org/apache/ofbiz/webtools/entity/XmlDsDump.groovy b/framework/webtools/src/main/groovy/org/apache/ofbiz/webtools/entity/XmlDsDump.groovy index 59d8367fe82..430db03401a 100644 --- a/framework/webtools/src/main/groovy/org/apache/ofbiz/webtools/entity/XmlDsDump.groovy +++ b/framework/webtools/src/main/groovy/org/apache/ofbiz/webtools/entity/XmlDsDump.groovy @@ -25,7 +25,7 @@ import org.apache.ofbiz.entity.condition.EntityCondition import org.apache.ofbiz.entity.condition.EntityJoinOperator import org.apache.ofbiz.entity.model.ModelViewEntity import org.apache.ofbiz.entity.transaction.TransactionUtil -import org.apache.ofbiz.entity.util.EntityFindOptions +import org.apache.ofbiz.entity.util.EntityQuery outpath = parameters.outpath filename = parameters.filename @@ -188,7 +188,6 @@ if (passedEntityNames) { session.setAttribute('xmlrawdump_entitylist', passedEntityNames) session.setAttribute('entityDateCond', entityDateCond) } else { - efo = new EntityFindOptions(true, EntityFindOptions.TYPE_SCROLL_INSENSITIVE, EntityFindOptions.CONCUR_READ_ONLY, false) numberOfEntities = passedEntityNames?.size() ?: 0 context.numberOfEntities = numberOfEntities numberWritten = 0 @@ -213,13 +212,13 @@ if (passedEntityNames) { beganTransaction = TransactionUtil.begin(3600) try { me = reader.getModelEntity(curEntityName) - if (me.getNoAutoStamp() || me instanceof ModelViewEntity) { - values = delegator.find(curEntityName, null, null, null, null, efo) - } else { - values = delegator.find(curEntityName, entityDateCond, null, null, null, efo) + entityQuery = EntityQuery.use(delegator).from(curEntityName).cursorScrollInsensitive() + if (!me.getNoAutoStamp() && !(me instanceof ModelViewEntity) && entityDateCond) { + entityQuery.where(entityDateCond) } curNumberWritten = 0 + entityQuery.queryIterator().withCloseable {values -> while ((value = values.next()) != null) { value.writeXmlText(writer, '') numberWritten++ @@ -228,7 +227,7 @@ if (passedEntityNames) { Debug.log("Records written [$curEntityName]: $curNumberWritten Total: $numberWritten") } } - values.close() + } Debug.log("Wrote [$curNumberWritten] from entity : $curEntityName") TransactionUtil.commit(beganTransaction) } catch (Exception e) { @@ -258,7 +257,6 @@ if (passedEntityNames) { fileName = preConfiguredSetName ? UtilFormatOut.formatPaddedNumber((long) fileNumber, 3) + '_' : '' fileName = fileName + curEntityName - values = null beganTransaction = false try { beganTransaction = TransactionUtil.begin(3600) @@ -268,14 +266,14 @@ if (passedEntityNames) { results.add("[$fileNumber] [vvv] $curEntityName skipping view entity") return } - if (me.getNoAutoStamp() || me instanceof ModelViewEntity) { - values = delegator.find(curEntityName, null, null, null, null, efo) - } else { - values = delegator.find(curEntityName, entityDateCond, null, null, null, efo) + entityQuery = EntityQuery.use(delegator).from(curEntityName).cursorScrollInsensitive() + if (!me.getNoAutoStamp() && !(me instanceof ModelViewEntity) && entityDateCond) { + entityQuery.where(entityDateCond) } isFirst = true writer = null fileSplitNumber = 1 + entityQuery.queryIterator().withCloseable {values -> while ((value = values.next()) != null) { //Don't bother writing the file if there's nothing //to put into it @@ -311,6 +309,7 @@ if (passedEntityNames) { Debug.log("Records written [$curEntityName]: $numberWritten") } } + } if (writer) { writer.println('') writer.close() @@ -322,11 +321,7 @@ if (passedEntityNames) { 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) From c9412087317054025dda9924451809e5a8a36c1b Mon Sep 17 00:00:00 2001 From: Deepak Dixit Date: Tue, 5 May 2026 18:28:36 +0530 Subject: [PATCH 2/3] Only Formatting, no functional change --- .../ofbiz/webtools/entity/XmlDsDump.groovy | 76 +++++++++---------- 1 file changed, 38 insertions(+), 38 deletions(-) diff --git a/framework/webtools/src/main/groovy/org/apache/ofbiz/webtools/entity/XmlDsDump.groovy b/framework/webtools/src/main/groovy/org/apache/ofbiz/webtools/entity/XmlDsDump.groovy index 430db03401a..8097921316f 100644 --- a/framework/webtools/src/main/groovy/org/apache/ofbiz/webtools/entity/XmlDsDump.groovy +++ b/framework/webtools/src/main/groovy/org/apache/ofbiz/webtools/entity/XmlDsDump.groovy @@ -219,15 +219,15 @@ if (passedEntityNames) { curNumberWritten = 0 entityQuery.queryIterator().withCloseable {values -> - while ((value = values.next()) != null) { - value.writeXmlText(writer, '') - numberWritten++ - curNumberWritten++ - if (curNumberWritten % 500 == 0 || curNumberWritten == 1) { - Debug.log("Records written [$curEntityName]: $curNumberWritten Total: $numberWritten") + while ((value = values.next()) != null) { + value.writeXmlText(writer, '') + numberWritten++ + curNumberWritten++ + if (curNumberWritten % 500 == 0 || curNumberWritten == 1) { + Debug.log("Records written [$curEntityName]: $curNumberWritten Total: $numberWritten") + } } } - } Debug.log("Wrote [$curNumberWritten] from entity : $curEntityName") TransactionUtil.commit(beganTransaction) } catch (Exception e) { @@ -274,42 +274,42 @@ if (passedEntityNames) { writer = null fileSplitNumber = 1 entityQuery.queryIterator().withCloseable {values -> - while ((value = values.next()) != null) { - //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++ + while ((value = values.next()) != null) { + //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() + // 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('') - } + // 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 (numberWritten % 500 == 0 || numberWritten == 1) { + Debug.log("Records written [$curEntityName]: $numberWritten") + } } } - } if (writer) { writer.println('') writer.close() From d6f1a3fd5eada5b19b3369117daac848ec36ecfb Mon Sep 17 00:00:00 2001 From: Deepak Dixit Date: Tue, 5 May 2026 18:38:39 +0530 Subject: [PATCH 3/3] Fixed codenarc reported issue --- .../groovy/org/apache/ofbiz/webtools/entity/XmlDsDump.groovy | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/framework/webtools/src/main/groovy/org/apache/ofbiz/webtools/entity/XmlDsDump.groovy b/framework/webtools/src/main/groovy/org/apache/ofbiz/webtools/entity/XmlDsDump.groovy index 8097921316f..861d871c77a 100644 --- a/framework/webtools/src/main/groovy/org/apache/ofbiz/webtools/entity/XmlDsDump.groovy +++ b/framework/webtools/src/main/groovy/org/apache/ofbiz/webtools/entity/XmlDsDump.groovy @@ -218,7 +218,7 @@ if (passedEntityNames) { } curNumberWritten = 0 - entityQuery.queryIterator().withCloseable {values -> + entityQuery.queryIterator().withCloseable { values -> while ((value = values.next()) != null) { value.writeXmlText(writer, '') numberWritten++ @@ -273,7 +273,7 @@ if (passedEntityNames) { isFirst = true writer = null fileSplitNumber = 1 - entityQuery.queryIterator().withCloseable {values -> + entityQuery.queryIterator().withCloseable { values -> while ((value = values.next()) != null) { //Don't bother writing the file if there's nothing //to put into it