package com.juick.components.configuration; import com.fasterxml.jackson.databind.ObjectMapper; import com.juick.server.component.JuickServerComponent; import org.apache.commons.lang3.StringUtils; import org.slf4j.Logger; import org.slf4j.LoggerFactory; import org.springframework.beans.factory.annotation.Value; import org.springframework.context.annotation.Bean; import org.springframework.context.annotation.Configuration; import org.springframework.context.annotation.Lazy; import org.springframework.http.HttpMethod; import org.springframework.http.ResponseEntity; import org.springframework.http.client.ClientHttpRequestInterceptor; import org.springframework.http.client.InterceptingClientHttpRequestFactory; import org.springframework.http.client.support.BasicAuthorizationInterceptor; import org.springframework.scheduling.annotation.EnableScheduling; import org.springframework.web.client.HttpClientErrorException; import org.springframework.web.client.RestTemplate; import org.springframework.web.socket.client.WebSocketConnectionManager; import org.springframework.web.socket.client.standard.StandardWebSocketClient; import org.springframework.web.util.UriComponentsBuilder; import javax.inject.Inject; import java.io.IOException; import java.util.Collections; import java.util.List; @Lazy @Configuration @EnableScheduling public class JuickServerWebsocketConfiguration { private static final Logger logger = LoggerFactory.getLogger(JuickServerWebsocketConfiguration.class); @Value("${websocket_url:ws://localhost:8080/ws/}") private String baseUri; @Value("${api_user:juick}") private String serviceUser; @Value("${api_password:secret}") private String servicePassword; @Inject ObjectMapper jsonMapper; @Inject private JuickServerComponent juickServerComponent; @Bean public RestTemplate rest() { RestTemplate rest = new RestTemplate(); List interceptors = Collections.singletonList( new BasicAuthorizationInterceptor(serviceUser, servicePassword)); rest.setRequestFactory(new InterceptingClientHttpRequestFactory(rest.getRequestFactory(), interceptors)); return rest; } @Bean public WebSocketConnectionManager connectionManager() { String hash = StringUtils.EMPTY; try { ResponseEntity response = rest().exchange("https://api.juick.com/auth", HttpMethod.GET, null, String.class); hash = jsonMapper.readValue(response.getBody(), String.class); } catch (HttpClientErrorException | IOException e) { logger.warn("service component is not authenticated", e); } String websocketURI = UriComponentsBuilder.fromUriString(baseUri) .queryParam("hash", hash).build().toUriString(); WebSocketConnectionManager manager = new WebSocketConnectionManager(client(), juickServerComponent, websocketURI); return manager; } @Bean public StandardWebSocketClient client() { return new StandardWebSocketClient(); } }