public Object createInstance()

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;
    }