package io.evanwong.oss.hipchat.v2; import io.evanwong.oss.hipchat.v2.emoticons.GetAllEmoticonsRequestBuilder; import io.evanwong.oss.hipchat.v2.emoticons.GetEmoticonRequestBuilder; import io.evanwong.oss.hipchat.v2.oauth.GetSessionRequestBuilder; import io.evanwong.oss.hipchat.v2.rooms.*; import io.evanwong.oss.hipchat.v2.users.*; import org.apache.http.impl.client.CloseableHttpClient; import org.apache.http.impl.client.HttpClients; import org.apache.http.impl.conn.PoolingHttpClientConnectionManager; import org.slf4j.Logger; import org.slf4j.LoggerFactory; import java.io.IOException; import java.util.concurrent.ExecutorService; import java.util.concurrent.Executors; public class HipChatClient { private static final Logger log = LoggerFactory.getLogger(HipChatClient.class); private final CloseableHttpClient httpClient; private final ExecutorService executorService; private String defaultAccessToken; private String baseUrl = "https://api.hipchat.com/v2"; //TODO move this out private static final int MAX_CONNECTIONS = 20; //TODO move this out private static final int MAX_CONNECTIONS_PER_ROUTE = 4; public HipChatClient() { this.httpClient = createDefaultHttpClient(); this.executorService = createDefaultExecutorService(); } public HipChatClient(String defaultAccessToken) { this(); this.defaultAccessToken = defaultAccessToken; } public HipChatClient(String defaultAccessToken, String baseUrl) { this(); this.defaultAccessToken = defaultAccessToken; this.baseUrl = baseUrl; } public HipChatClient(CloseableHttpClient httpClient) { this.httpClient = httpClient; this.executorService = createDefaultExecutorService(); } public HipChatClient(ExecutorService executorService) { this.httpClient = createDefaultHttpClient(); this.executorService = executorService; } public HipChatClient(CloseableHttpClient httpClient, String defaultAccessToken) { this(httpClient); this.defaultAccessToken = defaultAccessToken; } public HipChatClient(ExecutorService executorService, String defaultAccessToken) { this(executorService); this.defaultAccessToken = defaultAccessToken; } public HipChatClient(CloseableHttpClient httpClient, ExecutorService executorService) { this.httpClient = httpClient; this.executorService = executorService; } public HipChatClient(CloseableHttpClient httpClient, ExecutorService executorService, String defaultAccessToken) { this(httpClient, executorService); this.defaultAccessToken = defaultAccessToken; } private static CloseableHttpClient createDefaultHttpClient() { PoolingHttpClientConnectionManager cm = new PoolingHttpClientConnectionManager(); cm.setMaxTotal(MAX_CONNECTIONS); log.debug("Max pool size: {}", MAX_CONNECTIONS); cm.setDefaultMaxPerRoute(MAX_CONNECTIONS_PER_ROUTE); log.debug("Max per route: {}", MAX_CONNECTIONS_PER_ROUTE); return HttpClients.custom().setConnectionManager(cm).build(); } private static ExecutorService createDefaultExecutorService() { //setting the thread pool size equal to the max connections size return Executors.newFixedThreadPool(MAX_CONNECTIONS); } public void setDefaultAccessToken(String defaultAccessToken) { this.defaultAccessToken = defaultAccessToken; } public GetAllRoomsRequestBuilder prepareGetAllRoomsRequestBuilder(String accessToken) { return new GetAllRoomsRequestBuilder(accessToken, baseUrl, httpClient, executorService); } public GetAllRoomsRequestBuilder prepareGetAllRoomsRequestBuilder() { return prepareGetAllRoomsRequestBuilder(defaultAccessToken); } public SendRoomMessageRequestBuilder prepareSendRoomMessageRequestBuilder(String idOrName, String message, String accessToken) { return new SendRoomMessageRequestBuilder(idOrName, message, accessToken, baseUrl, httpClient, executorService); } public SendRoomMessageRequestBuilder prepareSendRoomMessageRequestBuilder(String idOrName, String message) { return prepareSendRoomMessageRequestBuilder(idOrName, message, defaultAccessToken); } public SendRoomNotificationRequestBuilder prepareSendRoomNotificationRequestBuilder(String idOrName, String message, String accessToken) { return new SendRoomNotificationRequestBuilder(idOrName, message, accessToken, baseUrl, httpClient, executorService); } public SendRoomNotificationRequestBuilder prepareSendRoomNotificationRequestBuilder(String idOrName, String message) { return prepareSendRoomNotificationRequestBuilder(idOrName, message, defaultAccessToken); } public CreateRoomRequestBuilder prepareCreateRoomRequestBuilder(String name, String accessToken) { return new CreateRoomRequestBuilder(name, accessToken, baseUrl, httpClient, executorService); } public CreateRoomRequestBuilder prepareCreateRoomRequestBuilder(String name) { return prepareCreateRoomRequestBuilder(name, defaultAccessToken); } public GetRoomRequestBuilder prepareGetRoomRequestBuilder(String idOrName, String accessToken) { return new GetRoomRequestBuilder(idOrName, accessToken, baseUrl, httpClient, executorService); } public GetRoomRequestBuilder prepareGetRoomRequestBuilder(String idOrName) { return prepareGetRoomRequestBuilder(idOrName, defaultAccessToken); } public GetEmoticonRequestBuilder prepareGetEmoticonRequestBuilder(String idOrShortcut) { return prepareGetEmoticonRequestBuilder(idOrShortcut, defaultAccessToken); } public GetEmoticonRequestBuilder prepareGetEmoticonRequestBuilder(String idOrShortcut, String accessToken) { return new GetEmoticonRequestBuilder(idOrShortcut, accessToken, baseUrl, httpClient, executorService); } public GetAllEmoticonsRequestBuilder prepareGetAllEmoticonsRequestBuilder() { return prepareGetAllEmoticonsRequestBuilder(defaultAccessToken); } public GetAllEmoticonsRequestBuilder prepareGetAllEmoticonsRequestBuilder(String accessToken) { return new GetAllEmoticonsRequestBuilder(accessToken, baseUrl, httpClient, executorService); } public DeleteRoomRequestBuilder prepareDeleteRoomRequestBuilder(String roomIdOrName) { return prepareDeleteRoomRequestBuilder(roomIdOrName, defaultAccessToken); } public DeleteRoomRequestBuilder prepareDeleteRoomRequestBuilder(String roomIdOrName, String accessToken) { return new DeleteRoomRequestBuilder(roomIdOrName, accessToken, baseUrl, httpClient, executorService); } public RemoveRoomMemberRequestBuilder prepareRemoveRoomMemberRequestBuilder(String userIdOrEmail, String roomIdOrName) { return prepareRemoveRoomMemberRequestBuilder(userIdOrEmail, roomIdOrName, defaultAccessToken); } public RemoveRoomMemberRequestBuilder prepareRemoveRoomMemberRequestBuilder(String userIdOrEmail, String roomIdOrName, String accessToken) { return new RemoveRoomMemberRequestBuilder(userIdOrEmail, roomIdOrName, accessToken, baseUrl, httpClient, executorService); } public AddRoomMemberRequestBuilder prepareAddRoomMemberRequestBuilder(String userIdOrEmail, String roomIdOrName) { return prepareAddRoomMemberRequestBuilder(userIdOrEmail, roomIdOrName, defaultAccessToken); } public AddRoomMemberRequestBuilder prepareAddRoomMemberRequestBuilder(String userIdOrEmail, String roomIdOrName, String accessToken) { return new AddRoomMemberRequestBuilder(userIdOrEmail, roomIdOrName, accessToken, baseUrl, httpClient, executorService); } public SetTopicRequestBuilder prepareSetTopicRequestBuilder(String roomIdOrName, String topic) { return prepareSetTopicRequestBuilder(roomIdOrName, topic, defaultAccessToken); } public SetTopicRequestBuilder prepareSetTopicRequestBuilder(String roomIdOrName, String topic, String accessToken) { return new SetTopicRequestBuilder(roomIdOrName, topic, accessToken, baseUrl, httpClient, executorService); } public UpdateRoomRequestBuilder prepareUpdateRoomRequestBuilder(String roomIdOrName) { return prepareUpdateRoomRequestBuilder(roomIdOrName, defaultAccessToken); } public UpdateRoomRequestBuilder prepareUpdateRoomRequestBuilder(String roomIdOrName, String accessToken) { return new UpdateRoomRequestBuilder(roomIdOrName, accessToken, baseUrl, httpClient, executorService); } public CreateUserRequestBuilder prepareCreateUserRequestBuilder(String username, String password, String emailaddress, String accessToken) { return new CreateUserRequestBuilder(username, password, emailaddress, accessToken, baseUrl, httpClient, executorService); } public CreateUserRequestBuilder prepareCreateUserRequestBuilder(String username, String password, String emailaddress) { return prepareCreateUserRequestBuilder(username, password, emailaddress, defaultAccessToken); } public GetAllUsersRequestBuilder prepareGetAllUsersRequestBuilder(String accessToken) { return new GetAllUsersRequestBuilder(accessToken, baseUrl, httpClient, executorService); } public GetAllUsersRequestBuilder prepareGetAllUsersRequestBuilder() { return prepareGetAllUsersRequestBuilder(defaultAccessToken); } private ViewUserRequestBuilder prepareViewUserRequestBuilder(String idOrEmail, String accessToken) { return new ViewUserRequestBuilder(idOrEmail, accessToken, baseUrl, httpClient, executorService); } public ViewUserRequestBuilder prepareViewUserRequestBuilder(String idOrEmail) { return prepareViewUserRequestBuilder(idOrEmail, defaultAccessToken); } private DeleteUserRequestBuilder prepareDeleteUserRequestBuilder(String idOrEmail, String accessToken) { return new DeleteUserRequestBuilder(idOrEmail, accessToken, baseUrl, httpClient, executorService); } public DeleteUserRequestBuilder prepareDeleteUserRequestBuilder(String idOrEmail) { return prepareDeleteUserRequestBuilder(idOrEmail, defaultAccessToken); } public PrivateMessageUserRequestBuilder preparePrivateMessageUserRequestBuilder(String idOrEmail, String message) { return preparePrivateMessageUserRequestBuilder(idOrEmail, message, defaultAccessToken); } public PrivateMessageUserRequestBuilder preparePrivateMessageUserRequestBuilder(String idOrEmail, String message, String accessToken) { return new PrivateMessageUserRequestBuilder(idOrEmail, message, accessToken, baseUrl, httpClient, executorService); } public void close() { log.info("Shutting down..."); try { httpClient.close(); } catch (IOException e) { log.error("Failed to close the HttpClient.", e); } executorService.shutdown(); } public GetSessionRequestBuilder prepareGetSessionRequestBuilder() { return new GetSessionRequestBuilder(defaultAccessToken, baseUrl, httpClient, executorService); } public GetSessionRequestBuilder prepareGetSessionRequestBuilder(String accessToken) { return new GetSessionRequestBuilder(accessToken, baseUrl, httpClient, executorService); } }