2 * Copyright (c) 2010-2023 Contributors to the openHAB project
4 * See the NOTICE file(s) distributed with this work for additional
7 * This program and the accompanying materials are made available under the
8 * terms of the Eclipse Public License 2.0 which is available at
9 * http://www.eclipse.org/legal/epl-2.0
11 * SPDX-License-Identifier: EPL-2.0
13 package org.openhab.binding.mielecloud.internal.webservice.request;
15 import java.nio.charset.StandardCharsets;
16 import java.util.Optional;
17 import java.util.concurrent.TimeUnit;
19 import org.eclipse.jdt.annotation.NonNullByDefault;
20 import org.eclipse.jetty.client.HttpClient;
21 import org.eclipse.jetty.client.api.Request;
22 import org.eclipse.jetty.client.util.StringContentProvider;
23 import org.eclipse.jetty.http.HttpMethod;
24 import org.openhab.binding.mielecloud.internal.webservice.exception.MieleWebserviceInitializationException;
25 import org.openhab.binding.mielecloud.internal.webservice.language.LanguageProvider;
26 import org.openhab.core.io.net.http.HttpClientFactory;
29 * Default implementation of {@link RequestFactory}.
31 * @author Björn Lange - Initial contribution
34 public class RequestFactoryImpl implements RequestFactory {
35 private static final long REQUEST_TIMEOUT = 5;
36 private static final long EXTENDED_REQUEST_TIMEOUT = 10;
37 private static final TimeUnit REQUEST_TIMEOUT_UNIT = TimeUnit.SECONDS;
39 private final HttpClient httpClient;
40 private final LanguageProvider languageProvider;
43 * Creates a new {@link RequestFactoryImpl}.
45 * @param httpClientFactory Factory for obtaining a {@link HttpClient}.
46 * @param languageProvider Provider for the language to use for new requests.
47 * @throws MieleWebserviceInitializationException if creating and starting a new {@link HttpClient} fails.
49 public RequestFactoryImpl(HttpClientFactory httpClientFactory, LanguageProvider languageProvider) {
50 this.httpClient = httpClientFactory.createHttpClient("mielecloud");
52 this.httpClient.start();
53 } catch (Exception e) {
54 throw new MieleWebserviceInitializationException("Failed to start HttpClient", e);
56 this.languageProvider = languageProvider;
59 private Request createRequestWithDefaultHeaders(String url, String accessToken) {
60 return httpClient.newRequest(url).header("Content-type", "application/json").header("Authorization",
61 "Bearer " + accessToken);
64 private Request decorateWithLanguageParameter(Request request) {
65 Optional<String> language = languageProvider.getLanguage();
66 if (language.isPresent() && !language.get().isEmpty()) {
67 return request.param("language", language.get());
73 private Request decorateWithAcceptLanguageHeader(Request request) {
74 Optional<String> language = languageProvider.getLanguage();
75 if (language.isPresent() && !language.get().isEmpty()) {
76 return request.header("Accept-Language", language.get());
82 private Request createDefaultHttpRequest(String url, String accessToken, long timeout) {
83 return decorateWithLanguageParameter(createRequestWithDefaultHeaders(url, accessToken)).header("Accept", "*/*")
84 .timeout(timeout, REQUEST_TIMEOUT_UNIT);
88 public Request createGetRequest(String url, String accessToken) {
89 return createDefaultHttpRequest(url, accessToken, REQUEST_TIMEOUT).method(HttpMethod.GET);
93 public Request createPutRequest(String url, String accessToken, String jsonContent) {
94 return createDefaultHttpRequest(url, accessToken, EXTENDED_REQUEST_TIMEOUT).method(HttpMethod.PUT)
95 .content(new StringContentProvider("application/json", jsonContent, StandardCharsets.UTF_8));
99 public Request createPostRequest(String url, String accessToken) {
100 return createDefaultHttpRequest(url, accessToken, REQUEST_TIMEOUT).method(HttpMethod.POST);
104 public Request createSseRequest(String url, String accessToken) {
105 return decorateWithAcceptLanguageHeader(createRequestWithDefaultHeaders(url, accessToken)).header("Accept",
106 "text/event-stream");
110 public void close() throws Exception {