/// <summary> /// Turn an IUrchinActivity into the key/value pairs necessary for building /// the URI to track with Urchin. /// </summary> /// <param name="activity">Activity to turn into key/value pairs.</param> /// <returns>Enumerable of key/value pairs representing the activity.</returns> internal static IEnumerable <KeyValuePair <string, string> > GetParameters(IUrchinActivity activity) { if (activity is CampaignActivity) { return(GetParameters((CampaignActivity)activity)); } if (activity is EventActivity) { return(GetParameters((EventActivity)activity)); } if (activity is PageViewActivity) { return(GetParameters((PageViewActivity)activity)); } if (activity is SocialActivity) { return(GetParameters((SocialActivity)activity)); } if (activity is TimedEventActivity) { return(GetParameters((TimedEventActivity)activity)); } if (activity is TransactionActivity) { return(GetParameters((TransactionActivity)activity)); } if (activity is TransactionItemActivity) { return(GetParameters((TransactionItemActivity)activity)); } Debug.Assert(false, "Unknown Activity type"); return(Enumerable.Empty <KeyValuePair <string, string> >()); }
/// <summary> /// Create an Urchin style URI from an activity and custom variables. /// </summary> /// <param name="activity">Activity to create a URI for.</param> /// <param name="customVariables">Custom variables to include in the URI.</param> /// <returns>Uri that when requested will track this activity.</returns> public Uri CreateUri(IUrchinActivity activity, ScopedCustomVariableSlots[] customVariables) { var parameters = BuildParameterList(activity, customVariables); CarryForwardLastPageParameter(activity, parameters); var uriBuilder = new UriBuilder(configuration.UseSsl ? secureTrackingEndpoint : trackingEndpoint) { Query = CreateQueryString(parameters) }; return uriBuilder.Uri; }
/// <summary> /// Carry forward the utmp page parameter value to future event activities to know which page they occurred on. /// </summary> /// <param name="activity">Current activity being processed.</param> /// <param name="parameters">Current parameters for this request.</param> private void CarryForwardParameters(IUrchinActivity activity, ICollection <KeyValuePair <string, string> > parameters) { if ((activity is EventActivity || activity is TimedEventActivity) && lastUtmpParameterValue != null) { parameters.Add(KeyValuePair.Create("utmp", lastUtmpParameterValue)); } if (parameters.Any(k => k.Key == "utmp")) { lastUtmpParameterValue = parameters.First(p => p.Key == "utmp").Value; } }
/// <summary> /// Track this activity in analytics. /// </summary> /// <param name="activity">Activity to track in analytics.</param> /// <param name="activityCustomVariables">Activity scoped custom variable slots to record for this activity.</param> public void Track(IUrchinActivity activity, ScopedCustomVariableSlots activityCustomVariables = null) { if (activityCustomVariables != null && activityCustomVariables.Scope != CustomVariableScope.Activity) throw new ArgumentException("Custom variable slots must be scoped to activity", "activityCustomVariables"); if (activity is AutoTimedEventActivity) ((AutoTimedEventActivity)activity).End(); sessionManager.Hit(); var trackingUri = tracker.CreateUri(activity, new[] { VisitorCustomVariables, SessionCustomVariables, activityCustomVariables }); sender(trackingUri); if (activity is PageViewActivity) sessionManager.Referrer = new Uri("http://" + hostName + ((PageViewActivity)activity).Page); }
/// <summary> /// Track this activity in analytics. /// </summary> /// <param name="activity">Activity to track in analytics.</param> /// <param name="activityCustomVariables">Activity scoped custom variable slots to record for this activity.</param> public void Track(IUrchinActivity activity, CustomVariableSlots activityCustomVariables = null) { if (activity is AutoTimedEventActivity) ((AutoTimedEventActivity)activity).End(); var entry = new UrchinActivityEntry { Activity = activity, CustomVariables = GetFinalCustomVariables(activityCustomVariables) }; if (tracker == null) queue.Enqueue(entry); else tracker.Track(entry); }
/// <summary> /// Turn an IUrchinActivity into the key/value pairs necessary for building /// the URI to track with Urchin. /// </summary> /// <param name="activity">Activity to turn into key/value pairs.</param> /// <returns>Enumerable of key/value pairs representing the activity.</returns> internal static IEnumerable<KeyValuePair<string, string>> GetParameters(IUrchinActivity activity) { if (activity is CampaignActivity) return GetParameters((CampaignActivity)activity); if (activity is EventActivity) return GetParameters((EventActivity)activity); if (activity is PageViewActivity) return GetParameters((PageViewActivity)activity); if (activity is SocialActivity) return GetParameters((SocialActivity)activity); if (activity is TimedEventActivity) return GetParameters((TimedEventActivity)activity); if (activity is TransactionActivity) return GetParameters((TransactionActivity)activity); Debug.Assert(false, "Unknown Activity type"); return Enumerable.Empty<KeyValuePair<string, string>>(); }
/// <summary> /// Track this activity in analytics. /// </summary> /// <param name="activity">Activity to track in analytics.</param> /// <param name="activityCustomVariables">Activity scoped custom variable slots to record for this activity.</param> public void Track(IUrchinActivity activity, CustomVariableSlots activityCustomVariables = null) { if (activity is AutoTimedEventActivity) { ((AutoTimedEventActivity)activity).End(); } var entry = new UrchinActivityEntry { Activity = activity, CustomVariables = GetFinalCustomVariables(activityCustomVariables) }; if (tracker == null) { queue.Enqueue(entry); } else { tracker.Track(entry); } }
/// <summary> /// Carry forward the utmp page parameter value to future event activities to know which page they occurred on. /// </summary> /// <param name="activity">Current activity being processed.</param> /// <param name="parameters">Current parameters for this request.</param> private void CarryForwardParameters(IUrchinActivity activity, ICollection<KeyValuePair<string, string>> parameters) { if ((activity is EventActivity || activity is TimedEventActivity) && lastUtmpParameterValue != null) parameters.Add(KeyValuePair.Create("utmp", lastUtmpParameterValue)); if (parameters.Any(k => k.Key == "utmp")) lastUtmpParameterValue = parameters.First(p => p.Key == "utmp").Value; }
/// <summary> /// Build a list of the parameters required based on configuration, environment, activity, session, custom variables and state. /// </summary> /// <param name="activity">Activity to include in the parameter list.</param> /// <param name="customVariables">Custom variables to include in the parameter list.</param> /// <returns>List of key/value pairs containing the parameters necessary for this request.</returns> private List<KeyValuePair<string, string>> BuildParameterList(IUrchinActivity activity, ScopedCustomVariableSlots[] customVariables) { var finalCustomVariables = GetFinalCustomVariables(customVariables); return GetParameters() .Concat(GetParameters(environment)) .Concat(GetParameters(configuration)) .Concat(GetParameters(sessionManager, configuration.GetHostNameHash())) .Concat(GetParameters(finalCustomVariables)) .Concat(UrchinActivityTracker.GetParameters(activity)) .ToList(); }