/// <summary>
        /// Updates the Request Queue by Cancelling any existing update,create operations for the PublishRequest provided and adds the new one.
        /// </summary>
        /// <param name="publishRequest">PublishRequest containing DataModelNamespace and ResouceTypeName</param>
        internal void UpdateRequestQueue(PublishRequest publishRequest)
        {
            Globals.TraceMessage(TraceEventType.Verbose, publishRequest.ToString(), Properties.Messages.StartedFunctionMessage);

            lock (lockObject)
            {
                IEnumerable <PublishRequest> updatePublishRequest = publishRequestQueue.Where(p =>
                                                                                              p.DataModelNamespace.Equals(publishRequest.DataModelNamespace, StringComparison.OrdinalIgnoreCase) &&
                                                                                              p.ResourceTypeName.Equals(publishRequest.ResourceTypeName, StringComparison.OrdinalIgnoreCase));

                if (updatePublishRequest != null && updatePublishRequest.Count() > 0)
                {
                    foreach (PublishRequest request in updatePublishRequest)
                    {
                        request.CancelRequest();
                    }
                }
            }

            // Add the new publish request by calling submit
            this.Submit(publishRequest);

            Globals.TraceMessage(TraceEventType.Verbose, publishRequest.ToString(), Properties.Messages.FinishedFunctionMessage);
        }
        /// <summary>
        /// Processes the publish request.
        /// </summary>
        /// <param name="currentPublishRequest">The current publish request.</param>
        private void ProcessPublishRequest(PublishRequest currentPublishRequest)
        {
            Globals.TraceMessage(TraceEventType.Information, currentPublishRequest.ToString(), string.Format(Properties.Messages.StartedProcessingQueuedPublishRequest, currentPublishRequest.InstanceId));

            // Add the item in the Request Tracker
            // Remove old requests of the same resourcetype from the Request Tracker
            lock (PublishRequestTracker)
            {
                PublishRequestTracker.RemoveWhere(request => request.DataModelNamespace.Equals(currentPublishRequest.DataModelNamespace, StringComparison.OrdinalIgnoreCase) &&
                                                  request.ResourceTypeName.Equals(currentPublishRequest.ResourceTypeName, StringComparison.OrdinalIgnoreCase));
                PublishRequestTracker.Add(currentPublishRequest);
                currentPublishRequest.DeleteFromDatabase(false, true);
                currentPublishRequest.SaveToDatabase(false);
            }

            // If the request is a cancelled request then mark it as AbortedOnDemand and save to database.
            if (currentPublishRequest.IsCancellationRequested)
            {
                currentPublishRequest.CurrentStatus.CurrentStage = PublishStage.AbortedOnDemand;
                currentPublishRequest.SaveToDatabase(false);
                return;
            }

            try
            {
                using (Process zentityCollectionCreator = new Process())
                {
                    zentityCollectionCreator.StartInfo = new ProcessStartInfo()
                    {
                        // Create the Zentity.Pivot.CollectionCreator Process
                        FileName = Path.Combine(Utilities.AssemblyLocation, "Zentity.Pivot.CollectionCreator.exe"),
                        // Pass the specific arguments to the process
                        Arguments = string.Format("/operation:{0} /instanceId:{1} /modelNamespace:{2} /resourceType:{3} {4}",
                                                  currentPublishRequest.Operation,
                                                  currentPublishRequest.InstanceId,
                                                  currentPublishRequest.DataModelNamespace,
                                                  currentPublishRequest.ResourceTypeName,
                                                  currentPublishRequest.Operation == PublishOperation.UpdateCollection
                                                    ? string.Format("/changemessagefilepath:\"{0}\"", currentPublishRequest.ChangeMessageFilePath)
                                                    : string.Empty),
                        UseShellExecute        = false,
                        RedirectStandardOutput = true
                    };

                    currentPublishRequest.CurrentStatus.CurrentStage = PublishStage.Initiating;
                    zentityCollectionCreator.Start();
                    // Read the output stream first and then wait.
                    string output = zentityCollectionCreator.StandardOutput.ReadToEnd();
                    // Thread waits till the process exits
                    zentityCollectionCreator.WaitForExit();

                    // Analyze the ExitCode and throw the correct execption.
                    switch (zentityCollectionCreator.ExitCode)
                    {
                    // CollectionCreator has exited with a ReturnCode
                    case (int)ReturnCode.Error:
                    case (int)ReturnCode.Invalid:
                        throw new ApplicationException(output.Replace("\n", "\r\n"));

                    // User has ended the CollectionCreator process from Task Manager etc.
                    case 1:
                        throw new InvalidOperationException(Properties.Messages.CollectionCreatorProcessKilled);
                    }
                }
            }
            catch (Exception ex)
            {
                Globals.TraceMessage(TraceEventType.Error, ex.ToString(), string.Format(Properties.Messages.ExceptionProcessingPublishRequest, currentPublishRequest.InstanceId));
                currentPublishRequest.CurrentStatus.CurrentStage = PublishStage.AbortedOnError;
                currentPublishRequest.PublishingCallback         = null;
            }

            // Do cleanup, if the CollectionCreator process has not done itself.
            try
            {
                string directoryPath = Path.Combine(Path.GetTempPath(), currentPublishRequest.InstanceId.ToString());
                string imagesPath    = Path.Combine(Path.GetTempPath(), string.Format("{0}_Images", currentPublishRequest.InstanceId));
                if (Directory.Exists(directoryPath))
                {
                    Directory.Delete(directoryPath, true);
                }
                if (Directory.Exists(imagesPath))
                {
                    Directory.Delete(imagesPath, true);
                }
            }
            catch { }

            // If the Collection creator has not been able to report progress (highly unlikely).
            // Assume that the operation completed successfully.
            if (currentPublishRequest.CurrentStatus.CurrentStage == PublishStage.NotStarted ||
                currentPublishRequest.CurrentStatus.CurrentStage == PublishStage.Initiating)
            {
                Globals.TraceMessage(TraceEventType.Information, string.Empty, string.Format(Properties.Messages.CollectionCreatorProgressReportFailure, currentPublishRequest.InstanceId));
                currentPublishRequest.CurrentStatus.CurrentStage = PublishStage.Completed;
            }

            currentPublishRequest.SaveToDatabase(false);
            lock (lockObject) { processedItemCount++; Monitor.Pulse(lockObject); }

            Globals.TraceMessage(TraceEventType.Information, currentPublishRequest.ToString(), string.Format(Properties.Messages.FinishedProcessingQueuedPublishRequest, currentPublishRequest.InstanceId));
        }