This is an automated email from the ASF dual-hosted git repository.

smolnar pushed a commit to branch master
in repository https://gitbox.apache.org/repos/asf/knox.git


The following commit(s) were added to refs/heads/master by this push:
     new 1018a3b29 KNOX-3030 - Make TopologyUtils.parse thread safe (#901)
1018a3b29 is described below

commit 1018a3b29ca716b9fbdc5870b132238a9dcc7e91
Author: Sandor Molnar <[email protected]>
AuthorDate: Mon Apr 22 20:10:43 2024 +0200

    KNOX-3030 - Make TopologyUtils.parse thread safe (#901)
    
    Besides this, Knox logs the faulty generated content when it's about to be 
peristed on the disk.
---
 .../services/topology/impl/DefaultTopologyService.java  | 17 +++++++----------
 .../org/apache/knox/gateway/util/TopologyUtils.java     |  4 ++--
 .../knox/gateway/services/topology/TopologyService.java |  3 +--
 .../topology/simple/SimpleDescriptorHandler.java        | 10 ++++++----
 .../topology/simple/SimpleDescriptorMessages.java       |  4 ++++
 5 files changed, 20 insertions(+), 18 deletions(-)

diff --git 
a/gateway-server/src/main/java/org/apache/knox/gateway/services/topology/impl/DefaultTopologyService.java
 
b/gateway-server/src/main/java/org/apache/knox/gateway/services/topology/impl/DefaultTopologyService.java
index 37640bbc8..07e0ee071 100644
--- 
a/gateway-server/src/main/java/org/apache/knox/gateway/services/topology/impl/DefaultTopologyService.java
+++ 
b/gateway-server/src/main/java/org/apache/knox/gateway/services/topology/impl/DefaultTopologyService.java
@@ -69,7 +69,6 @@ import javax.xml.bind.Marshaller;
 import java.io.File;
 import java.io.FileFilter;
 import java.io.IOException;
-import java.io.InputStream;
 import java.nio.charset.StandardCharsets;
 import java.util.ArrayList;
 import java.util.Arrays;
@@ -149,19 +148,17 @@ public class DefaultTopologyService extends 
FileAlterationListenerAdaptor implem
   }
 
   @Override
-  public Topology parse(final InputStream content) throws IOException, 
SAXException {
+  public Topology parse(final String content) throws IOException, SAXException 
{
     return TopologyUtils.parse(content);
   }
 
   private Topology loadTopologyAttempt(File file) throws IOException, 
SAXException {
-    Topology topology;
-    try (InputStream in = FileUtils.openInputStream(file)) {
-      topology = parse(in);
-      if (topology != null) {
-        topology.setUri(file.toURI());
-        topology.setName(FilenameUtils.removeExtension(file.getName()));
-        topology.setTimestamp(file.lastModified());
-      }
+    final String topologyContent = FileUtils.readFileToString(file, 
StandardCharsets.UTF_8);
+    final Topology topology = parse(topologyContent);
+    if (topology != null) {
+      topology.setUri(file.toURI());
+      topology.setName(FilenameUtils.removeExtension(file.getName()));
+      topology.setTimestamp(file.lastModified());
     }
     return topology;
   }
diff --git 
a/gateway-server/src/main/java/org/apache/knox/gateway/util/TopologyUtils.java 
b/gateway-server/src/main/java/org/apache/knox/gateway/util/TopologyUtils.java
index 08a3f7904..afbac8115 100644
--- 
a/gateway-server/src/main/java/org/apache/knox/gateway/util/TopologyUtils.java
+++ 
b/gateway-server/src/main/java/org/apache/knox/gateway/util/TopologyUtils.java
@@ -35,7 +35,7 @@ public final class TopologyUtils {
                                                                  new 
AmbariFormatXmlTopologyRules());
 
 
-  public static Topology parse(final String content) throws IOException, 
SAXException {
+  public static synchronized Topology parse(final String content) throws 
IOException, SAXException {
     Topology result;
 
     TopologyBuilder builder = digesterLoader.newDigester().parse(new 
StringReader(content));
@@ -44,7 +44,7 @@ public final class TopologyUtils {
     return result;
   }
 
-  public static Topology parse(final InputStream content) throws IOException, 
SAXException {
+  public static synchronized Topology parse(final InputStream content) throws 
IOException, SAXException {
     Topology result;
 
     TopologyBuilder builder = digesterLoader.newDigester().parse(content);
diff --git 
a/gateway-spi/src/main/java/org/apache/knox/gateway/services/topology/TopologyService.java
 
b/gateway-spi/src/main/java/org/apache/knox/gateway/services/topology/TopologyService.java
index 8fa65e47c..cfc7f7a13 100644
--- 
a/gateway-spi/src/main/java/org/apache/knox/gateway/services/topology/TopologyService.java
+++ 
b/gateway-spi/src/main/java/org/apache/knox/gateway/services/topology/TopologyService.java
@@ -26,7 +26,6 @@ import org.xml.sax.SAXException;
 
 import java.io.File;
 import java.io.IOException;
-import java.io.InputStream;
 import java.util.Collection;
 import java.util.List;
 import java.util.Map;
@@ -78,6 +77,6 @@ public interface TopologyService extends Service, 
ServiceDefinitionChangeListene
    * @throws IOException Exception thrown parsing input stream.
    * @throws SAXException Exception thrown parsing xml.
    */
-  Topology parse(InputStream content) throws IOException, SAXException;
+  Topology parse(String content) throws IOException, SAXException;
 
 }
diff --git 
a/gateway-topology-simple/src/main/java/org/apache/knox/gateway/topology/simple/SimpleDescriptorHandler.java
 
b/gateway-topology-simple/src/main/java/org/apache/knox/gateway/topology/simple/SimpleDescriptorHandler.java
index b5419f55e..b3a735e7a 100644
--- 
a/gateway-topology-simple/src/main/java/org/apache/knox/gateway/topology/simple/SimpleDescriptorHandler.java
+++ 
b/gateway-topology-simple/src/main/java/org/apache/knox/gateway/topology/simple/SimpleDescriptorHandler.java
@@ -31,12 +31,11 @@ import org.apache.knox.gateway.topology.Topology;
 import 
org.apache.knox.gateway.topology.discovery.DefaultServiceDiscoveryConfig;
 import org.apache.knox.gateway.topology.discovery.ServiceDiscovery;
 import org.apache.knox.gateway.topology.discovery.ServiceDiscoveryFactory;
+import org.xml.sax.SAXParseException;
 
 import java.io.BufferedWriter;
-import java.io.ByteArrayInputStream;
 import java.io.File;
 import java.io.IOException;
-import java.io.InputStream;
 import java.io.OutputStream;
 import java.io.OutputStreamWriter;
 import java.io.StringWriter;
@@ -677,11 +676,14 @@ public class SimpleDescriptorHandler {
             }
 
             if (existing != null) {
-                try (InputStream in = new 
ByteArrayInputStream(generatedContent.getBytes(StandardCharsets.UTF_8))) {
-                    Topology generatedTopology = topologyService.parse(in);
+                try {
+                    Topology generatedTopology = 
topologyService.parse(generatedContent);
                     generatedTopology.setName(topologyName);
                     // If the generated topology is different from the 
existing, then it should be persisted
                     result = !existing.equals(generatedTopology);
+                } catch (SAXParseException e) {
+                    log.errorComparingGeneratedTopology(topologyName, e);
+                    log.faultyGeneratedContent(generatedContent);
                 } catch (Exception e) {
                     log.errorComparingGeneratedTopology(topologyName, e);
                 }
diff --git 
a/gateway-topology-simple/src/main/java/org/apache/knox/gateway/topology/simple/SimpleDescriptorMessages.java
 
b/gateway-topology-simple/src/main/java/org/apache/knox/gateway/topology/simple/SimpleDescriptorMessages.java
index f10b12a81..f5d177229 100644
--- 
a/gateway-topology-simple/src/main/java/org/apache/knox/gateway/topology/simple/SimpleDescriptorMessages.java
+++ 
b/gateway-topology-simple/src/main/java/org/apache/knox/gateway/topology/simple/SimpleDescriptorMessages.java
@@ -70,6 +70,10 @@ public interface SimpleDescriptorMessages {
     void errorComparingGeneratedTopology(String topologyName,
                                          @StackTrace( level = 
MessageLevel.DEBUG) Exception e);
 
+    @Message(level = MessageLevel.ERROR,
+        text = "Faulty generated content: {0}" )
+    void faultyGeneratedContent(String generatedContent);
+
     @Message(level = MessageLevel.INFO,
             text = "Persisting the generated {0} topology because it either 
does not exist or it has changed." )
     void persistingGeneratedTopology(String topologyName);

Reply via email to