Skip to content

Commit eaaa466

Browse files
Make client (auto-)closeable, and allow overriding the HttpClient
Tidy-up with logging statements
1 parent 5af35e2 commit eaaa466

2 files changed

Lines changed: 48 additions & 18 deletions

File tree

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

Lines changed: 46 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,19 @@
11
package engineer.nightowl.sonos.api;
22

3-
import engineer.nightowl.sonos.api.resource.*;
3+
import engineer.nightowl.sonos.api.resource.AudioClipResource;
4+
import engineer.nightowl.sonos.api.resource.AuthorizeResource;
5+
import engineer.nightowl.sonos.api.resource.FavoriteResource;
6+
import engineer.nightowl.sonos.api.resource.GroupResource;
7+
import engineer.nightowl.sonos.api.resource.GroupVolumeResource;
8+
import engineer.nightowl.sonos.api.resource.HomeTheaterResource;
9+
import engineer.nightowl.sonos.api.resource.HouseholdResource;
10+
import engineer.nightowl.sonos.api.resource.MusicServiceAccountsResource;
11+
import engineer.nightowl.sonos.api.resource.PlaybackMetadataResource;
12+
import engineer.nightowl.sonos.api.resource.PlaybackResource;
13+
import engineer.nightowl.sonos.api.resource.PlaybackSessionResource;
14+
import engineer.nightowl.sonos.api.resource.PlayerVolumeResource;
15+
import engineer.nightowl.sonos.api.resource.PlaylistResource;
16+
import engineer.nightowl.sonos.api.resource.SettingsResource;
417
import org.apache.http.impl.client.CloseableHttpClient;
518
import org.apache.http.impl.client.HttpClientBuilder;
619
import org.slf4j.Logger;
@@ -9,7 +22,7 @@
922
import java.io.IOException;
1023
import java.util.Properties;
1124

12-
public class SonosApiClient
25+
public class SonosApiClient implements AutoCloseable
1326
{
1427
// Resources
1528
private final AudioClipResource audioClipResource;
@@ -30,25 +43,38 @@ public class SonosApiClient
3043
// Internal classes
3144
private final Logger logger = LoggerFactory.getLogger(getClass());
3245
private final Properties properties = new Properties();
46+
3347
// Can be overridden by implementing applications
3448
private SonosApiConfiguration configuration;
3549
private CloseableHttpClient httpClient;
3650

3751
/**
3852
* Main client for Sonos API.
3953
*
40-
* @param configuration - a {@link engineer.nightowl.sonos.api.SonosApiConfiguration} containing integration
54+
* @param configuration a {@link engineer.nightowl.sonos.api.SonosApiConfiguration} containing integration
4155
* information such as API keys
56+
*
57+
* @see SonosApiClient#SonosApiClient(SonosApiConfiguration, CloseableHttpClient)
4258
*/
4359
public SonosApiClient(final SonosApiConfiguration configuration)
60+
{
61+
this(configuration, null);
62+
}
63+
64+
/**
65+
* Create a client with a custom HTTP client
66+
*
67+
* @param configuration a {@link engineer.nightowl.sonos.api.SonosApiConfiguration} containing integration
68+
* information such as API keys
69+
* @param httpClient a custom {@link CloseableHttpClient} - if null, a default client is initialised
70+
*/
71+
public SonosApiClient(final SonosApiConfiguration configuration, final CloseableHttpClient httpClient)
4472
{
4573
loadProperties();
46-
if (logger.isInfoEnabled())
47-
{
48-
logger.info("Initialising sonos-api-java:{}", properties.getProperty("sonosapijava.version"));
49-
}
74+
logger.info("Initialising sonos-api-java:{}", properties.getProperty("sonosapijava.version"));
75+
5076
this.configuration = configuration;
51-
httpClient = generateHttpClient();
77+
this.httpClient = (httpClient == null ? generateHttpClient() : httpClient);
5278

5379
// Setup resources
5480
audioClipResource = new AudioClipResource(this);
@@ -74,6 +100,7 @@ public SonosApiClient(final SonosApiConfiguration configuration)
74100
*/
75101
private CloseableHttpClient generateHttpClient()
76102
{
103+
logger.debug("Using default HttpClient");
77104
return HttpClientBuilder.create().build();
78105
}
79106

@@ -87,7 +114,7 @@ public void closeHttpClient()
87114
httpClient.close();
88115
} catch (final IOException ioe)
89116
{
90-
logger.warn("Unable to close HTTP client", ioe);
117+
logger.warn("Unable to close HttpClient", ioe);
91118
}
92119
}
93120

@@ -280,4 +307,14 @@ public SettingsResource settings()
280307
{
281308
return settingsResource;
282309
}
310+
311+
312+
/**
313+
* Closes the HttpClient
314+
*/
315+
@Override
316+
public void close()
317+
{
318+
closeHttpClient();
319+
}
283320
}

src/main/java/engineer/nightowl/sonos/api/resource/BaseResource.java

Lines changed: 2 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -67,10 +67,7 @@ class BaseResource
6767
*/
6868
<T> T callApi(final HttpUriRequest request, final Class<T> type) throws SonosApiClientException, SonosApiError
6969
{
70-
if (logger.isDebugEnabled())
71-
{
72-
logger.debug("Sending request to " + request.getURI());
73-
}
70+
logger.debug("Sending request to {}", request.getURI());
7471
final CloseableHttpResponse response;
7572
try
7673
{
@@ -92,11 +89,7 @@ <T> T callApi(final HttpUriRequest request, final Class<T> type) throws SonosApi
9289
throw new SonosApiClientException("Unable to convert response body", ioe);
9390
}
9491

95-
if (logger.isDebugEnabled())
96-
{
97-
final String debugMsg = String.format("Raw response from API: %s", new String(bytes));
98-
logger.debug(debugMsg);
99-
}
92+
logger.debug("Raw response from API: {}", new String(bytes));
10093

10194
// Get type from Sonos response - not always possible
10295
final SonosType sonosDeclaredClass = getTypeFromHeader(response);

0 commit comments

Comments
 (0)