Skip to content

Commit

Permalink
Updated interfaceLibName
Browse files Browse the repository at this point in the history
  • Loading branch information
muskan124947 committed Mar 7, 2025
1 parent f018b4b commit b02e976
Show file tree
Hide file tree
Showing 5 changed files with 94 additions and 89 deletions.
Original file line number Diff line number Diff line change
Expand Up @@ -98,6 +98,57 @@ public class SQLServerConnection implements ISQLServerConnection, java.io.Serial
*/
private static final long serialVersionUID = 1965647556064751510L;

static final String INTERFACE_LIB_NAME_TEMPLATE = "%s|%s|%s|%s|%s";
static final String constructedInterfaceLibName;

static {
constructedInterfaceLibName = getInterfaceLibName();
}

static String getInterfaceLibName() {
return String.format(
INTERFACE_LIB_NAME_TEMPLATE,
"MS-JDBC",
getOSType(),
getArchitecture(),
getOSDetails(),
getRuntimeDetails()
);
}

static String getOSType() {
String osName = System.getProperty("os.name", "Unknown").trim();
if (osName.startsWith("Windows")) return "Windows";
if (osName.startsWith("Linux")) return "Linux";
if (osName.startsWith("Mac")) return "macOS";
if (osName.startsWith("FreeBSD")) return "FreeBSD";
if (osName.startsWith("Android")) return "Android";
return "Unknown";
}

static String getArchitecture() {
return sanitizeField(System.getProperty("os.arch", "Unknown").trim(), 10);
}

static String getOSDetails() {
String osName = System.getProperty("os.name", "").trim();
String osVersion = System.getProperty("os.version", "").trim();
if (osName.isEmpty() && osVersion.isEmpty()) return "Unknown";
return sanitizeField(osName + " " + osVersion, 44);
}

static String getRuntimeDetails() {
String javaVmName = System.getProperty("java.vm.name", "").trim();
String javaVmVersion = System.getProperty("java.vm.version", "").trim();
if (javaVmName.isEmpty() && javaVmVersion.isEmpty()) return "Unknown";
return sanitizeField(javaVmName + " " + javaVmVersion, 44);
}

static String sanitizeField(String field, int maxLength) {
String sanitized = field.replaceAll("[^A-Za-z0-9 .+_-]", "").trim();
return sanitized.isEmpty() ? "Unknown" : sanitized.substring(0, Math.min(sanitized.length(), maxLength));
}

/**
* A random netAddress for this process to send during LOGIN7
*/
Expand Down Expand Up @@ -2623,7 +2674,7 @@ Connection connectInternal(Properties propsIn,
if (null != sPropValue)
validateMaxSQLLoginName(sPropKey, sPropValue);
else
activeConnectionProperties.setProperty(sPropKey, SQLServerDriver.constructedAppName);
activeConnectionProperties.setProperty(sPropKey, SQLServerDriver.DEFAULT_APP_NAME);

sPropKey = SQLServerDriverBooleanProperty.LAST_UPDATE_COUNT.toString();
sPropValue = activeConnectionProperties.getProperty(sPropKey);
Expand Down Expand Up @@ -6904,7 +6955,7 @@ final boolean complete(LogonCommand logonCommand, TDSReader tdsReader) throws SQ
String sPwd = activeConnectionProperties.getProperty(SQLServerDriverStringProperty.PASSWORD.toString());
String appName = activeConnectionProperties
.getProperty(SQLServerDriverStringProperty.APPLICATION_NAME.toString());
String interfaceLibName = "Microsoft JDBC Driver " + SQLJdbcVersion.MAJOR + "." + SQLJdbcVersion.MINOR;
String interfaceLibName = constructedInterfaceLibName;
String databaseName = activeConnectionProperties
.getProperty(SQLServerDriverStringProperty.DATABASE_NAME.toString());

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -170,7 +170,7 @@ public void setApplicationName(String applicationName) {
@Override
public String getApplicationName() {
return getStringProperty(connectionProps, SQLServerDriverStringProperty.APPLICATION_NAME.toString(),
SQLServerDriver.constructedAppName);
SQLServerDriverStringProperty.APPLICATION_NAME.getDefaultValue());
}

/**
Expand Down
64 changes: 1 addition & 63 deletions src/main/java/com/microsoft/sqlserver/jdbc/SQLServerDriver.java
Original file line number Diff line number Diff line change
Expand Up @@ -737,63 +737,7 @@ public final class SQLServerDriver implements java.sql.Driver {
+ " for SQL Server";
static final String AUTH_DLL_NAME = "mssql-jdbc_auth-" + SQLJdbcVersion.MAJOR + "." + SQLJdbcVersion.MINOR + "."
+ SQLJdbcVersion.PATCH + "." + Util.getJVMArchOnWindows() + SQLJdbcVersion.RELEASE_EXT;
static final String DEFAULT_APP_NAME = "MS-JDBC|Unknown|Unknown|Unknown|Unknown";
static final String APP_NAME_TEMPLATE = "%s|%s|%s|%s|%s";
static final String constructedAppName;
static {
constructedAppName = getAppName();
}

/**
* Constructs the application name using system properties for OS, platform, and architecture.
* If any of the properties cannot be fetched, it falls back to the default application name.
* Format -> Microsoft JDBC - {OS}, {Platform} - {architecture}
*
* @return the constructed application name or the default application name if properties are not available
*/
static String getAppName() {
return String.format(
APP_NAME_TEMPLATE,
"MS-JDBC",
getOSType(),
getArchitecture(),
getOSDetails(),
getRuntimeDetails()
);
}

static String getOSType() {
String osName = System.getProperty("os.name", "Unknown").trim();
if (osName.startsWith("Windows")) return "Windows";
if (osName.startsWith("Linux")) return "Linux";
if (osName.startsWith("Mac")) return "macOS";
if (osName.startsWith("FreeBSD")) return "FreeBSD";
if (osName.startsWith("Android")) return "Android";
return "Unknown";
}

static String getArchitecture() {
return sanitizeField(System.getProperty("os.arch", "Unknown").trim(), 10);
}

static String getOSDetails() {
String osName = System.getProperty("os.name", "").trim();
String osVersion = System.getProperty("os.version", "").trim();
if (osName.isEmpty() && osVersion.isEmpty()) return "Unknown";
return sanitizeField(osName + " " + osVersion, 44);
}

static String getRuntimeDetails() {
String javaVmName = System.getProperty("java.vm.name", "").trim();
String javaVmVersion = System.getProperty("java.vm.version", "").trim();
if (javaVmName.isEmpty() && javaVmVersion.isEmpty()) return "Unknown";
return sanitizeField(javaVmName + " " + javaVmVersion, 44);
}

static String sanitizeField(String field, int maxLength) {
String sanitized = field.replaceAll("[^A-Za-z0-9 .+_-]", "").trim();
return sanitized.isEmpty() ? "Unknown" : sanitized.substring(0, Math.min(sanitized.length(), maxLength));
}
static final String DEFAULT_APP_NAME = "Microsoft JDBC Driver for SQL Server";

private static final String[] TRUE_FALSE = {"true", "false"};

Expand Down Expand Up @@ -1104,9 +1048,6 @@ String getClassNameLogging() {
drLogger.finer("Error registering driver: " + e);
}
}
if (loggerExternal.isLoggable(Level.FINE)) {
loggerExternal.log(Level.FINE, "Application Name: " + SQLServerDriver.constructedAppName);
}
}

// Check for jdk.net.ExtendedSocketOptions to set TCP keep-alive options for idle connection resiliency
Expand Down Expand Up @@ -1345,9 +1286,6 @@ public java.sql.Connection connect(String url, Properties suppliedProperties) th
Properties connectProperties = parseAndMergeProperties(url, suppliedProperties);
if (connectProperties != null) {
result = DriverJDBCVersion.getSQLServerConnection(toString());
if (connectProperties.getProperty(SQLServerDriverStringProperty.APPLICATION_NAME.toString()) == null) {
connectProperties.setProperty(SQLServerDriverStringProperty.APPLICATION_NAME.toString(), SQLServerDriver.constructedAppName);
}
result.connect(connectProperties, null);
}
loggerExternal.exiting(getClassNameLogging(), "connect", result);
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -5,6 +5,7 @@
package com.microsoft.sqlserver.jdbc;

import static org.junit.jupiter.api.Assertions.assertEquals;
import static org.junit.jupiter.api.Assertions.assertFalse;
import static org.junit.jupiter.api.Assertions.assertNotNull;
import static org.junit.jupiter.api.Assertions.assertThrows;
import static org.junit.jupiter.api.Assertions.assertTrue;
Expand Down Expand Up @@ -1402,4 +1403,40 @@ public void testManagedIdentityWithEncryptStrict() {
}
}

/*
* Test to verify the interface library name constructed by the driver
* Expected format: MS-JDBC|<OS>|<Architecture>|<OS Details>|<Runtime Details>
* Example: MS-JDBC|Windows|amd64|Windows 11 10.0|OpenJDK 64-Bit Server VM 21.0.5+11-LTS
*/
@Test
public void testInterfaceLibName() {
String expectedLibName = String.format(
"%s|%s|%s|%s|%s",
"MS-JDBC",
SQLServerConnection.getOSType(),
SQLServerConnection.getArchitecture(),
SQLServerConnection.getOSDetails(),
SQLServerConnection.getRuntimeDetails()
);
assertEquals(expectedLibName, SQLServerConnection.constructedInterfaceLibName);
}

/**
* test application name when system properties are empty
*
*/
@Test
public void testGetAppName() {
String interfaceLibName = SQLServerConnection.getInterfaceLibName();
assertNotNull(interfaceLibName, "Interface lib name should not be null");
assertFalse(interfaceLibName.isEmpty(), "Iterface lib name should not be empty");

System.setProperty("os.name", "");
System.setProperty("os.arch", "");
System.setProperty("os.version", "");
System.setProperty("java.vm.name", "");
System.setProperty("java.vm.version", "");
String defaultAppName = SQLServerConnection.getInterfaceLibName();
assertEquals("MS-JDBC|Unknown|Unknown|Unknown|Unknown", defaultAppName);
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -2,8 +2,6 @@

import static org.junit.Assert.fail;
import static org.junit.jupiter.api.Assertions.assertEquals;
import static org.junit.jupiter.api.Assertions.assertFalse;
import static org.junit.jupiter.api.Assertions.assertNotNull;
import static org.junit.jupiter.api.Assertions.assertTrue;

import java.sql.Connection;
Expand Down Expand Up @@ -204,7 +202,7 @@ public void testApplicationName() throws SQLException {
Statement stmt = conn.createStatement();
ResultSet rs = stmt.executeQuery("SELECT program_name FROM sys.dm_exec_sessions WHERE session_id = @@SPID")) {
if (rs.next()) {
assertEquals(SQLServerDriver.constructedAppName, rs.getString("program_name"));
assertEquals(SQLServerDriverStringProperty.APPLICATION_NAME.getDefaultValue(), rs.getString("program_name"));
}
} catch (SQLException e) {
fail(e.getMessage());
Expand All @@ -222,7 +220,7 @@ public void testApplicationNameUsingApp_Name() throws SQLException {
Statement stmt = conn.createStatement();
ResultSet rs = stmt.executeQuery("SELECT app_name()")) {
if (rs.next()) {
assertEquals(SQLServerDriver.constructedAppName, rs.getString(1));
assertEquals(SQLServerDriverStringProperty.APPLICATION_NAME.getDefaultValue(), rs.getString(1));
}
} catch (SQLException e) {
fail(e.getMessage());
Expand All @@ -248,23 +246,4 @@ public void testAppNameWithSpecifiedApplicationName() throws SQLException {
fail(e.getMessage());
}
}

/**
* test application name when system properties are empty
*
*/
@Test
public void testGetAppName() {
String appName = SQLServerDriver.getAppName();
assertNotNull(appName, "Application name should not be null");
assertFalse(appName.isEmpty(), "Application name should not be empty");

System.setProperty("os.name", "");
System.setProperty("os.arch", "");
System.setProperty("os.version", "");
System.setProperty("java.vm.name", "");
System.setProperty("java.vm.version", "");
String defaultAppName = SQLServerDriver.getAppName();
assertEquals(SQLServerDriver.DEFAULT_APP_NAME, defaultAppName, "Application name should be the default one");
}
}

0 comments on commit b02e976

Please sign in to comment.