SLING-7947 Play ping-pong with clam daemon after configuration of ClamdService
diff --git a/src/main/java/org/apache/sling/commons/clam/internal/ClamdService.java b/src/main/java/org/apache/sling/commons/clam/internal/ClamdService.java
index ef23eb8..581dc0d 100644
--- a/src/main/java/org/apache/sling/commons/clam/internal/ClamdService.java
+++ b/src/main/java/org/apache/sling/commons/clam/internal/ClamdService.java
@@ -25,6 +25,7 @@
 import java.net.Socket;
 import java.nio.ByteBuffer;
 import java.nio.charset.StandardCharsets;
+import java.util.Arrays;
 
 import org.apache.commons.io.IOUtils;
 import org.apache.sling.commons.clam.ClamService;
@@ -53,6 +54,10 @@
 
     private ClamdServiceConfiguration configuration;
 
+    private static final byte[] PING_COMMAND = "nPING\n".getBytes(StandardCharsets.US_ASCII);
+
+    private static final byte[] PONG_REPLY = "PONG\n".getBytes(StandardCharsets.US_ASCII);
+
     private static final byte[] INSTREAM_COMMAND = "nINSTREAM\n".getBytes(StandardCharsets.US_ASCII);
 
     private static final String OK_REPLY_PATTERN = "stream: OK";
@@ -85,7 +90,7 @@
 
     private void configure(final ClamdServiceConfiguration configuration) {
         this.configuration = configuration;
-        // TODO play ping pong on configuration change
+        playPingPong();
     }
 
     @Override
@@ -100,6 +105,36 @@
         }
     }
 
+    private byte[] doPing() throws IOException {
+        logger.info("pinging clam daemon at {}:{}", configuration.clamd_host(), configuration.clamd_port());
+        try (final Socket socket = new Socket(configuration.clamd_host(), configuration.clamd_port());
+             final OutputStream out = new BufferedOutputStream(socket.getOutputStream());
+             final InputStream in = socket.getInputStream()) {
+
+            socket.setSoTimeout(configuration.connection_timeout());
+
+            // send command
+            out.write(PING_COMMAND);
+            out.flush();
+
+            return IOUtils.toByteArray(in);
+        }
+    }
+
+    private void playPingPong() {
+        try {
+            final byte[] reply = doPing();
+            if (Arrays.equals(reply, PONG_REPLY)) {
+                logger.info("clam daemon replied with PONG");
+            } else {
+                final String message = new String(reply, StandardCharsets.US_ASCII);
+                logger.error("clam daemon replied with unknown message: {}", message);
+            }
+        } catch (IOException e) {
+            logger.error("pinging clam daemon failed: {}", e.getMessage());
+        }
+    }
+
     /**
      * man (8) clamd
      * INSTREAM