/** * Licensed to the Apache Software Foundation (ASF) under one or more * contributor license agreements. See the NOTICE file distributed with * this work for additional information regarding copyright ownership. * The ASF licenses this file to You under the Apache License, Version 2.0 * (the "License"); you may not use this file except in compliance with * the License. You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. */ package org.apache.camel.component.hipchat; import java.io.IOException; import java.util.Calendar; import java.util.List; import java.util.Map; import java.util.TimeZone; import com.fasterxml.jackson.databind.ObjectMapper; import com.fasterxml.jackson.databind.type.MapType; import com.fasterxml.jackson.databind.type.TypeFactory; import org.apache.camel.Exchange; import org.apache.camel.Processor; import org.apache.camel.impl.ScheduledPollConsumer; import org.apache.camel.util.URISupport; import org.apache.http.client.methods.CloseableHttpResponse; import org.apache.http.client.methods.HttpGet; import org.apache.http.impl.client.CloseableHttpClient; import org.apache.http.impl.client.HttpClients; import org.slf4j.Logger; import org.slf4j.LoggerFactory; /** * The Hipchat consumer consumes messages from a list of users. */ public class HipchatConsumer extends ScheduledPollConsumer { public static final long DEFAULT_CONSUMER_DELAY = 5 * 1000; private static final Logger LOG = LoggerFactory.getLogger(HipchatConsumer.class); private static final MapType MAP_TYPE = TypeFactory.defaultInstance().constructMapType(Map.class, String.class, Object.class); private static final ObjectMapper MAPPER = new ObjectMapper(); private static final CloseableHttpClient HTTP_CLIENT = HttpClients.createDefault(); private transient String hipchatConsumerToString; public HipchatConsumer(HipchatEndpoint endpoint, Processor processor) { super(endpoint, processor); } @Override protected int poll() throws Exception { int messageCount = 0; for (String user : getConfig().consumableUsers()) { Exchange exchange = getEndpoint().createExchange(); processExchangeForUser(user, exchange); messageCount++; } return messageCount; } private void processExchangeForUser(String user, Exchange exchange) throws Exception { String urlPath = String.format(getMostRecentMessageUrl(), user); LOG.debug("Polling HipChat Api " + urlPath + " for new messages at " + Calendar.getInstance(TimeZone.getTimeZone("UTC")).getTime()); HttpGet httpGet = new HttpGet(getConfig().hipChatUrl() + urlPath); CloseableHttpResponse response = executeGet(httpGet); exchange.getIn().setHeader(HipchatConstants.FROM_USER, user); processApiResponse(exchange, response); } private void processApiResponse(Exchange exchange, CloseableHttpResponse response) throws Exception { try { Map<String, Object> jsonMap = MAPPER.readValue(response.getEntity().getContent(), MAP_TYPE); LOG.debug("Hipchat response " + response + ", json: " + MAPPER.writeValueAsString(jsonMap)); if (jsonMap != null && jsonMap.size() > 0) { List<Map<String, Object>> items = (List<Map<String, Object>>) jsonMap.get(HipchatApiConstants.API_ITEMS); if (items != null && items.size() > 0) { try { Map<String, Object> item = items.get(0); String date = (String) item.get(HipchatApiConstants.API_DATE); String message = (String) item.get(HipchatApiConstants.API_MESSAGE); LOG.debug("Setting exchange body: " + message + ", header " + HipchatConstants.MESSAGE_DATE + ": " + date); exchange.getIn().setHeader(HipchatConstants.FROM_USER_RESPONSE_STATUS, response.getStatusLine()); exchange.getIn().setHeader(HipchatConstants.MESSAGE_DATE, date); exchange.getIn().setBody(message); getProcessor().process(exchange); } catch (Exception e) { throw new HipchatException("Error parsing Json response from Hipchat API", e); } } } } finally { response.close(); } } protected CloseableHttpResponse executeGet(HttpGet httpGet) throws IOException { return HTTP_CLIENT.execute(httpGet); } private String getMostRecentMessageUrl() { return getConfig().withAuthToken(HipchatApiConstants.URI_PATH_USER_LATEST_PRIVATE_CHAT) + "&" + HipchatApiConstants.DEFAULT_MAX_RESULT; } private HipchatConfiguration getConfig() { return getEndpoint().getConfiguration(); } @Override public HipchatEndpoint getEndpoint() { return (HipchatEndpoint)super.getEndpoint(); } @Override public String toString() { if (hipchatConsumerToString == null) { hipchatConsumerToString = "HipchatConsumer[" + URISupport.sanitizeUri(getEndpoint().getEndpointUri()) + "]"; } return hipchatConsumerToString; } }