protected virtual void AddItemsToPublishingQueue(Item item1, ref List <Item> items, bool sharedOnly, bool subitems, bool recurse, Dictionary <ID, bool> deepRelatedTemplates) { items.AddRange(PublishQueue.GetParents(item1)); items.Add(item1); if (subitems) { items.AddRange(item1.Children); } if (deepRelatedTemplates?.ContainsKey(item1.TemplateID) == true && recurse) { var relatedItems = GetReferences(item1, sharedOnly, deepRelatedTemplates[item1.TemplateID], recurse: false).ToArray(); items.AddRange(relatedItems); } var relatedImages = item1.Links.GetValidLinks().Where(link => link.TargetPath.StartsWith(Constants.MediaLibraryPath)) .Select(link => link.GetTargetItem()).ToArray(); if (relatedImages.Any()) { var imageParents = relatedImages.SelectMany(PublishQueue.GetParents); items.AddRange(imageParents); items.AddRange(relatedImages); } }
// Methods private IEnumerable <PublishingCandidate> GetSourceItems(PublishOptions options) { if (options.Mode == PublishMode.Incremental) { return(PublishQueue.GetPublishQueue(options)); } return(PublishQueue.GetContentBranch(options)); }
public override IDList GetPublishQueue(DateTime from, DateTime to, [NotNull] CallContext context) { lock (this) { var result = new IDList(); PublishQueue.Where(r => (r.Date >= from) && (r.Date <= to)).Apply(r => result.Add(r.ItemID)); return(result); } }
public override bool CleanupPublishQueue(DateTime to, [NotNull] CallContext context) { lock (this) { PublishQueue = PublishQueue.Where(item => item.Date > to).ToList(); return(true); } }
public override bool AddToPublishQueue( [NotNull] ID itemID, [NotNull] string action, DateTime date, [NotNull] CallContext context) { lock (this) { PublishQueue.Add(new PublishQueueRow { ItemID = itemID, Action = action, Date = date }); return(true); } }
private IEnumerable <Item> GetReferences(Item item, bool sharedOnly, HashSet <ID> processedItems) { Assert.ArgumentNotNull(item, nameof(item)); processedItems.Add(item.ID); var source = new List <Item>(); var array = item.Links.GetValidLinks().Where(link => item.Database.Name.Equals(link.TargetDatabaseName, StringComparison.OrdinalIgnoreCase)).ToArray(); if (sharedOnly) { array = array.Where(link => { var sourceItem = link.GetSourceItem(); if (sourceItem == null) { return(false); } if (!ID.IsNullOrEmpty(link.SourceFieldID)) { return(sourceItem.Fields[link.SourceFieldID].Shared); } return(true); }).ToArray(); } foreach (var obj in array.Select(link => link.GetTargetItem()).Where(relatedItem => relatedItem != null) .ToList()) { if (DeepScan && !processedItems.Contains(obj.ID)) { source.AddRange(GetReferences(obj, sharedOnly, processedItems)); } source.AddRange(PublishQueue.GetParents(obj)); source.Add(obj); source.AddRange(GetAdvancedImageFieldsLinkedMediaItems(obj)); source.AddRange(GetAdvancedImageGalleryFieldsLinkedMediaItems(obj)); } return(source.Distinct(new ItemIdComparer())); }
/// <summary> /// Gets the referenced items. /// </summary> /// <param name="item">The item.</param> /// <returns></returns> private IEnumerable <Item> GetReferences(Item item) { Assert.ArgumentNotNull(item, "item"); List <Item> items = new List <Item>(); ItemLink[] validLinks = item.Links.GetValidLinks(); validLinks = ( from link in validLinks where item.Database.Name.Equals(link.TargetDatabaseName, StringComparison.OrdinalIgnoreCase) select link).ToArray <ItemLink>(); List <Item> list = ( from link in (IEnumerable <ItemLink>) validLinks select link.GetTargetItem() into relatedItem where relatedItem != null select relatedItem).ToList <Item>(); foreach (Item item1 in list) { items.AddRange(PublishQueue.GetParents(item1)); items.Add(item1); } return(items.Distinct(new ItemIdComparer())); }
static void Main(string[] args) { var connectionString = args[0]; var logger = new ConsoleLogger(); using (var tfs = new ThreadsFrames()) { //var sf = new ConsoleCollectionSaverFactory( // ); var ftn = new FullTableName("_ss"); var tfnc = new TargetFileNameController( 1, @"_bbin", 500 ); var sf = new SqlServerCollectionSaverFactory( connectionString, ftn, tfnc ); sf.PrepareDatabase(); var r = new SqlServerReader( connectionString, ftn, tfnc ); using (var pq = new PublishQueue( sf, logger )) { var p = new Publisher( pq, tfs ); var iec = new Common.IEC(tfs, p, r); iec.Publisher.PublishedEvent += ( collections, count ) => { var read = iec.Reader.ReadBetween( new DateTime(2000, 1, 1), new DateTime(2030, 1, 1) ); Console.WriteLine(read.Last().Body); }; ProcessMutable(iec); //ProcessImmutable(iec); } } Console.WriteLine("Finished!"); }
/// <summary> /// Loads data for the Incremental Publish Queue report (includes all item languages). Utilizes Sitecore.Publishing.Pipelines.Publish.GetPublishQueue(PublishOptions) method as a source of data, then augments it based on item workflow state: only returns items in a final workflow state. /// </summary> /// <param name="languageCode">Language code to load. Default is "en". Must otherwise use fully-qualified language code (example: "ja-JP").</param> /// <returns>Enumerable of publish candidate items.</returns> public IEnumerable <PublishQueueItem> IncrementalPublishQueue_GetData() { Database masterDB = Database.GetDatabase(Sitecore.Configuration.Settings.GetSetting("SitecoreSpark.SPRK.SourceDatabase")); Database webDB = Database.GetDatabase(Sitecore.Configuration.Settings.GetSetting("SitecoreSpark.SPRK.TargetDatabase")); List <PublishQueueItem> model = new List <PublishQueueItem>(); // Note on language: the actual publish pipeline uses the language parameter; it doesn't matter what we pass in for this usage PublishOptions options = new PublishOptions(masterDB, webDB, PublishMode.Incremental, Language.Parse("en"), DateTime.Now.AddDays(1)); IEnumerable <PublishingCandidate> candidateList = PublishQueue.GetPublishQueue(options); if (candidateList != null && candidateList.Count() > 0) { foreach (PublishingCandidate candidate in candidateList) { // Get detailed item information (including workflow info for inclusion/exclusion on report) Item scItem = masterDB.GetItem(itemId: candidate.ItemId); // If scItem is null, it likely means an item was deleted from 'master' before a publish (and still exists in the PublishQueue table); safe to ignore if (scItem == null) { Sitecore.Diagnostics.Log.Warn($"[SPRK] PublishQueue item not found in '{masterDB.Name}' database: {candidate.ItemId}.", this); continue; } // Check for all language versions (Workflow is shared, but Workflow State may be unique across languages) foreach (Language language in scItem.Languages) { Item scLanguageItem = masterDB.GetItem(itemId: scItem.ID, language: language); // Alt language versions do not automatically have a version number, so it's worth a check before proceeded if (scLanguageItem.Versions.Count == 0) { continue; } IWorkflow itemWorkflow = masterDB.WorkflowProvider.GetWorkflow(scLanguageItem); if (itemWorkflow == null) { continue; } WorkflowState state = itemWorkflow.GetState(scLanguageItem); if (state != null && state.FinalState) { // Map to domain model model.Add(new PublishQueueItem() { ItemID = candidate.ItemId.Guid, ItemName = scItem.Name, Language = language.Name, Action = candidate.PublishAction.ToString(), SourceDatabase = candidate.PublishOptions.SourceDatabase.Name, TargetDatabase = candidate.PublishOptions.TargetDatabase.Name }); } } } } return(model); }