Repository: nifi Updated Branches: refs/heads/master da99f873a -> 275b8cbf2
NIFI-5308: Avoid holding Template DOM Nodes in heap. This closes #2790 Project: http://git-wip-us.apache.org/repos/asf/nifi/repo Commit: http://git-wip-us.apache.org/repos/asf/nifi/commit/275b8cbf Tree: http://git-wip-us.apache.org/repos/asf/nifi/tree/275b8cbf Diff: http://git-wip-us.apache.org/repos/asf/nifi/diff/275b8cbf Branch: refs/heads/master Commit: 275b8cbf231f2c41aa2d79d69d8abf6dbaabd278 Parents: da99f87 Author: Mark Payne <marka...@hotmail.com> Authored: Wed Jun 13 15:37:02 2018 -0400 Committer: Matt Gilman <matt.c.gil...@gmail.com> Committed: Wed Jun 13 16:00:01 2018 -0400 ---------------------------------------------------------------------- .../serialization/StandardFlowSerializer.java | 32 ++++++-------------- 1 file changed, 9 insertions(+), 23 deletions(-) ---------------------------------------------------------------------- http://git-wip-us.apache.org/repos/asf/nifi/blob/275b8cbf/nifi-nar-bundles/nifi-framework-bundle/nifi-framework/nifi-framework-core/src/main/java/org/apache/nifi/controller/serialization/StandardFlowSerializer.java ---------------------------------------------------------------------- diff --git a/nifi-nar-bundles/nifi-framework-bundle/nifi-framework/nifi-framework-core/src/main/java/org/apache/nifi/controller/serialization/StandardFlowSerializer.java b/nifi-nar-bundles/nifi-framework-bundle/nifi-framework/nifi-framework-core/src/main/java/org/apache/nifi/controller/serialization/StandardFlowSerializer.java index e2676a7..c3d0c1f 100644 --- a/nifi-nar-bundles/nifi-framework-bundle/nifi-framework/nifi-framework-core/src/main/java/org/apache/nifi/controller/serialization/StandardFlowSerializer.java +++ b/nifi-nar-bundles/nifi-framework-bundle/nifi-framework/nifi-framework-core/src/main/java/org/apache/nifi/controller/serialization/StandardFlowSerializer.java @@ -22,7 +22,6 @@ import java.io.InputStream; import java.io.OutputStream; import java.util.Map; import java.util.Optional; -import java.util.WeakHashMap; import java.util.concurrent.TimeUnit; import javax.xml.parsers.DocumentBuilder; @@ -82,12 +81,6 @@ public class StandardFlowSerializer implements FlowSerializer<Document> { private final StringEncryptor encryptor; - // Cache of template to DOM Node for that template. This is done because when we serialize templates, we have to first - // take the template DTO, then serialize that into a byte[], then parse that byte[] as XML DOM objects. Then we can use that - // XML DOM Object in the serialized flow. This is expensive, so we cache these XML DOM objects here. We use a WeakHashMap - // because we don't get notified when the template has been removed from the system. - private static final Map<Template, Node> templateNodes = new WeakHashMap<>(); - public StandardFlowSerializer(final StringEncryptor encryptor) { this.encryptor = encryptor; } @@ -625,25 +618,18 @@ public class StandardFlowSerializer implements FlowSerializer<Document> { element.appendChild(toAdd); } - - public static synchronized void addTemplate(final Element element, final Template template) { + public static void addTemplate(final Element element, final Template template) { try { - Node templateNode = templateNodes.get(template); - if (templateNode == null) { - final byte[] serialized = TemplateSerializer.serialize(template.getDetails()); - - final DocumentBuilderFactory docBuilderFactory = DocumentBuilderFactory.newInstance(); - final DocumentBuilder docBuilder = docBuilderFactory.newDocumentBuilder(); - final Document document; - try (final InputStream in = new ByteArrayInputStream(serialized)) { - document = docBuilder.parse(in); - } - - templateNode = document.getDocumentElement(); - templateNodes.put(template, templateNode); + final byte[] serialized = TemplateSerializer.serialize(template.getDetails()); + + final DocumentBuilderFactory docBuilderFactory = DocumentBuilderFactory.newInstance(); + final DocumentBuilder docBuilder = docBuilderFactory.newDocumentBuilder(); + final Document document; + try (final InputStream in = new ByteArrayInputStream(serialized)) { + document = docBuilder.parse(in); } - templateNode = element.getOwnerDocument().importNode(templateNode, true); + final Node templateNode = element.getOwnerDocument().importNode(document.getDocumentElement(), true); element.appendChild(templateNode); } catch (final Exception e) { throw new FlowSerializationException(e);