Skip to content
Merged
Show file tree
Hide file tree
Changes from 8 commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
1 change: 1 addition & 0 deletions sdk/formrecognizer/azure-ai-formrecognizer/CHANGELOG.md
Original file line number Diff line number Diff line change
Expand Up @@ -19,6 +19,7 @@
- Rename parameter `useLabelFile` to `useTrainingLabels` on `beginTraining` method in FormTrainingClients
- Replace parameters `filePrefix` and `includeSubFolders` with `TrainingFileFilter` model
- Rename AccountProperties `count` and `limit` to `customModelCount` and `customModelLimit`
- Added support for AAD Authentication.
Comment thread
mssfang marked this conversation as resolved.

## 1.0.0-beta.2 (2020-05-06)
- Fixed Receipt type bug to select the valueString field via fieldValue.
Expand Down
117 changes: 83 additions & 34 deletions sdk/formrecognizer/azure-ai-formrecognizer/README.md

Large diffs are not rendered by default.

6 changes: 6 additions & 0 deletions sdk/formrecognizer/azure-ai-formrecognizer/pom.xml
Original file line number Diff line number Diff line change
Expand Up @@ -75,5 +75,11 @@
<version>5.6.2</version> <!-- {x-version-update;org.junit.jupiter:junit-jupiter-params;external_dependency} -->
<scope>test</scope>
</dependency>
<dependency>
<groupId>com.azure</groupId>
<artifactId>azure-identity</artifactId>
<version>1.0.6</version> <!-- {x-version-update;com.azure:azure-identity;dependency} -->
<scope>test</scope>
</dependency>
</dependencies>
</project>
Original file line number Diff line number Diff line change
Expand Up @@ -7,6 +7,7 @@
import com.azure.ai.formrecognizer.implementation.FormRecognizerClientImplBuilder;
import com.azure.core.annotation.ServiceClientBuilder;
import com.azure.core.credential.AzureKeyCredential;
import com.azure.core.credential.TokenCredential;
import com.azure.core.http.ContentType;
import com.azure.core.http.HttpClient;
import com.azure.core.http.HttpHeaders;
Expand All @@ -15,6 +16,7 @@
import com.azure.core.http.policy.AddDatePolicy;
import com.azure.core.http.policy.AddHeadersPolicy;
import com.azure.core.http.policy.AzureKeyCredentialPolicy;
import com.azure.core.http.policy.BearerTokenAuthenticationPolicy;
import com.azure.core.http.policy.HttpLogDetailLevel;
import com.azure.core.http.policy.HttpLogOptions;
import com.azure.core.http.policy.HttpLoggingPolicy;
Expand Down Expand Up @@ -43,7 +45,8 @@
*
* <p>
* The client needs the service endpoint of the Azure Form Recognizer to access the resource service.
* {@link #credential(AzureKeyCredential)} gives the builder access credential.
* {@link #credential(AzureKeyCredential)} or {@link #credential(TokenCredential) credential(TokenCredential)} gives
* the builder access credential.
* </p>
*
* <p><strong>Instantiating an asynchronous Form Recognizer Client</strong></p>
Expand Down Expand Up @@ -77,6 +80,7 @@ public final class FormRecognizerClientBuilder {
private static final String NAME = "name";
private static final String VERSION = "version";
private static final RetryPolicy DEFAULT_RETRY_POLICY = new RetryPolicy("retry-after-ms", ChronoUnit.MILLIS);
private static final String DEFAULT_SCOPE = "https://cognitiveservices.azure.com/.default";

private final ClientLogger logger = new ClientLogger(FormRecognizerClientBuilder.class);
private final List<HttpPipelinePolicy> policies;
Expand All @@ -91,6 +95,7 @@ public final class FormRecognizerClientBuilder {
private HttpPipeline httpPipeline;
private Configuration configuration;
private RetryPolicy retryPolicy;
private TokenCredential tokenCredential;
private FormRecognizerServiceVersion version;

static final String OCP_APIM_SUBSCRIPTION_KEY = "Ocp-Apim-Subscription-Key";
Expand Down Expand Up @@ -182,7 +187,9 @@ private HttpPipeline getDefaultHttpPipeline(Configuration buildConfiguration) {
policies.add(retryPolicy == null ? DEFAULT_RETRY_POLICY : retryPolicy);
policies.add(new AddDatePolicy());
// Authentications
if (credential != null) {
if (tokenCredential != null) {
policies.add(new BearerTokenAuthenticationPolicy(tokenCredential, DEFAULT_SCOPE));
} else if (credential != null) {
policies.add(new AzureKeyCredentialPolicy(OCP_APIM_SUBSCRIPTION_KEY, credential));
} else {
// Throw exception that credential and tokenCredential cannot be null
Expand Down Expand Up @@ -241,6 +248,18 @@ public FormRecognizerClientBuilder credential(AzureKeyCredential apiKeyCredentia
return this;
}

/**
* Sets the {@link TokenCredential} used to authenticate HTTP requests.
*
* @param tokenCredential {@link TokenCredential} used to authenticate HTTP requests.
* @return The updated {@link FormRecognizerClientBuilder} object.
* @throws NullPointerException If {@code tokenCredential} is null.
*/
public FormRecognizerClientBuilder credential(TokenCredential tokenCredential) {
this.tokenCredential = Objects.requireNonNull(tokenCredential, "'tokenCredential' cannot be null.");
return this;
}

/**
* Sets the logging configuration for HTTP requests and responses.
*
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -8,6 +8,7 @@
import com.azure.ai.formrecognizer.implementation.FormRecognizerClientImplBuilder;
import com.azure.core.annotation.ServiceClientBuilder;
import com.azure.core.credential.AzureKeyCredential;
import com.azure.core.credential.TokenCredential;
import com.azure.core.http.ContentType;
import com.azure.core.http.HttpClient;
import com.azure.core.http.HttpHeaders;
Expand Down Expand Up @@ -43,7 +44,8 @@
*
* <p>
* The client needs the service endpoint of the Azure Form Recognizer to access the resource service.
* {@link #credential(AzureKeyCredential)} gives the builder access credential.
* {@link #credential(AzureKeyCredential)} or {@link #credential(TokenCredential) credential(TokenCredential)} gives
* the builder access credential.
* </p>
*
* <p><strong>Instantiating an asynchronous Form Training Client</strong></p>
Expand Down Expand Up @@ -91,6 +93,7 @@ public final class FormTrainingClientBuilder {
private HttpPipeline httpPipeline;
private Configuration configuration;
private RetryPolicy retryPolicy;
private TokenCredential tokenCredential;
private FormRecognizerServiceVersion version;

static final String OCP_APIM_SUBSCRIPTION_KEY = "Ocp-Apim-Subscription-Key";
Expand Down Expand Up @@ -242,6 +245,18 @@ public FormTrainingClientBuilder credential(AzureKeyCredential apiKeyCredential)
return this;
}

Comment thread
mssfang marked this conversation as resolved.
/**
* Sets the {@link TokenCredential} used to authenticate HTTP requests.
*
* @param tokenCredential {@link TokenCredential} used to authenticate HTTP requests.
* @return The updated {@link FormTrainingClientBuilder} object.
* @throws NullPointerException If {@code tokenCredential} is null.
*/
public FormTrainingClientBuilder credential(TokenCredential tokenCredential) {
this.tokenCredential = Objects.requireNonNull(tokenCredential, "'tokenCredential' cannot be null.");
return this;
}

/**
* Sets the logging configuration for HTTP requests and responses.
*
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -15,8 +15,10 @@
import com.azure.ai.formrecognizer.training.FormTrainingClient;
import com.azure.ai.formrecognizer.training.FormTrainingClientBuilder;
import com.azure.core.credential.AzureKeyCredential;
import com.azure.core.credential.TokenCredential;
import com.azure.core.http.rest.PagedIterable;
import com.azure.core.util.polling.SyncPoller;
import com.azure.identity.DefaultAzureCredentialBuilder;

import java.util.List;
import java.util.concurrent.atomic.AtomicReference;
Expand All @@ -42,6 +44,17 @@ public void useAzureKeyCredentialSyncClient() {
.buildClient();
}

/**
* Code snippet for getting async client using AAD authentication.
*/
public void useAadAsyncClient() {
TokenCredential credential = new DefaultAzureCredentialBuilder().build();
FormRecognizerClient formRecognizerClient = new FormRecognizerClientBuilder()
.endpoint("{endpoint}")
.credential(credential)
.buildClient();
}

/**
* Code snippet for rotating AzureKeyCredential of the client
*/
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -11,12 +11,7 @@
import com.azure.ai.formrecognizer.models.RecognizedForm;
import com.azure.ai.formrecognizer.models.RecognizedReceipt;
import com.azure.ai.formrecognizer.training.FormTrainingAsyncClient;
import com.azure.ai.formrecognizer.training.FormTrainingClientBuilder;
import com.azure.core.credential.AzureKeyCredential;
import com.azure.core.http.HttpClient;
import com.azure.core.http.policy.HttpLogDetailLevel;
import com.azure.core.http.policy.HttpLogOptions;
import com.azure.core.test.TestMode;
import com.azure.core.util.polling.SyncPoller;
import org.junit.jupiter.api.AfterAll;
import org.junit.jupiter.api.BeforeAll;
Expand All @@ -30,7 +25,6 @@
import static com.azure.ai.formrecognizer.TestUtils.CUSTOM_FORM_FILE_LENGTH;
import static com.azure.ai.formrecognizer.TestUtils.DISPLAY_NAME_WITH_ARGUMENTS;
import static com.azure.ai.formrecognizer.TestUtils.FORM_LOCAL_URL;
import static com.azure.ai.formrecognizer.TestUtils.INVALID_KEY;
import static com.azure.ai.formrecognizer.TestUtils.INVALID_SOURCE_URL_ERROR;
import static com.azure.ai.formrecognizer.TestUtils.INVALID_URL;
import static com.azure.ai.formrecognizer.TestUtils.LAYOUT_FILE_LENGTH;
Expand Down Expand Up @@ -59,28 +53,12 @@ static void afterAll() {

private FormRecognizerAsyncClient getFormRecognizerAsyncClient(HttpClient httpClient,
FormRecognizerServiceVersion serviceVersion) {
FormRecognizerClientBuilder builder = new FormRecognizerClientBuilder()
.endpoint(getEndpoint()).httpClient(httpClient == null
? interceptorManager.getPlaybackClient() : httpClient)
.httpLogOptions(new HttpLogOptions().setLogLevel(HttpLogDetailLevel.BODY_AND_HEADERS))
.serviceVersion(serviceVersion).addPolicy(interceptorManager.getRecordPolicy());
AzureKeyCredential credential = (getTestMode() == TestMode.PLAYBACK) ? new AzureKeyCredential(INVALID_KEY)
: new AzureKeyCredential(getApiKey());
builder.credential(credential);
return builder.buildAsyncClient();
return getFormRecognizerClientBuilder(httpClient, serviceVersion).buildAsyncClient();
}

private FormTrainingAsyncClient getFormTrainingAsyncClient(HttpClient httpClient,
FormRecognizerServiceVersion serviceVersion) {
FormTrainingClientBuilder builder = new FormTrainingClientBuilder()
.endpoint(getEndpoint()).httpClient(httpClient == null
? interceptorManager.getPlaybackClient() : httpClient)
.httpLogOptions(new HttpLogOptions().setLogLevel(HttpLogDetailLevel.BODY_AND_HEADERS))
.serviceVersion(serviceVersion).addPolicy(interceptorManager.getRecordPolicy());
AzureKeyCredential credential = (getTestMode() == TestMode.PLAYBACK) ? new AzureKeyCredential(INVALID_KEY)
: new AzureKeyCredential(getApiKey());
builder.credential(credential);
return builder.buildAsyncClient();
return getFormTrainingClientBuilder(httpClient, serviceVersion).buildAsyncClient();
}
/**
* Verifies receipt data for a document using source as file url.
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -4,6 +4,7 @@
package com.azure.ai.formrecognizer;

import com.azure.core.credential.AzureKeyCredential;
import com.azure.core.credential.TokenCredential;
import org.junit.jupiter.api.Test;

import static com.azure.ai.formrecognizer.TestUtils.VALID_HTTPS_LOCALHOST;
Expand Down Expand Up @@ -52,9 +53,22 @@ public void invalidProtocol() {
*/
@Test
public void nullAzureKeyCredential() {
AzureKeyCredential azureKeyCredential = null;
assertThrows(NullPointerException.class, () -> {
final FormRecognizerClientBuilder builder = new FormRecognizerClientBuilder();
builder.endpoint(VALID_HTTPS_LOCALHOST).credential(null);
builder.endpoint(VALID_HTTPS_LOCALHOST).credential(azureKeyCredential);
});
}

/**
* Test for null AAD credential
*/
@Test
public void nullAADCredential() {
TokenCredential tokenCredential = null;
assertThrows(NullPointerException.class, () -> {
final FormRecognizerClientBuilder builder = new FormRecognizerClientBuilder();
builder.endpoint(VALID_HTTPS_LOCALHOST).credential(tokenCredential);
});
}

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -11,12 +11,7 @@
import com.azure.ai.formrecognizer.models.RecognizedForm;
import com.azure.ai.formrecognizer.models.RecognizedReceipt;
import com.azure.ai.formrecognizer.training.FormTrainingClient;
import com.azure.ai.formrecognizer.training.FormTrainingClientBuilder;
import com.azure.core.credential.AzureKeyCredential;
import com.azure.core.http.HttpClient;
import com.azure.core.http.policy.HttpLogDetailLevel;
import com.azure.core.http.policy.HttpLogOptions;
import com.azure.core.test.TestMode;
import com.azure.core.util.polling.SyncPoller;
import org.junit.jupiter.params.ParameterizedTest;
import org.junit.jupiter.params.provider.MethodSource;
Expand All @@ -26,7 +21,6 @@
import static com.azure.ai.formrecognizer.TestUtils.CUSTOM_FORM_FILE_LENGTH;
import static com.azure.ai.formrecognizer.TestUtils.DISPLAY_NAME_WITH_ARGUMENTS;
import static com.azure.ai.formrecognizer.TestUtils.FORM_LOCAL_URL;
import static com.azure.ai.formrecognizer.TestUtils.INVALID_KEY;
import static com.azure.ai.formrecognizer.TestUtils.INVALID_SOURCE_URL_ERROR;
import static com.azure.ai.formrecognizer.TestUtils.INVALID_URL;
import static com.azure.ai.formrecognizer.TestUtils.LAYOUT_FILE_LENGTH;
Expand All @@ -44,30 +38,12 @@ public class FormRecognizerClientTest extends FormRecognizerClientTestBase {

private FormRecognizerClient getFormRecognizerClient(HttpClient httpClient,
FormRecognizerServiceVersion serviceVersion) {
FormRecognizerClientBuilder builder = new FormRecognizerClientBuilder()
.endpoint(getEndpoint())
.httpClient(httpClient == null ? interceptorManager.getPlaybackClient() : httpClient)
.httpLogOptions(new HttpLogOptions().setLogLevel(HttpLogDetailLevel.BODY_AND_HEADERS))
.serviceVersion(serviceVersion)
.addPolicy(interceptorManager.getRecordPolicy());
AzureKeyCredential credential = (getTestMode() == TestMode.PLAYBACK)
? new AzureKeyCredential(INVALID_KEY) : new AzureKeyCredential(getApiKey());
builder.credential(credential);
return builder.buildClient();
return getFormRecognizerClientBuilder(httpClient, serviceVersion).buildClient();
}

private FormTrainingClient getFormTrainingClient(HttpClient httpClient,
FormRecognizerServiceVersion serviceVersion) {
FormTrainingClientBuilder builder = new FormTrainingClientBuilder()
.endpoint(getEndpoint())
.httpClient(httpClient == null ? interceptorManager.getPlaybackClient() : httpClient)
.httpLogOptions(new HttpLogOptions().setLogLevel(HttpLogDetailLevel.BODY_AND_HEADERS))
.serviceVersion(serviceVersion)
.addPolicy(interceptorManager.getRecordPolicy());
AzureKeyCredential credential = (getTestMode() == TestMode.PLAYBACK)
? new AzureKeyCredential(INVALID_KEY) : new AzureKeyCredential(getApiKey());
builder.credential(credential);
return builder.buildClient();
return getFormTrainingClientBuilder(httpClient, serviceVersion).buildClient();
}

/**
Expand Down
Loading