Skip to content

Commit 6a9600c

Browse files
WIP for transitioning to Java HTTP lib
1 parent 9766d1e commit 6a9600c

File tree

12 files changed

+341
-455
lines changed

12 files changed

+341
-455
lines changed

pom.xml

Lines changed: 0 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -84,11 +84,6 @@
8484
<artifactId>commons-lang3</artifactId>
8585
<version>3.12.0</version>
8686
</dependency>
87-
<dependency>
88-
<groupId>org.apache.httpcomponents</groupId>
89-
<artifactId>httpclient</artifactId>
90-
<version>4.5.13</version>
91-
</dependency>
9287
<dependency>
9388
<groupId>com.fasterxml.jackson.core</groupId>
9489
<artifactId>jackson-databind</artifactId>

src/main/java/engineer/nightowl/sonos/api/SonosApiClient.java

Lines changed: 11 additions & 40 deletions
Original file line numberDiff line numberDiff line change
@@ -15,17 +15,14 @@
1515
import engineer.nightowl.sonos.api.resource.PlaylistResource;
1616
import engineer.nightowl.sonos.api.resource.SettingsResource;
1717

18-
import org.apache.http.impl.client.CloseableHttpClient;
19-
import org.apache.http.impl.client.HttpClientBuilder;
20-
import org.apache.http.util.VersionInfo;
2118
import org.slf4j.Logger;
2219
import org.slf4j.LoggerFactory;
2320

2421
import java.io.IOException;
2522
import java.net.http.HttpClient;
2623
import java.util.Properties;
2724

28-
public class SonosApiClient implements AutoCloseable
25+
public class SonosApiClient
2926
{
3027
// Resources
3128
private final AudioClipResource audioClipResource;
@@ -49,7 +46,7 @@ public class SonosApiClient implements AutoCloseable
4946

5047
// Can be overridden by implementing applications
5148
private SonosApiConfiguration configuration;
52-
private CloseableHttpClient httpClient;
49+
private HttpClient httpClient;
5350

5451
private final String version;
5552

@@ -59,7 +56,7 @@ public class SonosApiClient implements AutoCloseable
5956
* @param configuration a {@link engineer.nightowl.sonos.api.SonosApiConfiguration} containing integration
6057
* information such as API keys
6158
*
62-
* @see SonosApiClient#SonosApiClient(SonosApiConfiguration, CloseableHttpClient)
59+
* @see SonosApiClient#SonosApiClient(SonosApiConfiguration, HttpClient)
6360
*/
6461
public SonosApiClient(final SonosApiConfiguration configuration)
6562
{
@@ -71,9 +68,9 @@ public SonosApiClient(final SonosApiConfiguration configuration)
7168
*
7269
* @param configuration a {@link engineer.nightowl.sonos.api.SonosApiConfiguration} containing integration
7370
* information such as API keys
74-
* @param httpClient a custom {@link CloseableHttpClient} - if null, a default client is initialised
71+
* @param httpClient a custom {@link HttpClient} - if null, a default client is initialised
7572
*/
76-
public SonosApiClient(final SonosApiConfiguration configuration, final CloseableHttpClient httpClient)
73+
public SonosApiClient(final SonosApiConfiguration configuration, final HttpClient httpClient)
7774
{
7875
loadProperties();
7976
version = properties.getProperty("sonosapijava.version");
@@ -102,44 +99,27 @@ public SonosApiClient(final SonosApiConfiguration configuration, final Closeable
10299

103100
public String getUserAgent()
104101
{
105-
final String ahcUa = VersionInfo.getUserAgent("Apache-HttpClient",
106-
"org.apache.http.client", HttpClientBuilder.class);
107-
108-
return String.format("sonos-api-java/%s (applicationId/%s) (httpClient/(%s))",
109-
version, configuration.getApplicationId(), ahcUa);
102+
return String.format("sonos-api-java/%s (applicationId/%s))",
103+
version, configuration.getApplicationId());
110104
}
111105

112106
/**
113107
* Generate a default HTTP client.
114108
*
115109
* @return a default HTTP client.
116110
*/
117-
private CloseableHttpClient generateHttpClient()
111+
private HttpClient generateHttpClient()
118112
{
119113
logger.debug("Using default HttpClient");
120-
return HttpClientBuilder.create().setUserAgent(getUserAgent()).build();
121-
}
122-
123-
/**
124-
* Close the HTTP client.
125-
*/
126-
public void closeHttpClient()
127-
{
128-
try
129-
{
130-
httpClient.close();
131-
} catch (final IOException ioe)
132-
{
133-
logger.warn("Unable to close HttpClient", ioe);
134-
}
114+
return HttpClient.newHttpClient();
135115
}
136116

137117
/**
138118
* Get the configured HTTP client for this API client instance.
139119
*
140120
* @return the configured HTTP client
141121
*/
142-
public CloseableHttpClient getHttpClient()
122+
public HttpClient getHttpClient()
143123
{
144124
return httpClient;
145125
}
@@ -149,7 +129,7 @@ public CloseableHttpClient getHttpClient()
149129
*
150130
* @param httpClient custom client to set
151131
*/
152-
public void setHttpClient(final CloseableHttpClient httpClient)
132+
public void setHttpClient(final HttpClient httpClient)
153133
{
154134
this.httpClient = httpClient;
155135
}
@@ -324,13 +304,4 @@ public SettingsResource settings()
324304
return settingsResource;
325305
}
326306

327-
328-
/**
329-
* Closes the HttpClient
330-
*/
331-
@Override
332-
public void close()
333-
{
334-
closeHttpClient();
335-
}
336307
}
Lines changed: 37 additions & 119 deletions
Original file line numberDiff line numberDiff line change
@@ -1,13 +1,11 @@
11
package engineer.nightowl.sonos.api;
22

3-
import org.apache.commons.codec.binary.Base64;
4-
import org.apache.commons.lang3.builder.EqualsBuilder;
5-
import org.apache.commons.lang3.builder.HashCodeBuilder;
6-
import org.apache.http.Header;
7-
import org.apache.http.message.BasicHeader;
3+
import java.util.Base64;
4+
import java.util.Objects;
85

96
/**
10-
* Configuration class to be built up and passed into a {@link engineer.nightowl.sonos.api.SonosApiClient}
7+
* Configuration class to be built up and passed into a
8+
* {@link engineer.nightowl.sonos.api.SonosApiClient}
119
* <p>
1210
* Loads defaults on construction.
1311
*/
@@ -21,172 +19,92 @@ public class SonosApiConfiguration
2119
private String controlBaseUrl;
2220
private Boolean clientSideValidationEnabled;
2321

24-
/**
25-
* <p>Constructor for SonosApiConfiguration.</p>
26-
*/
27-
public SonosApiConfiguration()
28-
{
22+
public SonosApiConfiguration() {
2923
loadDefaults();
3024
}
3125

32-
/**
33-
* <p>Getter for the field <code>applicationId</code>.</p>
34-
*
35-
* @return a {@link java.lang.String} object.
36-
*/
37-
public String getApplicationId()
38-
{
26+
public String getApplicationId() {
3927
return applicationId;
4028
}
4129

42-
/**
43-
* <p>Setter for the field <code>applicationId</code>.</p>
44-
*
45-
* @param applicationId a {@link java.lang.String} object.
46-
*/
47-
public void setApplicationId(final String applicationId)
48-
{
30+
public void setApplicationId(final String applicationId) {
4931
this.applicationId = applicationId;
5032
}
5133

52-
/**
53-
* <p>Getter for the field <code>apiKey</code>.</p>
54-
*
55-
* @return a {@link java.lang.String} object.
56-
*/
57-
public String getApiKey()
58-
{
34+
public String getApiKey() {
5935
return apiKey;
6036
}
6137

62-
/**
63-
* <p>Setter for the field <code>apiKey</code>.</p>
64-
*
65-
* @param apiKey a {@link java.lang.String} object.
66-
*/
67-
public void setApiKey(final String apiKey)
68-
{
38+
public void setApiKey(final String apiKey) {
6939
this.apiKey = apiKey;
7040
}
7141

72-
public String getApiSecret()
73-
{
42+
public String getApiSecret() {
7443
return apiSecret;
7544
}
7645

77-
/**
78-
* <p>Setter for the field <code>apiSecret</code>.</p>
79-
*
80-
* @param apiSecret a {@link java.lang.String} object.
81-
*/
82-
public void setApiSecret(final String apiSecret)
83-
{
46+
public void setApiSecret(final String apiSecret) {
8447
this.apiSecret = apiSecret;
8548
}
8649

87-
/**
88-
* <p>Getter for the field <code>authBaseUrl</code>.</p>
89-
*
90-
* @return a {@link java.lang.String} object.
91-
*/
92-
public String getAuthBaseUrl()
93-
{
50+
public String getAuthBaseUrl() {
9451
return authBaseUrl;
9552
}
9653

97-
public void setAuthBaseUrl(final String authBaseUrl)
98-
{
54+
public void setAuthBaseUrl(final String authBaseUrl) {
9955
this.authBaseUrl = authBaseUrl;
10056
}
10157

102-
/**
103-
* <p>Getter for the field <code>controlBaseUrl</code>.</p>
104-
*
105-
* @return a {@link java.lang.String} object.
106-
*/
107-
public String getControlBaseUrl()
108-
{
58+
public String getControlBaseUrl() {
10959
return controlBaseUrl;
11060
}
11161

112-
public void setControlBaseUrl(final String controlBaseUrl)
113-
{
62+
public void setControlBaseUrl(final String controlBaseUrl) {
11463
this.controlBaseUrl = controlBaseUrl;
11564
}
11665

117-
public Boolean isClientSideValidationEnabled()
118-
{
66+
public Boolean isClientSideValidationEnabled() {
11967
return clientSideValidationEnabled;
12068
}
12169

122-
public void setClientSideValidationEnabled(Boolean clientSideValidationEnabled)
123-
{
70+
public void setClientSideValidationEnabled(Boolean clientSideValidationEnabled) {
12471
this.clientSideValidationEnabled = clientSideValidationEnabled;
12572
}
12673

127-
128-
public void loadDefaults()
129-
{
74+
public void loadDefaults() {
13075
setAuthBaseUrl("api.sonos.com");
13176
setControlBaseUrl("api.ws.sonos.com/control/api");
13277
setClientSideValidationEnabled(Boolean.TRUE);
13378
}
13479

135-
/**
136-
* <p>getAuthorizationHeader.</p>
137-
*
138-
* @return a {@link org.apache.http.Header} object.
139-
*/
140-
public Header getAuthorizationHeader()
141-
{
80+
public String getAuthorizationHeaderValue() {
14281
final byte[] authBytes = String.join(":", getApiKey(), getApiSecret()).getBytes();
143-
final String authBase64 = Base64.encodeBase64String(authBytes);
144-
final String headerValue = String.join(" ", "Basic", authBase64);
145-
return new BasicHeader("Authorization", headerValue);
82+
final String authBase64 = Base64.getEncoder().encodeToString(authBytes);
83+
return String.join(" ", "Basic", authBase64);
14684
}
14785

14886
@Override
149-
public String toString()
150-
{
151-
return "SonosApiConfiguration{" +
152-
"applicationId='" + applicationId + '\'' +
153-
", apiKey='" + apiKey + '\'' +
154-
", apiSecret='" + apiSecret + '\'' +
155-
", authBaseUrl='" + authBaseUrl + '\'' +
156-
", controlBaseUrl='" + controlBaseUrl + '\'' +
157-
", clientSideValidationEnabled=" + clientSideValidationEnabled +
158-
'}';
87+
public String toString() {
88+
return "SonosApiConfiguration [apiKey=" + apiKey + ", apiSecret=" + apiSecret + ", applicationId="
89+
+ applicationId + ", authBaseUrl=" + authBaseUrl + ", clientSideValidationEnabled="
90+
+ clientSideValidationEnabled + ", controlBaseUrl=" + controlBaseUrl + "]";
15991
}
16092

16193
@Override
162-
public boolean equals(Object o)
163-
{
164-
if (this == o) return true;
165-
166-
if (o == null || getClass() != o.getClass()) return false;
167-
168-
SonosApiConfiguration that = (SonosApiConfiguration) o;
169-
170-
return new EqualsBuilder()
171-
.append(applicationId, that.applicationId)
172-
.append(apiKey, that.apiKey)
173-
.append(apiSecret, that.apiSecret)
174-
.append(authBaseUrl, that.authBaseUrl)
175-
.append(controlBaseUrl, that.controlBaseUrl)
176-
.append(clientSideValidationEnabled, that.clientSideValidationEnabled)
177-
.isEquals();
94+
public boolean equals(Object obj) {
95+
if (this == obj)
96+
return true;
97+
if (!(obj instanceof SonosApiConfiguration))
98+
return false;
99+
SonosApiConfiguration other = (SonosApiConfiguration) obj;
100+
return Objects.equals(apiKey, other.apiKey) && Objects.equals(apiSecret, other.apiSecret)
101+
&& Objects.equals(applicationId, other.applicationId) && Objects.equals(authBaseUrl, other.authBaseUrl)
102+
&& Objects.equals(clientSideValidationEnabled, other.clientSideValidationEnabled)
103+
&& Objects.equals(controlBaseUrl, other.controlBaseUrl);
178104
}
179105

180106
@Override
181-
public int hashCode()
182-
{
183-
return new HashCodeBuilder(17, 37)
184-
.append(applicationId)
185-
.append(apiKey)
186-
.append(apiSecret)
187-
.append(authBaseUrl)
188-
.append(controlBaseUrl)
189-
.append(clientSideValidationEnabled)
190-
.toHashCode();
107+
public int hashCode() {
108+
return Objects.hash(apiKey, apiSecret, applicationId, authBaseUrl, clientSideValidationEnabled, controlBaseUrl);
191109
}
192110
}

src/main/java/engineer/nightowl/sonos/api/domain/SonosSessionError.java

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -8,6 +8,7 @@
88
*/
99
public class SonosSessionError extends SonosApiError
1010
{
11+
private static final long serialVersionUID = 9183301150166556145L;
1112
private String sessionId;
1213
private SonosSessionErrorCode errorCode;
1314
}

0 commit comments

Comments
 (0)