Skip to content

Commit e55c0fb

Browse files
authored
Merge pull request #12 from watson-developer-cloud/java-sdk-update
Update Java SDK dependency to latest version
2 parents 55100ed + ac89f31 commit e55c0fb

17 files changed

+262
-262
lines changed

.travis.yml

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,5 @@
11
language: java
2+
dist: trusty
23
jdk:
34
- oraclejdk8
45

gradle.properties

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,5 @@
11
version=1.0.0
22
group = com.ibm.watson.developer_cloud
3-
watsonVersion = 7.0.0
3+
watsonVersion = 8.0.0
44
springVersion = 4.3.12.RELEASE
55
springBootVersion = 1.5.9.RELEASE
Lines changed: 44 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,44 @@
1+
package com.ibm.watson.developer_cloud.spring.boot;
2+
3+
import com.ibm.cloud.sdk.core.http.HttpHeaders;
4+
import com.ibm.cloud.sdk.core.security.Authenticator;
5+
import okhttp3.Request;
6+
import org.apache.commons.lang3.StringUtils;
7+
8+
import static com.ibm.cloud.sdk.core.security.AuthenticatorBase.ERRORMSG_PROP_MISSING;
9+
10+
/**
11+
* {@link Authenticator} implementation to allow for authentication using the old API key method in Visual Recognition.
12+
*/
13+
public class WatsonApiKeyAuthenticator implements Authenticator {
14+
private String apiKey;
15+
16+
public WatsonApiKeyAuthenticator(String apiKey) {
17+
this.apiKey = apiKey;
18+
this.validate();
19+
}
20+
21+
@Override
22+
public void validate() {
23+
if (StringUtils.isEmpty(apiKey)) {
24+
throw new IllegalArgumentException(String.format(ERRORMSG_PROP_MISSING, "apiKey"));
25+
}
26+
}
27+
28+
@Override
29+
public String authenticationType() {
30+
return "apiKey";
31+
}
32+
33+
@Override
34+
public void authenticate(Request.Builder builder) {
35+
builder.addHeader(HttpHeaders.AUTHORIZATION, "Basic " + this.apiKey);
36+
}
37+
38+
/**
39+
* @return the API key configured on this Authenticator
40+
*/
41+
public String getApiKey() {
42+
return this.apiKey;
43+
}
44+
}

src/main/java/com/ibm/watson/developer_cloud/spring/boot/WatsonAutoConfiguration.java

Lines changed: 35 additions & 33 deletions
Original file line numberDiff line numberDiff line change
@@ -14,8 +14,11 @@
1414

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

17+
import com.ibm.cloud.sdk.core.security.Authenticator;
18+
import com.ibm.cloud.sdk.core.security.BasicAuthenticator;
19+
import com.ibm.cloud.sdk.core.security.ConfigBasedAuthenticatorFactory;
20+
import com.ibm.cloud.sdk.core.security.IamAuthenticator;
1721
import com.ibm.cloud.sdk.core.service.BaseService;
18-
import com.ibm.cloud.sdk.core.service.security.IamOptions;
1922
import com.ibm.watson.assistant.v1.Assistant;
2023
import com.ibm.watson.compare_comply.v1.CompareComply;
2124
import com.ibm.watson.discovery.v1.Discovery;
@@ -27,7 +30,6 @@
2730
import com.ibm.watson.text_to_speech.v1.TextToSpeech;
2831
import com.ibm.watson.tone_analyzer.v3.ToneAnalyzer;
2932
import com.ibm.watson.visual_recognition.v3.VisualRecognition;
30-
3133
import org.springframework.beans.factory.annotation.Autowired;
3234
import org.springframework.boot.autoconfigure.condition.ConditionalOnMissingBean;
3335
import org.springframework.boot.context.properties.EnableConfigurationProperties;
@@ -47,28 +49,28 @@ public class WatsonAutoConfiguration {
4749
private void configUrl(BaseService service, WatsonConfigurationProperties config) {
4850
String url = config.getUrl();
4951
if (url != null) {
50-
service.setEndPoint(url);
52+
service.setServiceUrl(url);
5153
}
5254
}
5355

54-
private void configAuth(BaseService service, WatsonConfigurationProperties config) {
56+
private Authenticator configAuth(WatsonConfigurationProperties config, String serviceName) {
5557
String iamApiKey = config.getIamApiKey();
5658
if (iamApiKey != null) {
57-
IamOptions options = new IamOptions.Builder().apiKey(iamApiKey).build();
58-
service.setIamCredentials(options);
59-
return;
59+
return new IamAuthenticator(iamApiKey);
6060
}
6161
String username = config.getUsername();
6262
String password = config.getPassword();
6363
if (username != null && password != null) {
64-
service.setUsernameAndPassword(username, password);
65-
return;
64+
return new BasicAuthenticator(username, password);
6665
}
6766
String apiKey = config.getApiKey();
6867
if (apiKey != null) {
69-
service.setApiKey(apiKey);
70-
return;
68+
return new WatsonApiKeyAuthenticator(apiKey);
7169
}
70+
71+
// If we can't find the right properties, we'll return what we get from the auth config factory, which will
72+
// pull from things like VCAP_SERVICES.
73+
return ConfigBasedAuthenticatorFactory.getAuthenticator(serviceName);
7274
}
7375

7476
// Watson Assistant service
@@ -80,9 +82,9 @@ private void configAuth(BaseService service, WatsonConfigurationProperties confi
8082
@ConditionalOnMissingBean
8183
@ConditionalOnWatsonServiceProperties(prefix = WatsonAssistantConfigurationProperties.PREFIX)
8284
public Assistant assistant() {
83-
Assistant service = new Assistant(assistantConfig.getVersionDate());
85+
Authenticator authConfig = configAuth(assistantConfig, "assistant");
86+
Assistant service = new Assistant(assistantConfig.getVersionDate(), authConfig);
8487
configUrl(service, assistantConfig);
85-
configAuth(service, assistantConfig);
8688
return service;
8789
}
8890

@@ -95,9 +97,9 @@ public Assistant assistant() {
9597
@ConditionalOnMissingBean
9698
@ConditionalOnWatsonServiceProperties(prefix = WatsonCompareComplyConfigurationProperties.PREFIX)
9799
public CompareComply compareComply() {
98-
CompareComply service = new CompareComply(compareComplyConfig.getVersionDate());
100+
Authenticator authConfig = configAuth(compareComplyConfig, "compare_comply");
101+
CompareComply service = new CompareComply(compareComplyConfig.getVersionDate(), authConfig);
99102
configUrl(service, compareComplyConfig);
100-
configAuth(service, compareComplyConfig);
101103
return service;
102104
}
103105

@@ -110,9 +112,9 @@ public CompareComply compareComply() {
110112
@ConditionalOnMissingBean
111113
@ConditionalOnWatsonServiceProperties(prefix = WatsonDiscoveryConfigurationProperties.PREFIX)
112114
public Discovery discovery() {
113-
Discovery service = new Discovery(discoveryConfig.getVersionDate());
115+
Authenticator authConfig = configAuth(discoveryConfig, "discovery");
116+
Discovery service = new Discovery(discoveryConfig.getVersionDate(), authConfig);
114117
configUrl(service, discoveryConfig);
115-
configAuth(service, discoveryConfig);
116118
return service;
117119
}
118120

@@ -125,9 +127,9 @@ public Discovery discovery() {
125127
@ConditionalOnMissingBean
126128
@ConditionalOnWatsonServiceProperties(prefix = WatsonLanguageTranslatorConfigurationProperties.PREFIX)
127129
public LanguageTranslator languageTranslator() {
128-
LanguageTranslator service = new LanguageTranslator(ltConfig.getVersionDate());
130+
Authenticator authConfig = configAuth(ltConfig, "language_translator");
131+
LanguageTranslator service = new LanguageTranslator(ltConfig.getVersionDate(), authConfig);
129132
configUrl(service, ltConfig);
130-
configAuth(service, ltConfig);
131133
return service;
132134
}
133135

@@ -140,9 +142,9 @@ public LanguageTranslator languageTranslator() {
140142
@ConditionalOnMissingBean
141143
@ConditionalOnWatsonServiceProperties(prefix = WatsonNaturalLanguageClassifierConfigurationProperties.PREFIX)
142144
public NaturalLanguageClassifier naturalLanguageClassifier() {
143-
NaturalLanguageClassifier service = new NaturalLanguageClassifier();
145+
Authenticator authConfig = configAuth(nlcConfig, "natural_language_classifier");
146+
NaturalLanguageClassifier service = new NaturalLanguageClassifier(authConfig);
144147
configUrl(service, nlcConfig);
145-
configAuth(service, nlcConfig);
146148
return service;
147149
}
148150

@@ -155,9 +157,9 @@ public NaturalLanguageClassifier naturalLanguageClassifier() {
155157
@ConditionalOnMissingBean
156158
@ConditionalOnWatsonServiceProperties(prefix = WatsonNaturalLanguageUnderstandingConfigurationProperties.PREFIX)
157159
public NaturalLanguageUnderstanding naturalLanguageUnderstanding() {
158-
NaturalLanguageUnderstanding service = new NaturalLanguageUnderstanding(nluConfig.getVersionDate());
160+
Authenticator authConfig = configAuth(nluConfig, "natural_language_understanding");
161+
NaturalLanguageUnderstanding service = new NaturalLanguageUnderstanding(nluConfig.getVersionDate(), authConfig);
159162
configUrl(service, nluConfig);
160-
configAuth(service, nluConfig);
161163
return service;
162164
}
163165

@@ -170,9 +172,9 @@ public NaturalLanguageUnderstanding naturalLanguageUnderstanding() {
170172
@ConditionalOnMissingBean
171173
@ConditionalOnWatsonServiceProperties(prefix = WatsonPersonalityInsightsConfigurationProperties.PREFIX)
172174
public PersonalityInsights personalityInsights() {
173-
PersonalityInsights service = new PersonalityInsights(piConfig.getVersionDate());
175+
Authenticator authConfig = configAuth(piConfig, "personality_insights");
176+
PersonalityInsights service = new PersonalityInsights(piConfig.getVersionDate(), authConfig);
174177
configUrl(service, piConfig);
175-
configAuth(service, piConfig);
176178
return service;
177179
}
178180

@@ -185,9 +187,9 @@ public PersonalityInsights personalityInsights() {
185187
@ConditionalOnMissingBean
186188
@ConditionalOnWatsonServiceProperties(prefix = WatsonSpeechToTextConfigurationProperties.PREFIX)
187189
public SpeechToText speechToText() {
188-
SpeechToText service = new SpeechToText();
190+
Authenticator authConfig = configAuth(sttConfig, "speech_to_text");
191+
SpeechToText service = new SpeechToText(authConfig);
189192
configUrl(service, sttConfig);
190-
configAuth(service, sttConfig);
191193
return service;
192194
}
193195

@@ -200,9 +202,9 @@ public SpeechToText speechToText() {
200202
@ConditionalOnMissingBean
201203
@ConditionalOnWatsonServiceProperties(prefix = WatsonTextToSpeechConfigurationProperties.PREFIX)
202204
public TextToSpeech textToSpeech() {
203-
TextToSpeech service = new TextToSpeech();
205+
Authenticator authConfig = configAuth(ttsConfig, "text_to_speech");
206+
TextToSpeech service = new TextToSpeech(authConfig);
204207
configUrl(service, ttsConfig);
205-
configAuth(service, ttsConfig);
206208
return service;
207209
}
208210

@@ -215,9 +217,9 @@ public TextToSpeech textToSpeech() {
215217
@ConditionalOnMissingBean
216218
@ConditionalOnWatsonServiceProperties(prefix = WatsonToneAnalyzerConfigurationProperties.PREFIX)
217219
public ToneAnalyzer toneAnalyzer() {
218-
ToneAnalyzer service = new ToneAnalyzer(taConfig.getVersionDate());
220+
Authenticator authConfig = configAuth(taConfig, "tone_analyzer");
221+
ToneAnalyzer service = new ToneAnalyzer(taConfig.getVersionDate(), authConfig);
219222
configUrl(service, taConfig);
220-
configAuth(service, taConfig);
221223
return service;
222224
}
223225

@@ -230,9 +232,9 @@ public ToneAnalyzer toneAnalyzer() {
230232
@ConditionalOnMissingBean
231233
@ConditionalOnWatsonServiceProperties(prefix = WatsonVisualRecognitionConfigurationProperties.PREFIX)
232234
public VisualRecognition visualRecognition() {
233-
VisualRecognition service = new VisualRecognition(vrConfig.getVersionDate());
235+
Authenticator authConfig = configAuth(vrConfig, "visual_recognition");
236+
VisualRecognition service = new VisualRecognition(vrConfig.getVersionDate(), authConfig);
234237
configUrl(service, vrConfig);
235-
configAuth(service, vrConfig);
236238
return service;
237239
}
238240

src/test/java/com/ibm/watson/developer_cloud/spring/boot/test/AssistantAutoConfigTest.java

Lines changed: 8 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -14,10 +14,10 @@
1414

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

17-
import com.ibm.cloud.sdk.core.service.BaseService;
17+
import com.ibm.cloud.sdk.core.security.Authenticator;
18+
import com.ibm.cloud.sdk.core.security.BasicAuthenticator;
1819
import com.ibm.watson.assistant.v1.Assistant;
1920
import com.ibm.watson.developer_cloud.spring.boot.WatsonAutoConfiguration;
20-
import okhttp3.Credentials;
2121
import org.junit.Test;
2222
import org.junit.runner.RunWith;
2323
import org.springframework.beans.factory.annotation.Autowired;
@@ -53,14 +53,14 @@ public void assistantBeanConfig() {
5353
Assistant assistant = (Assistant) applicationContext.getBean("assistant");
5454

5555
assertNotNull(assistant);
56-
assertEquals(url, assistant.getEndPoint());
56+
assertEquals(url, assistant.getServiceUrl());
5757

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

6565
Field versionField = Assistant.class.getDeclaredField("versionDate");
6666
versionField.setAccessible(true);

src/test/java/com/ibm/watson/developer_cloud/spring/boot/test/AssistantIamAuthTest.java

Lines changed: 26 additions & 30 deletions
Original file line numberDiff line numberDiff line change
@@ -14,9 +14,9 @@
1414

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

17-
import com.ibm.cloud.sdk.core.service.BaseService;
17+
import com.ibm.cloud.sdk.core.security.Authenticator;
18+
import com.ibm.cloud.sdk.core.security.IamAuthenticator;
1819
import com.ibm.watson.assistant.v1.Assistant;
19-
import com.ibm.cloud.sdk.core.service.security.IamTokenManager;
2020
import com.ibm.watson.developer_cloud.spring.boot.WatsonAutoConfiguration;
2121
import org.junit.Test;
2222
import org.junit.runner.RunWith;
@@ -35,40 +35,36 @@
3535
@RunWith(SpringJUnit4ClassRunner.class)
3636
@ContextConfiguration(classes = { WatsonAutoConfiguration.class }, loader = AnnotationConfigContextLoader.class)
3737
@TestPropertySource(properties = { "watson.assistant.url=" + AssistantIamAuthTest.url,
38-
"watson.assistant.iamApiKey=" + AssistantIamAuthTest.iamApiKey,
39-
"watson.assistant.versionDate=" + AssistantIamAuthTest.versionDate })
38+
"watson.assistant.iamApiKey=" + AssistantIamAuthTest.iamApiKey,
39+
"watson.assistant.versionDate=" + AssistantIamAuthTest.versionDate })
4040
public class AssistantIamAuthTest {
4141

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

46-
@Autowired
47-
private ApplicationContext applicationContext;
46+
@Autowired
47+
private ApplicationContext applicationContext;
4848

49-
@Test
50-
public void assistantBeanConfig() {
51-
Assistant assistant = (Assistant) applicationContext.getBean("assistant");
49+
@Test
50+
public void assistantBeanConfig() {
51+
Assistant assistant = (Assistant) applicationContext.getBean("assistant");
5252

53-
assertNotNull(assistant);
54-
assertEquals(url, assistant.getEndPoint());
53+
assertNotNull(assistant);
54+
assertEquals(url, assistant.getServiceUrl());
5555

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

66-
Field versionField = Assistant.class.getDeclaredField("versionDate");
67-
versionField.setAccessible(true);
68-
assertEquals(versionDate, versionField.get(assistant));
69-
} catch (NoSuchFieldException | IllegalAccessException ex) {
70-
// This shouldn't happen
71-
assert false;
72-
}
62+
Field versionField = Assistant.class.getDeclaredField("versionDate");
63+
versionField.setAccessible(true);
64+
assertEquals(versionDate, versionField.get(assistant));
65+
} catch (NoSuchFieldException | IllegalAccessException ex) {
66+
// This shouldn't happen
67+
assert false;
7368
}
69+
}
7470
}

0 commit comments

Comments
 (0)