Date: Fri, 9 Jun 2023 10:18:10 +0800
Subject: Cache dom in xml transform

---
 .../xalan/internal/xsltc/trax/TransformerImpl.java   | 12 +++++++++++-
 1 file changed, 11 insertions(+), 1 deletion(-)

diff --git a/jaxp/src/com/sun/org/apache/xalan/internal/xsltc/trax/TransformerImpl.java b/jaxp/src/com/sun/org/apache/xalan/internal/xsltc/trax/TransformerImpl.java
index 8e783cee0..3d143d461 100644
--- a/jaxp/src/com/sun/org/apache/xalan/internal/xsltc/trax/TransformerImpl.java
+++ b/jaxp/src/com/sun/org/apache/xalan/internal/xsltc/trax/TransformerImpl.java
@@ -56,6 +56,7 @@ import java.util.ArrayList;
 import java.util.Enumeration;
 import java.util.HashMap;
 import java.util.Map;
+import java.util.concurrent.ConcurrentHashMap;
 import java.util.Properties;
 import java.util.StringTokenizer;
 import javax.xml.XMLConstants;
@@ -151,6 +152,11 @@ public final class TransformerImpl extends Transformer
      */
     private DOM _dom = null;
 
+    /**
+     * A hashMap for DOMS.
+     */
+    private ConcurrentHashMap<String, DOM> _domMaps = new ConcurrentHashMap();
+
     /**
      * Number of indent spaces to add when indentation is on.
      */
@@ -530,8 +536,11 @@ public final class TransformerImpl extends Transformer
     private DOM getDOM(Source source) throws TransformerException {
         try {
             DOM dom;
-
             if (source != null) {
+                String ssId = source.getSystemId();
+                if ((ssId != null) && (_domMaps.containsKey(ssId))) {
+                   return _domMaps.get(ssId);
+                }
                 DTMWSFilter wsfilter;
                 if (_translet != null && _translet instanceof StripFilter) {
                     wsfilter = new DOMWSFilter(_translet);
@@ -549,6 +558,7 @@ public final class TransformerImpl extends Transformer
                  }
                  dom = (DOM)_dtmManager.getDTM(source, false, wsfilter, true,
                                               false, false, 0, hasIdCall);
+                 if ((ssId != null) && (dom != null)) _domMaps.put(ssId, dom);
             } else if (_dom != null) {
                  dom = _dom;
                  _dom = null;  // use only once, so reset to 'null'
-- 
2.22.0

