/// <summary>
        /// Do something with the incoming ActivityAttempt.  In our case we pass it to the SLKAssignmentBroker for storage in the SLK DB
        /// </summary>
        /// <param name="trackingData"></param>
        public void Submit(ActivityAttempt trackingData)
        {
            Trace.WriteLine(
                String.Format("Assignment Uploaded: ID = {0}, Status = {1}, ScaledScore = {2}, Identity = {3}",
                              trackingData.LearnerAssignmentIdentifier,
                              trackingData.CompletionStatus,
                              trackingData.Score.Scaled,
                              System.Security.Principal.WindowsIdentity.GetCurrent().Name
                              ));

            try
            {
                SLKAssignmentBroker.DBConnection = ServiceConfiguration.Default.DatabaseConnection;
                SLKAssignmentBroker.ProcessActivityAttempt(trackingData);
            }
            catch (SLKAssignmentException slkae)
            {
                Trace.WriteLine(
                    String.Format("Error submitting assignment: ID = {0}, Error = {1}",
                                  trackingData.LearnerAssignmentIdentifier,
                                  slkae.Message
                                  ));

                WebOperationContext.Current.OutgoingResponse.StatusCode        = HttpStatusCode.BadRequest;
                WebOperationContext.Current.OutgoingResponse.StatusDescription = slkae.Message;
            }
            catch (Exception exception)
            {
                Trace.WriteLine(
                    String.Format("Error submitting assignment: ID = {0}, Error = {1}",
                                  trackingData.LearnerAssignmentIdentifier,
                                  exception.ToString()
                                  ));

                WebOperationContext.Current.OutgoingResponse.StatusCode        = HttpStatusCode.InternalServerError;
                WebOperationContext.Current.OutgoingResponse.StatusDescription = exception.Message;
            }
        }
        /// <summary>
        /// Convert an incoming ActivityAttempt into SLK Database records
        /// </summary>
        /// <param name="activityAttempt">Microsoft.Education.Services.ActivityAttempt record containing CMI datamodel tracking information</param>
        /// <exception cref="SLKAssignmentException">Thrown if the Assignment cannot be found or if the Assignment Status will not allow additional attempts</exception>
        public static void ProcessActivityAttempt(ActivityAttempt activityAttempt)
        {
            SLKAssignmentsDataContext db = new SLKAssignmentsDataContext(DBConnection);

            IQueryable <LearnerAssignmentItem> learnerAssignmentQuery = from p in db.LearnerAssignmentItems where p.GuidId == new Guid(activityAttempt.LearnerAssignmentIdentifier) select p;

            if (learnerAssignmentQuery.Count() == 0)
            {
                throw new SLKAssignmentException("LearnerAssignment was not found");
            }

            LearnerAssignmentItem learnerAssignmentItem = learnerAssignmentQuery.Single <LearnerAssignmentItem>();

            if (learnerAssignmentItem.NonELearningStatus == (int)CompletionStatus.Completed || learnerAssignmentItem.IsFinal)
            {
                throw new SLKAssignmentException("Cannot modify a completed assignment");
            }

            AssignmentItem      assignmentItem      = learnerAssignmentItem.AssignmentItem;
            ActivityPackageItem activityPackageItem = null;

            if (assignmentItem.ActivityPackageItem == null)
            {
                #region Create stub PackageItem and ActivityPackageItem for a newly uploaded Grava Package.
                #region Obtain the gravaPackageFormat
                PackageFormat gravaPackageFormat = null;
                IQueryable <PackageFormat> gravaPackageFormatQuery = from p in db.PackageFormats where p.Name == "Grava" select p;
                if (gravaPackageFormatQuery.Count() == 0)
                {
                    gravaPackageFormat      = new PackageFormat();
                    gravaPackageFormat.Name = "Grava";
                    db.PackageFormats.InsertOnSubmit(gravaPackageFormat);
                }
                else
                {
                    gravaPackageFormat = gravaPackageFormatQuery.Single <PackageFormat>();
                }
                #endregion

                PackageItem packageItem = new PackageItem();
                db.PackageItems.InsertOnSubmit(packageItem);
                packageItem.PackageFormat1 = gravaPackageFormat;
                packageItem.Location       = "Grava Null Package Location";
                packageItem.Manifest       = XElement.Parse("<GravaNullManifest />");

                activityPackageItem = new ActivityPackageItem();
                db.ActivityPackageItems.InsertOnSubmit(activityPackageItem);
                activityPackageItem.ActivityIdFromManifest = "Grava Null Activity Id";
                activityPackageItem.OriginalPlacement      = 0;
                activityPackageItem.Title       = "Grava Null Activity Title";
                activityPackageItem.PackageItem = packageItem;
                #endregion
            }
            else
            {
                activityPackageItem = assignmentItem.ActivityPackageItem;
            }

            AttemptItem attempt = new AttemptItem();
            db.AttemptItems.InsertOnSubmit(attempt);
            attempt.UserItem             = learnerAssignmentItem.UserItem;
            attempt.ActivityPackageItem1 = activityPackageItem; // RootActivityPackageItem, designer generated name
            attempt.PackageItem          = activityPackageItem.PackageItem;

            ActivityAttemptItem activityAttemptItem = new ActivityAttemptItem();
            db.ActivityAttemptItems.InsertOnSubmit(activityAttemptItem);
            activityAttemptItem.AttemptItem         = attempt;
            activityAttemptItem.ActivityPackageItem = activityPackageItem;

            // We're assuming one Activity per Package so we just set the Package CompletionStatus to the Activity's CompletionStatus
            attempt.CompletionStatus = (int)activityAttempt.CompletionStatus;

            activityAttemptItem.CompletionStatus = (int)activityAttempt.CompletionStatus;
            activityAttemptItem.RawScore         = (float)activityAttempt.Score.Raw;
            activityAttemptItem.MaxScore         = (float)activityAttempt.Score.Max;
            activityAttemptItem.ScaledScore      = (float)activityAttempt.Score.Scaled;

            // Update the LearnerAssignmentItem's NonELearningStatus and FinalPoints with this data so it shows up on the Grading screen
            learnerAssignmentItem.NonELearningStatus = (int)activityAttempt.CompletionStatus;
            learnerAssignmentItem.FinalPoints        = (float)activityAttempt.Score.Scaled * 100;

            db.SubmitChanges();
        }