/** * ============================================================================= * * ORCID (R) Open Source * http://orcid.org * * Copyright (c) 2012-2014 ORCID, Inc. * Licensed under an MIT-Style License (MIT) * http://orcid.org/open-source-license * * This copyright and license information (including a link to the full license) * shall be included in its entirety in all copies or substantial portion of * the software. * * ============================================================================= */ package org.orcid.core.analytics.client.google; import java.io.IOException; import java.io.OutputStreamWriter; import java.net.HttpURLConnection; import java.net.URL; import javax.ws.rs.HttpMethod; import org.apache.commons.lang3.StringUtils; import org.orcid.core.analytics.AnalyticsData; import org.orcid.core.analytics.client.AnalyticsClient; import org.slf4j.Logger; import org.slf4j.LoggerFactory; import org.springframework.beans.factory.annotation.Value; import com.fasterxml.jackson.dataformat.yaml.snakeyaml.util.UriEncoder; public class UniversalAnalyticsClient implements AnalyticsClient { private static final Logger LOGGER = LoggerFactory.getLogger(UniversalAnalyticsClient.class); protected static final String PROTOCOL_VERSION_PARAM = "v"; protected static final String PROTOCOL_VERSION_VALUE = "1"; protected static final String TRACKING_ID_PARAM = "tid"; protected static final String CLIENT_ID_PARAM = "cid"; protected static final String IP_ADDRESS_PARAM = "uip"; protected static final String USER_AGENT_PARAM = "ua"; protected static final String HIT_TYPE_PARAM = "t"; protected static final String HIT_TYPE_VALUE_EVENT = "event"; protected static final String EVENT_CATEGORY_PARAM = "ec"; protected static final String EVENT_ACTION_PARAM = "ea"; protected static final String EVENT_LABEL_PARAM = "el"; protected static final String API_VERSION_PARAM = "cd1"; protected static final String CONTENT_TYPE_PARAM = "cd2"; protected static final String RESPONSE_CODE_PARAM = "cd3"; protected static final String CLIENT_PARAM = "cd4"; @Value("${org.orcid.core.api.analytics.trackingCode:}") private String analyticsTrackingCode; @Value("${org.orcid.core.api.analytics.endpoint:}") private String analyticsEndpoint; @Override public void sendAnalyticsData(AnalyticsData data) { if (!StringUtils.isBlank(analyticsTrackingCode)) { recordEvent(data); } } private void recordEvent(AnalyticsData data) { String payload = getEventPayload(data); postData(payload); } protected void postData(String payload) { try { URL url = new URL(analyticsEndpoint); HttpURLConnection connection = (HttpURLConnection) url.openConnection(); connection.setRequestMethod(HttpMethod.POST); connection.setDoOutput(true); OutputStreamWriter outputStream = new OutputStreamWriter(connection.getOutputStream()); outputStream.write(payload); outputStream.flush(); outputStream.close(); int response = connection.getResponseCode(); if (response != 200) { LOGGER.warn("Analytics: received response code " + response); LOGGER.warn("Payload was: " + payload); } connection.disconnect(); } catch (IOException e) { LOGGER.warn("Error sending analytics data", e); } } private String getEventPayload(AnalyticsData data) { StringBuilder payload = new StringBuilder(PROTOCOL_VERSION_PARAM).append("=").append(PROTOCOL_VERSION_VALUE); payload.append("&").append(TRACKING_ID_PARAM).append("=").append(analyticsTrackingCode); payload.append("&").append(CLIENT_ID_PARAM).append("=").append(data.getClientId()); payload.append("&").append(IP_ADDRESS_PARAM).append("=").append(data.getIpAddress()); payload.append("&").append(USER_AGENT_PARAM).append("=").append(data.getUserAgent()); payload.append("&").append(HIT_TYPE_PARAM).append("=").append(HIT_TYPE_VALUE_EVENT); payload.append("&").append(EVENT_ACTION_PARAM).append("=").append(data.getMethod()); payload.append("&").append(EVENT_CATEGORY_PARAM).append("=").append(data.getCategory()); payload.append("&").append(EVENT_LABEL_PARAM).append("=").append(data.getUrl()); payload.append("&").append(API_VERSION_PARAM).append("=").append(data.getApiVersion()); payload.append("&").append(CONTENT_TYPE_PARAM).append("=").append(data.getContentType()); payload.append("&").append(RESPONSE_CODE_PARAM).append("=").append(data.getResponseCode()); payload.append("&").append(CLIENT_PARAM).append("=").append(data.getClientDetailsString()); return UriEncoder.encode(payload.toString()); } }