changeset 904:2d880f90be2a

Try to use reasonable defaults for ClientInfo
author Joeri van Ruth <joeri.van.ruth@monetdbsolutions.com>
date Fri, 14 Jun 2024 16:50:27 +0200 (9 months ago)
parents 778959b2e0a4
children a52bc2dcdb8c
files src/main/java/org/monetdb/mcl/net/ClientInfo.java src/main/java/org/monetdb/mcl/net/MapiSocket.java
diffstat 2 files changed, 49 insertions(+), 8 deletions(-) [+]
line wrap: on
line diff
--- a/src/main/java/org/monetdb/mcl/net/ClientInfo.java
+++ b/src/main/java/org/monetdb/mcl/net/ClientInfo.java
@@ -2,6 +2,11 @@ package org.monetdb.mcl.net;
 
 import org.monetdb.jdbc.MonetDriver;
 
+import java.io.File;
+import java.lang.management.ManagementFactory;
+import java.lang.management.RuntimeMXBean;
+import java.net.InetAddress;
+import java.net.UnknownHostException;
 import java.sql.ClientInfoStatus;
 import java.sql.SQLClientInfoException;
 import java.util.Collections;
@@ -13,7 +18,9 @@ public class ClientInfo {
 
 	private static final String defaultClientLibrary = findClientLibrary();
 
-	private static final int defaultPid = findPid();
+	private static final String defaultApplicationName = findApplicationName();
+
+	private static final String defaultPid = findPid();
 
 	private final Properties props;
 
@@ -21,17 +28,47 @@ public class ClientInfo {
 		props = new Properties();
 		props.setProperty("ClientHostname", defaultHostname);
 		props.setProperty("ClientLibrary", defaultClientLibrary);
-		props.setProperty("ClientPid", "" + defaultPid);
-		props.setProperty("ApplicationName", "");
+		props.setProperty("ClientPid", defaultPid);
+		props.setProperty("ApplicationName", defaultApplicationName);
 		props.setProperty("ClientRemark", "");
 	}
 
 	private static String findHostname() {
-		return "my host";
+		try {
+			return InetAddress.getLocalHost().getHostName();
+		} catch (UnknownHostException e) {
+			return "";
+		}
 	}
 
-	private static int findPid() {
-		return 42;
+	private static String findApplicationName() {
+		String appName = "";
+		try {
+			String prop = System.getProperty("sun.java.command");
+			if (prop != null) {
+				// we want only the command, and not the arguments
+				prop = prop.split("\\s", 2)[0];
+				// keep only the basename5
+				int idx = prop.lastIndexOf(File.separatorChar);
+				if (idx >= 0)
+					prop = prop.substring(idx + 1);
+				appName = prop;
+			}
+		} catch (SecurityException e) {
+			// ignore
+		}
+
+		return appName;
+	}
+
+	private static String findPid() {
+		try {
+			RuntimeMXBean mxbean = ManagementFactory.getRuntimeMXBean();
+			String pidAtHostname = mxbean.getName();
+			return pidAtHostname.split("@", 2)[0];
+		} catch (RuntimeException e) {
+			return "";
+		}
 	}
 
 	private static String findClientLibrary() {
--- a/src/main/java/org/monetdb/mcl/net/MapiSocket.java
+++ b/src/main/java/org/monetdb/mcl/net/MapiSocket.java
@@ -502,8 +502,12 @@ public final class MapiSocket {
 		if (parts.length > 9 && target.isClientInfo()) {
 			clientInfo = new ClientInfo();
 			try {
-				clientInfo.set("ApplicationName", target.getClientApplication());
-				clientInfo.set("ClientRemark", target.getClientRemark());
+				String clientApplication = target.getClientApplication();
+				String clientRemark = target.getClientRemark();
+				if (!clientApplication.isEmpty())
+					clientInfo.set("ApplicationName", clientApplication);
+				if (!clientRemark.isEmpty())
+					clientInfo.set("ClientRemark", clientRemark);
 			} catch (SQLClientInfoException e) {
 				String keys = String.join(", ", e.getFailedProperties().keySet());
 				throw new MCLException("Could not set ClientInfo properties: " + keys, e);