Skip to content

Instantly share code, notes, and snippets.

@mtrl
Created March 14, 2016 11:46
Show Gist options
  • Save mtrl/e2a51c09620a7afbd346 to your computer and use it in GitHub Desktop.
Save mtrl/e2a51c09620a7afbd346 to your computer and use it in GitHub Desktop.
ReleaseEvents.cs
using Tridion.ContentManager.ContentManagement;
using Tridion.ContentManager.Extensibility;
using Tridion.ContentManager.Extensibility.Events;
using Tridion.ContentManager.CommunicationManagement;
using System;
using Tridion.ContentManager;
using System.IO;
using System.Web;
namespace Example.ReleaseEvents
{
[TcmExtension("Release Events")]
public class ReleaseEvents : TcmExtension
{
private string _logFile = "c:\\log\\ReleaseEventsLog.txt";
private bool _isLoggingEnabled = false;
private const string RELEASE_PACKAGES_FOLDER = "Release Packages";
public ReleaseEvents()
{
EventSystem.Subscribe<VersionedItem, CheckInEventArgs>(VersionedItemSave, EventPhases.TransactionCommitted);
EventSystem.Subscribe<OrganizationalItem, SaveEventArgs>(ItemSave, EventPhases.TransactionCommitted);
EventSystem.Subscribe<Keyword, SaveEventArgs>(ItemSave, EventPhases.TransactionCommitted);
EventSystem.Subscribe<RepositoryLocalObject, LocalizeEventArgs>(ItemLocalize, EventPhases.TransactionCommitted);
}
private void VersionedItemSave(VersionedItem item, CheckInEventArgs args, EventPhases phases)
{
this.LogMessage("Versioned item saved " + item.Title);
AddItemToReleaseBundle(item);
}
private void ItemSave(RepositoryLocalObject item, SaveEventArgs args, EventPhases phases)
{
this.LogMessage("Item save");
if ((item is Folder && item.Title!=RELEASE_PACKAGES_FOLDER) || item is StructureGroup || item is Category || item is Keyword)
{
this.LogMessage("Item saved " + item.Title);
AddItemToReleaseBundle(item);
}
}
private void ItemLocalize(RepositoryLocalObject item, LocalizeEventArgs args, EventPhases phases)
{
this.LogMessage("Item localised " + item.Title);
AddItemToReleaseBundle(item);
}
private void AddItemToReleaseBundle(RepositoryLocalObject item)
{
this.LogMessage(item.Title + " entered AddItemToReleaseBundle");
Bundle bundle = GetOrCreateReleaseBundle(item.ContextRepository);
this.LogMessage("Got bundle from contextrepo: " + bundle.Title);
if (item.ContextRepository.Id.ItemId == bundle.ContextRepository.Id.ItemId)
{
this.LogMessage(item.Title + " Item contextrepo ID same as bundle repo ID");
bundle.AddItem(item);
bundle.Save();
}
}
private Bundle GetOrCreateReleaseBundle(Repository repository)
{
var session = repository.Session;
Bundle bundle = GetObject(session, GetReleaseBundleWebDavUrl(repository)) as Bundle;
if (bundle == null)
{
LogMessage("Bundle is null, creating bundle");
bundle = new Bundle(session, GetReleaseFolderUri(repository));
bundle.Title = repository.Title;
bundle.Save();
LogMessage("Bundle " + bundle.Title + " created");
}
else
{
LogMessage("Bundle is not null, returning bundle");
}
return bundle;
}
private string GetReleaseBundleWebDavUrl(Repository repository)
{
LogMessage("Attempting to get repository bundle");
string pubBit = repository.WebDavUrl.Substring("/webdav/".Length);
LogMessage("pubBit var = " + pubBit);
string releaseBundleWebDavUrl = String.Format("{0}/{1}/{2}", repository.RootFolder.WebDavUrl, Uri.EscapeDataString(RELEASE_PACKAGES_FOLDER), pubBit);
LogMessage("Release bundle WebDav URL = " + releaseBundleWebDavUrl);
return releaseBundleWebDavUrl;
}
private TcmUri GetReleaseFolderUri(Repository repository)
{
Folder folder = GetObject(repository.Session,repository.RootFolder.WebDavUrl + "/" + RELEASE_PACKAGES_FOLDER) as Folder;
if (folder == null)
{
int contextPublicationId = repository.Id.ItemId;
repository = GetRootRepository(repository);
folder = new Folder(repository.Session, repository.RootFolder.Id);
folder.Title = RELEASE_PACKAGES_FOLDER;
folder.Save();
return new TcmUri(folder.Id.ItemId,ItemType.Folder,contextPublicationId);
}
return folder.Id;
}
private Repository GetRootRepository(Repository repository)
{
if (repository.Parents.Count == 0)
{
return repository;
}
else
{
return GetRootRepository(repository.Parents[0]);
}
}
private IdentifiableObject GetObject(Session session, string uriOrWebdavUrl)
{
if (session.IsExistingObject(uriOrWebdavUrl))
{
return session.GetObject(uriOrWebdavUrl);
}
return null;
}
private void LogMessage(string message)
{
if (_isLoggingEnabled)
{
File.AppendAllText(_logFile, DateTime.Now.ToString() + "\t" + message + "\r\n");
}
}
}
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment