in azure-functions-java-sdktypes/src/main/java/com/microsoft/azure/functions/sdktype/blob/BlobClientHydrator.java [19:88]
public Object createInstance(BlobClientMetaData metaData) throws Exception {
LOGGER.info("Starting BlobClientHydrator.createInstance()");
// Gather fields from metaData
String containerName = metaData.getContainerName();
String blobName = metaData.getBlobName();
String envVar = metaData.getConnectionEnvVar();
String configValue = System.getenv(envVar);
if (configValue == null || configValue.isEmpty()) {
throw new SdkHydrationException("No environment variable set for: " + envVar);
}
// Step 1: Reflectively load com.azure.storage.blob.BlobClientBuilder
ClassLoader classLoader = Thread.currentThread().getContextClassLoader();
Class<?> blobBuilderClass = classLoader.loadClass("com.azure.storage.blob.BlobClientBuilder");
Object blobBuilder = blobBuilderClass.getDeclaredConstructor().newInstance();
// Step 2: If configValue is a connection string, do the existing approach
if (isConnectionString(configValue)) {
LOGGER.info("Detected connection string usage from: " + envVar);
Method conn = blobBuilderClass.getMethod("connectionString", String.class);
conn.invoke(blobBuilder, configValue);
Method cont = blobBuilderClass.getMethod("containerName", String.class);
cont.invoke(blobBuilder, containerName);
Method bName = blobBuilderClass.getMethod("blobName", String.class);
bName.invoke(blobBuilder, blobName);
} else {
LOGGER.info("Detected Managed Identity usage with prefix: " + envVar);
// Attempt to load 'accountName', 'serviceUri', 'blobServiceUri', 'clientId' from prefix
final String accountName = System.getenv(envVar + "__accountName");
final String serviceUri = System.getenv(envVar + "__serviceUri");
final String blobServiceUri = System.getenv(envVar + "__blobServiceUri");
final String clientId = System.getenv(envVar + "__clientId");
// Resolve the endpoint
String endpoint = resolveEndpoint(accountName, serviceUri, blobServiceUri);
// Build the credential (DefaultAzureCredential) reflectively
Object credential = buildManagedIdentityCredential(classLoader, clientId);
// Now call builder.credential(...) and builder.endpoint(...)
// NOTE: For this reflection, we need the 'TokenCredential' class
Class<?> tokenCredClass = classLoader.loadClass("com.azure.core.credential.TokenCredential");
Method credentialMethod = blobBuilderClass.getMethod("credential", tokenCredClass);
credentialMethod.invoke(blobBuilder, credential);
Method endpointMethod = blobBuilderClass.getMethod("endpoint", String.class);
endpointMethod.invoke(blobBuilder, endpoint);
// Also set container & blob names
Method cont = blobBuilderClass.getMethod("containerName", String.class);
cont.invoke(blobBuilder, containerName);
Method bName = blobBuilderClass.getMethod("blobName", String.class);
bName.invoke(blobBuilder, blobName);
}
// Step 3: finally build the client
Method buildMethod = blobBuilderClass.getMethod("buildClient");
Object blobClient = buildMethod.invoke(blobBuilder);
LOGGER.info("Successfully created BlobClient instance via reflection.");
return blobClient;
}