Skip to content

Update Java SDK dependency to latest version #12

New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Merged
merged 2 commits into from
Nov 12, 2019
Merged
Show file tree
Hide file tree
Changes from all 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 .travis.yml
Original file line number Diff line number Diff line change
@@ -1,4 +1,5 @@
language: java
dist: trusty
jdk:
- oraclejdk8

Expand Down
2 changes: 1 addition & 1 deletion gradle.properties
Original file line number Diff line number Diff line change
@@ -1,5 +1,5 @@
version=1.0.0
group = com.ibm.watson.developer_cloud
watsonVersion = 7.0.0
watsonVersion = 8.0.0
springVersion = 4.3.12.RELEASE
springBootVersion = 1.5.9.RELEASE
Original file line number Diff line number Diff line change
@@ -0,0 +1,44 @@
package com.ibm.watson.developer_cloud.spring.boot;

import com.ibm.cloud.sdk.core.http.HttpHeaders;
import com.ibm.cloud.sdk.core.security.Authenticator;
import okhttp3.Request;
import org.apache.commons.lang3.StringUtils;

import static com.ibm.cloud.sdk.core.security.AuthenticatorBase.ERRORMSG_PROP_MISSING;

/**
* {@link Authenticator} implementation to allow for authentication using the old API key method in Visual Recognition.
*/
public class WatsonApiKeyAuthenticator implements Authenticator {
private String apiKey;

public WatsonApiKeyAuthenticator(String apiKey) {
this.apiKey = apiKey;
this.validate();
}

@Override
public void validate() {
if (StringUtils.isEmpty(apiKey)) {
throw new IllegalArgumentException(String.format(ERRORMSG_PROP_MISSING, "apiKey"));
}
}

@Override
public String authenticationType() {
return "apiKey";
}

@Override
public void authenticate(Request.Builder builder) {
builder.addHeader(HttpHeaders.AUTHORIZATION, "Basic " + this.apiKey);
}

/**
* @return the API key configured on this Authenticator
*/
public String getApiKey() {
return this.apiKey;
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -14,8 +14,11 @@

package com.ibm.watson.developer_cloud.spring.boot;

import com.ibm.cloud.sdk.core.security.Authenticator;
import com.ibm.cloud.sdk.core.security.BasicAuthenticator;
import com.ibm.cloud.sdk.core.security.ConfigBasedAuthenticatorFactory;
import com.ibm.cloud.sdk.core.security.IamAuthenticator;
import com.ibm.cloud.sdk.core.service.BaseService;
import com.ibm.cloud.sdk.core.service.security.IamOptions;
import com.ibm.watson.assistant.v1.Assistant;
import com.ibm.watson.compare_comply.v1.CompareComply;
import com.ibm.watson.discovery.v1.Discovery;
Expand All @@ -27,7 +30,6 @@
import com.ibm.watson.text_to_speech.v1.TextToSpeech;
import com.ibm.watson.tone_analyzer.v3.ToneAnalyzer;
import com.ibm.watson.visual_recognition.v3.VisualRecognition;

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.autoconfigure.condition.ConditionalOnMissingBean;
import org.springframework.boot.context.properties.EnableConfigurationProperties;
Expand All @@ -47,28 +49,28 @@ public class WatsonAutoConfiguration {
private void configUrl(BaseService service, WatsonConfigurationProperties config) {
String url = config.getUrl();
if (url != null) {
service.setEndPoint(url);
service.setServiceUrl(url);
}
}

private void configAuth(BaseService service, WatsonConfigurationProperties config) {
private Authenticator configAuth(WatsonConfigurationProperties config, String serviceName) {
String iamApiKey = config.getIamApiKey();
if (iamApiKey != null) {
IamOptions options = new IamOptions.Builder().apiKey(iamApiKey).build();
service.setIamCredentials(options);
return;
return new IamAuthenticator(iamApiKey);
}
String username = config.getUsername();
String password = config.getPassword();
if (username != null && password != null) {
service.setUsernameAndPassword(username, password);
return;
return new BasicAuthenticator(username, password);
}
String apiKey = config.getApiKey();
if (apiKey != null) {
service.setApiKey(apiKey);
return;
return new WatsonApiKeyAuthenticator(apiKey);
}

// If we can't find the right properties, we'll return what we get from the auth config factory, which will
// pull from things like VCAP_SERVICES.
return ConfigBasedAuthenticatorFactory.getAuthenticator(serviceName);
}

// Watson Assistant service
Expand All @@ -80,9 +82,9 @@ private void configAuth(BaseService service, WatsonConfigurationProperties confi
@ConditionalOnMissingBean
@ConditionalOnWatsonServiceProperties(prefix = WatsonAssistantConfigurationProperties.PREFIX)
public Assistant assistant() {
Assistant service = new Assistant(assistantConfig.getVersionDate());
Authenticator authConfig = configAuth(assistantConfig, "assistant");
Assistant service = new Assistant(assistantConfig.getVersionDate(), authConfig);
configUrl(service, assistantConfig);
configAuth(service, assistantConfig);
return service;
}

Expand All @@ -95,9 +97,9 @@ public Assistant assistant() {
@ConditionalOnMissingBean
@ConditionalOnWatsonServiceProperties(prefix = WatsonCompareComplyConfigurationProperties.PREFIX)
public CompareComply compareComply() {
CompareComply service = new CompareComply(compareComplyConfig.getVersionDate());
Authenticator authConfig = configAuth(compareComplyConfig, "compare_comply");
CompareComply service = new CompareComply(compareComplyConfig.getVersionDate(), authConfig);
configUrl(service, compareComplyConfig);
configAuth(service, compareComplyConfig);
return service;
}

Expand All @@ -110,9 +112,9 @@ public CompareComply compareComply() {
@ConditionalOnMissingBean
@ConditionalOnWatsonServiceProperties(prefix = WatsonDiscoveryConfigurationProperties.PREFIX)
public Discovery discovery() {
Discovery service = new Discovery(discoveryConfig.getVersionDate());
Authenticator authConfig = configAuth(discoveryConfig, "discovery");
Discovery service = new Discovery(discoveryConfig.getVersionDate(), authConfig);
configUrl(service, discoveryConfig);
configAuth(service, discoveryConfig);
return service;
}

Expand All @@ -125,9 +127,9 @@ public Discovery discovery() {
@ConditionalOnMissingBean
@ConditionalOnWatsonServiceProperties(prefix = WatsonLanguageTranslatorConfigurationProperties.PREFIX)
public LanguageTranslator languageTranslator() {
LanguageTranslator service = new LanguageTranslator(ltConfig.getVersionDate());
Authenticator authConfig = configAuth(ltConfig, "language_translator");
LanguageTranslator service = new LanguageTranslator(ltConfig.getVersionDate(), authConfig);
configUrl(service, ltConfig);
configAuth(service, ltConfig);
return service;
}

Expand All @@ -140,9 +142,9 @@ public LanguageTranslator languageTranslator() {
@ConditionalOnMissingBean
@ConditionalOnWatsonServiceProperties(prefix = WatsonNaturalLanguageClassifierConfigurationProperties.PREFIX)
public NaturalLanguageClassifier naturalLanguageClassifier() {
NaturalLanguageClassifier service = new NaturalLanguageClassifier();
Authenticator authConfig = configAuth(nlcConfig, "natural_language_classifier");
NaturalLanguageClassifier service = new NaturalLanguageClassifier(authConfig);
configUrl(service, nlcConfig);
configAuth(service, nlcConfig);
return service;
}

Expand All @@ -155,9 +157,9 @@ public NaturalLanguageClassifier naturalLanguageClassifier() {
@ConditionalOnMissingBean
@ConditionalOnWatsonServiceProperties(prefix = WatsonNaturalLanguageUnderstandingConfigurationProperties.PREFIX)
public NaturalLanguageUnderstanding naturalLanguageUnderstanding() {
NaturalLanguageUnderstanding service = new NaturalLanguageUnderstanding(nluConfig.getVersionDate());
Authenticator authConfig = configAuth(nluConfig, "natural_language_understanding");
NaturalLanguageUnderstanding service = new NaturalLanguageUnderstanding(nluConfig.getVersionDate(), authConfig);
configUrl(service, nluConfig);
configAuth(service, nluConfig);
return service;
}

Expand All @@ -170,9 +172,9 @@ public NaturalLanguageUnderstanding naturalLanguageUnderstanding() {
@ConditionalOnMissingBean
@ConditionalOnWatsonServiceProperties(prefix = WatsonPersonalityInsightsConfigurationProperties.PREFIX)
public PersonalityInsights personalityInsights() {
PersonalityInsights service = new PersonalityInsights(piConfig.getVersionDate());
Authenticator authConfig = configAuth(piConfig, "personality_insights");
PersonalityInsights service = new PersonalityInsights(piConfig.getVersionDate(), authConfig);
configUrl(service, piConfig);
configAuth(service, piConfig);
return service;
}

Expand All @@ -185,9 +187,9 @@ public PersonalityInsights personalityInsights() {
@ConditionalOnMissingBean
@ConditionalOnWatsonServiceProperties(prefix = WatsonSpeechToTextConfigurationProperties.PREFIX)
public SpeechToText speechToText() {
SpeechToText service = new SpeechToText();
Authenticator authConfig = configAuth(sttConfig, "speech_to_text");
SpeechToText service = new SpeechToText(authConfig);
configUrl(service, sttConfig);
configAuth(service, sttConfig);
return service;
}

Expand All @@ -200,9 +202,9 @@ public SpeechToText speechToText() {
@ConditionalOnMissingBean
@ConditionalOnWatsonServiceProperties(prefix = WatsonTextToSpeechConfigurationProperties.PREFIX)
public TextToSpeech textToSpeech() {
TextToSpeech service = new TextToSpeech();
Authenticator authConfig = configAuth(ttsConfig, "text_to_speech");
TextToSpeech service = new TextToSpeech(authConfig);
configUrl(service, ttsConfig);
configAuth(service, ttsConfig);
return service;
}

Expand All @@ -215,9 +217,9 @@ public TextToSpeech textToSpeech() {
@ConditionalOnMissingBean
@ConditionalOnWatsonServiceProperties(prefix = WatsonToneAnalyzerConfigurationProperties.PREFIX)
public ToneAnalyzer toneAnalyzer() {
ToneAnalyzer service = new ToneAnalyzer(taConfig.getVersionDate());
Authenticator authConfig = configAuth(taConfig, "tone_analyzer");
ToneAnalyzer service = new ToneAnalyzer(taConfig.getVersionDate(), authConfig);
configUrl(service, taConfig);
configAuth(service, taConfig);
return service;
}

Expand All @@ -230,9 +232,9 @@ public ToneAnalyzer toneAnalyzer() {
@ConditionalOnMissingBean
@ConditionalOnWatsonServiceProperties(prefix = WatsonVisualRecognitionConfigurationProperties.PREFIX)
public VisualRecognition visualRecognition() {
VisualRecognition service = new VisualRecognition(vrConfig.getVersionDate());
Authenticator authConfig = configAuth(vrConfig, "visual_recognition");
VisualRecognition service = new VisualRecognition(vrConfig.getVersionDate(), authConfig);
configUrl(service, vrConfig);
configAuth(service, vrConfig);
return service;
}

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -14,10 +14,10 @@

package com.ibm.watson.developer_cloud.spring.boot.test;

import com.ibm.cloud.sdk.core.service.BaseService;
import com.ibm.cloud.sdk.core.security.Authenticator;
import com.ibm.cloud.sdk.core.security.BasicAuthenticator;
import com.ibm.watson.assistant.v1.Assistant;
import com.ibm.watson.developer_cloud.spring.boot.WatsonAutoConfiguration;
import okhttp3.Credentials;
import org.junit.Test;
import org.junit.runner.RunWith;
import org.springframework.beans.factory.annotation.Autowired;
Expand Down Expand Up @@ -53,14 +53,14 @@ public void assistantBeanConfig() {
Assistant assistant = (Assistant) applicationContext.getBean("assistant");

assertNotNull(assistant);
assertEquals(url, assistant.getEndPoint());
assertEquals(url, assistant.getServiceUrl());

// Verify the credentials and versionDate -- which are stored in private member
// variables
// Verify the credentials and versionDate -- the latter of which is stored in a private member variable
try {
Field apiKeyField = BaseService.class.getDeclaredField("apiKey");
apiKeyField.setAccessible(true);
assertEquals(Credentials.basic(username, password), apiKeyField.get(assistant));
assertEquals(Authenticator.AUTHTYPE_BASIC, assistant.getAuthenticator().authenticationType());
BasicAuthenticator authenticator = (BasicAuthenticator) assistant.getAuthenticator();
assertEquals(username, authenticator.getUsername());
assertEquals(password, authenticator.getPassword());

Field versionField = Assistant.class.getDeclaredField("versionDate");
versionField.setAccessible(true);
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -14,9 +14,9 @@

package com.ibm.watson.developer_cloud.spring.boot.test;

import com.ibm.cloud.sdk.core.service.BaseService;
import com.ibm.cloud.sdk.core.security.Authenticator;
import com.ibm.cloud.sdk.core.security.IamAuthenticator;
import com.ibm.watson.assistant.v1.Assistant;
import com.ibm.cloud.sdk.core.service.security.IamTokenManager;
import com.ibm.watson.developer_cloud.spring.boot.WatsonAutoConfiguration;
import org.junit.Test;
import org.junit.runner.RunWith;
Expand All @@ -35,40 +35,36 @@
@RunWith(SpringJUnit4ClassRunner.class)
@ContextConfiguration(classes = { WatsonAutoConfiguration.class }, loader = AnnotationConfigContextLoader.class)
@TestPropertySource(properties = { "watson.assistant.url=" + AssistantIamAuthTest.url,
"watson.assistant.iamApiKey=" + AssistantIamAuthTest.iamApiKey,
"watson.assistant.versionDate=" + AssistantIamAuthTest.versionDate })
"watson.assistant.iamApiKey=" + AssistantIamAuthTest.iamApiKey,
"watson.assistant.versionDate=" + AssistantIamAuthTest.versionDate })
public class AssistantIamAuthTest {

static final String url = "http://watson.com/assistant";
static final String iamApiKey = "super-secret-apikey";
static final String versionDate = "2017-12-15";
static final String url = "http://watson.com/assistant";
static final String iamApiKey = "super-secret-apikey";
static final String versionDate = "2017-12-15";

@Autowired
private ApplicationContext applicationContext;
@Autowired
private ApplicationContext applicationContext;

@Test
public void assistantBeanConfig() {
Assistant assistant = (Assistant) applicationContext.getBean("assistant");
@Test
public void assistantBeanConfig() {
Assistant assistant = (Assistant) applicationContext.getBean("assistant");

assertNotNull(assistant);
assertEquals(url, assistant.getEndPoint());
assertNotNull(assistant);
assertEquals(url, assistant.getServiceUrl());

// Verify the credentials and versionDate -- which are stored in private member
// variables
try {
Field iamTokenManagerField = BaseService.class.getDeclaredField("tokenManager");
iamTokenManagerField.setAccessible(true);
IamTokenManager tokenManager = (IamTokenManager) iamTokenManagerField.get(assistant);
Field iamApiKeyField = IamTokenManager.class.getDeclaredField("apiKey");
iamApiKeyField.setAccessible(true);
assertEquals(iamApiKey, iamApiKeyField.get(tokenManager));
// Verify the credentials and versionDate -- the latter of which is stored in a private member variable
try {
assertEquals(Authenticator.AUTHTYPE_IAM, assistant.getAuthenticator().authenticationType());
IamAuthenticator authenticator = (IamAuthenticator) assistant.getAuthenticator();
assertEquals(iamApiKey, authenticator.getApiKey());

Field versionField = Assistant.class.getDeclaredField("versionDate");
versionField.setAccessible(true);
assertEquals(versionDate, versionField.get(assistant));
} catch (NoSuchFieldException | IllegalAccessException ex) {
// This shouldn't happen
assert false;
}
Field versionField = Assistant.class.getDeclaredField("versionDate");
versionField.setAccessible(true);
assertEquals(versionDate, versionField.get(assistant));
} catch (NoSuchFieldException | IllegalAccessException ex) {
// This shouldn't happen
assert false;
}
}
}
Loading