/**
* Copyright 2014 ArcBees Inc.
*
* Licensed 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 com.arcbees.analytics.server;
import java.util.Map;
import java.util.logging.Logger;
import com.arcbees.analytics.server.options.ServerOptionsCallback;
import com.arcbees.analytics.server.options.TrackerNameOptionsCallback;
import com.arcbees.analytics.shared.AnalyticsImpl;
import com.arcbees.analytics.shared.AnalyticsPlugin;
import com.arcbees.analytics.shared.GaAccount;
import com.arcbees.analytics.shared.HitType;
import com.arcbees.analytics.shared.options.AnalyticsOptions;
import com.arcbees.analytics.shared.options.CreateOptions;
import com.arcbees.analytics.shared.options.GeneralOptions;
import com.arcbees.analytics.shared.options.TimingOptions;
import com.google.inject.Inject;
import com.google.inject.Provider;
import com.google.inject.Singleton;
@Singleton
public class ServerAnalytics extends AnalyticsImpl {
private static final Logger LOGGER = Logger.getLogger(ServerAnalytics.class.getName());
private final Provider<ServerOptionsCallback> serverOptionsCallbackProvider;
@Inject
ServerAnalytics(
Provider<ServerOptionsCallback> serverOptionsCallbackProvider,
@GaAccount String userAccount) {
super(userAccount);
this.serverOptionsCallbackProvider = serverOptionsCallbackProvider;
}
@Override
public CreateOptions create(final String userAccount) {
final Map<String, String> trackerNames = serverOptionsCallbackProvider.get().getTrackerNames();
return new AnalyticsOptions(new TrackerNameOptionsCallback() {
@Override
public void onCallback(String trackerName) {
trackerNames.put(trackerName, userAccount);
}
}).createOptions();
}
@Override
public void enablePlugin(AnalyticsPlugin plugin) {
// Noop this has no affect on the server
}
@Override
public TimingOptions endTimingEvent(String trackerName, String timingCategory,
String timingVariableName) {
Map<String, Long> timingEvents = serverOptionsCallbackProvider.get().getTimingEvents();
final String key = getTimingKey(timingCategory, timingVariableName);
if (timingEvents.containsKey(key)) {
return sendTiming(trackerName, timingCategory, timingVariableName,
(int) (System.currentTimeMillis() - timingEvents.remove(key)));
}
LOGGER.severe("Timing Event Ended before it was started: " + key);
return new AnalyticsOptions(new TrackerNameOptionsCallback() {
@Override
public void onCallback(String trackerName) {
// Do nothing a timing event was ended before it was started. This is here just to
// stop a
// crash.
}
}).timingOptions(timingCategory, timingVariableName, 0);
}
@Override
public AnalyticsOptions send(String trackerName, HitType hitType) {
final ServerOptionsCallback options = serverOptionsCallbackProvider.get();
final Map<String, String> trackerNames = options.getTrackerNames();
if (trackerName != null) {
options.putText("tid", trackerNames.get(trackerName));
}
options.putText("hitType", hitType.getFieldName());
return new AnalyticsOptions(options);
}
@Override
public GeneralOptions setGlobalSettings() {
return new AnalyticsOptions(new TrackerNameOptionsCallback() {
@Override
public void onCallback(String trackerName) {
// Do nothing, this call is not valid on the server.
}
}).generalOptions();
}
@Override
public void startTimingEvent(String timingCategory, String timingVariableName) {
Map<String,Long> timingEvents = serverOptionsCallbackProvider.get().getTimingEvents();
timingEvents.put(getTimingKey(timingCategory, timingVariableName),
System.currentTimeMillis());
}
}