/**
* Copyright (c) 2010-2016 by the respective copyright holders.
*
* All rights reserved. This program and the accompanying materials
* are made available under the terms of the Eclipse Public License v1.0
* which accompanies this distribution, and is available at
* http://www.eclipse.org/legal/epl-v10.html
*/
package org.openhab.binding.netatmo.internal.authentication;
import static org.openhab.io.net.http.HttpUtil.executeUrl;
import java.io.ByteArrayInputStream;
import java.io.InputStream;
import org.apache.commons.lang.builder.ToStringBuilder;
import org.openhab.binding.netatmo.internal.messages.AbstractRequest;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
/**
* Gets a renewed refresh token from the Netatmo API to use in future
* measurement requests.
*
* @author Andreas Brenk
* @author Rob Nielsen
* @author Ing. Peter Weiss
* @since 1.4.0
* @see <a
* href="http://dev.netatmo.com/doc/authentication/refreshtoken">refreshtoken</a>
*/
public class RefreshTokenRequest extends AbstractRequest {
private static final String URL = "https://api.netatmo.net/oauth2/token";
private static final String CONTENT = "grant_type=refresh_token&refresh_token=%s&client_id=%s&client_secret=%s&scope=";
private static final String READ_STATION = "read_station";
private static final String READ_CAMERA = "read_camera";
private static final Logger logger = LoggerFactory.getLogger(RefreshTokenRequest.class);
private final String clientId;
private final String clientSecret;
private final String refreshToken;
private final boolean weather;
private final boolean camera;
public RefreshTokenRequest(final String clientId, final String clientSecret, final String refreshToken, boolean weather, boolean camera) {
this.clientId = clientId;
this.clientSecret = clientSecret;
this.refreshToken = refreshToken;
this.weather = weather;
this.camera = camera;
}
@Override
public RefreshTokenResponse execute() {
final StringBuffer buf = new StringBuffer(CONTENT);
if (weather) {
buf.append(READ_STATION);
}
if (camera) {
if (weather) {
buf.append(" ");
}
buf.append(READ_CAMERA);
}
final String content = String.format(buf.toString(), this.refreshToken, this.clientId, this.clientSecret);
String json = null;
try {
json = executeQuery(content);
if (json == null) {
return null;
}
final RefreshTokenResponse response = JSON.readValue(json, RefreshTokenResponse.class);
return response;
} catch (final Exception e) {
throw newException("Could not refresh access token!", e, URL, content, json);
}
}
@Override
public String toString() {
final ToStringBuilder builder = createToStringBuilder();
builder.appendSuper(super.toString());
builder.append("clientId", this.clientId);
builder.append("clientSecret", this.clientSecret);
builder.append("refreshToken", this.refreshToken);
return builder.toString();
}
protected String executeQuery(final String content) throws Exception {
final InputStream stream = new ByteArrayInputStream(content.getBytes(CHARSET));
logger.debug("HTTP Post url='{}' content='{}'", URL, content);
return executeUrl(HTTP_POST, URL, HTTP_HEADERS, stream, HTTP_CONTENT_TYPE, HTTP_REQUEST_TIMEOUT);
}
}