/*
Kooboo is a content management system based on ASP.NET MVC framework. Copyright 2009 Yardi Technology Limited.
This program is free software: you can redistribute it and/or modify it under the terms of the
GNU General Public License version 3 as published by the Free Software Foundation.
This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY;
without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
See the GNU General Public License for more details.
You should have received a copy of the GNU General Public License along with this program.
If not, see http://www.kooboo.com/gpl3/.
*/
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using Everest.Library.Extensions;
using Everest.Library.Versioning;
namespace Everest.Providers.Versioning.DB4O{
public class Versioning : IVersioning
{
DataContext dataContext;
public Versioning(string dbDirectory)
{
dataContext = new DataContext(dbDirectory);
}
#region IVersioning Members
/// <summary>
/// Checkouts the specified UUID.
/// </summary>
/// <param name="uuid">The UUID.</param>
/// <param name="user">The user.</param>
/// <param name="comment">The comment.</param>
/// <returns></returns>
public IVersionItem Checkout(Guid uuid, string user, string comment)
{
var lastestVersionItem = EnsureUncheckoutedByOthers(uuid, user);
if (lastestVersionItem != null)
{
lastestVersionItem.CheckoutBy = user;
lastestVersionItem.CheckoutComment = comment;
dataContext.SaveVersion(lastestVersionItem);
}
return lastestVersionItem;
}
/// <summary>
/// Ensures the uncheckouted by others.
/// </summary>
/// <param name="uuid">The UUID.</param>
/// <param name="user">The user.</param>
/// <param name="lastestRevision">The lastest revision.</param>
/// <returns></returns>
private VersionItem EnsureUncheckoutedByOthers(Guid uuid, string user)
{
var lastestVersionItem = dataContext.GetLastestVersion(uuid);
if (lastestVersionItem != null)
{
if (lastestVersionItem.IsCheckout && lastestVersionItem.CheckoutBy != user)
{
throw new Exception(string.Format(Resources.CheckoutedByOthers, lastestVersionItem.CheckoutBy));
}
}
return lastestVersionItem;
}
/// <summary>
/// Checkins the specified versionable.
/// </summary>
/// <param name="versionable">The versionable.</param>
/// <param name="user">The user.</param>
/// <param name="comment">The comment.</param>
/// <returns></returns>
public IVersionItem Checkin(IVersionable versionable, string user, string comment)
{
Guid uuid = versionable.UUID;
var lastestVersionItem = EnsureUncheckoutedByOthers(uuid, user);
var revision = 1;
if (lastestVersionItem != null)
{
revision = lastestVersionItem.Revision + 1;
//set checkin
lastestVersionItem.CheckoutBy = string.Empty;
}
VersionItem versionItem = new VersionItem(this);
versionItem.UUID = uuid;
versionItem.SnapshotFormName = versionable.SnapshotFormName;
versionItem.CheckinUser = user;
versionItem.Revision = revision;
versionItem.CheckinComment = comment;
versionItem.Body = versionable.SerializeToXml();
versionItem.DateTime = DateTime.Now;
versionItem.ObjectType = versionable.GetType().GetTypeNameWithoutVersion();
dataContext.SaveVersion(versionItem);
return versionItem;
}
/// <summary>
/// Reverts the specified UUID to the revision.
/// </summary>
/// <param name="uuid">The UUID.</param>
/// <param name="user">The user.</param>
/// <param name="revision">The revision.</param>
/// <param name="comment">The comment.</param>
/// <returns></returns>
public IVersionItem Revert(Guid uuid, string user, int revision, string comment)
{
var lastestVersionItem = EnsureUncheckoutedByOthers(uuid, user);
var newRevision = 1;
if (lastestVersionItem != null)
{
newRevision = lastestVersionItem.Revision + 1;
//set checkin
lastestVersionItem.CheckoutBy = string.Empty;
}
var revisionItem = dataContext.GetVersion(uuid, revision);
//cannot revert to the same version.
if (revisionItem.Revision == lastestVersionItem.Revision)
{
throw new Exception(Resources.RevertToSameVersion);
}
VersionItem newVersionItem = new VersionItem(this);
newVersionItem.Body = revisionItem.Body;
if (string.IsNullOrEmpty(comment))
{
newVersionItem.CheckinComment = string.Format(Resources.RevertedFrom, revision);
}
else
newVersionItem.CheckinComment = comment;
newVersionItem.DateTime = DateTime.Now;
newVersionItem.Revision = newRevision;
newVersionItem.Size = revisionItem.Size;
newVersionItem.CheckinUser = user;
newVersionItem.UUID = revisionItem.UUID;
newVersionItem.SnapshotFormName = revisionItem.SnapshotFormName;
newVersionItem.ObjectType = revisionItem.ObjectType;
object o = revisionItem.GetObject();
if (o is IVersionable)
{
((IVersionable)o).OnRevert(newVersionItem, revisionItem);
}
dataContext.SaveVersion(newVersionItem);
return newVersionItem;
}
/// <summary>
/// Gets the versions.
/// </summary>
/// <param name="uuid">The UUID.</param>
/// <returns></returns>
public IEnumerable<IVersionItem> GetVersions(Guid uuid)
{
return dataContext.GetVersions(uuid);
}
/// <summary>
/// Gets the version.
/// </summary>
/// <param name="uuid">The UUID.</param>
/// <param name="revision">The revision.</param>
/// <returns></returns>
public IVersionItem GetVersion(Guid uuid, int revision)
{
return dataContext.GetVersion(uuid, revision);
}
/// <summary>
/// Compares the specified UUID.
/// Default to compare to the last revision.
/// </summary>
/// <param name="uuid">The UUID.</param>
/// <param name="revision">The revision.</param>
/// <returns></returns>
public IComparison Compare(Guid uuid, int revision)
{
throw new NotImplementedException();
}
/// <summary>
/// Compares the specified UUID.
/// Default to compare to the last revision.
/// </summary>
/// <param name="uuid">The UUID.</param>
/// <param name="sourceRevision">The source revision.</param>
/// <param name="toRevision">To revision.</param>
/// <returns></returns>
public IComparison Compare(Guid uuid, int sourceRevision, int toRevision)
{
throw new NotImplementedException();
}
#endregion
/// <summary>
/// Gets the predecessor.
/// </summary>
/// <param name="uuid">The UUID.</param>
/// <param name="revision">The revision.</param>
/// <returns></returns>
internal IVersionItem GetPredecessor(Guid uuid, int revision)
{
throw new NotImplementedException();
}
/// <summary>
/// Gets the successor.
/// </summary>
/// <param name="uuid">The UUID.</param>
/// <param name="revision">The revision.</param>
/// <returns></returns>
internal IVersionItem GetSuccessor(Guid uuid, int revision)
{
throw new NotImplementedException();
}
#region IVersioning Members
/// <summary>
/// Checkouts the specified UUID.
/// </summary>
/// <param name="o"></param>
/// <param name="user"></param>
/// <param name="comment"></param>
/// <returns></returns>
public IVersionItem Checkout(IVersionable o, string user, string comment)
{
return Checkout(o.UUID, user, comment);
}
#endregion
#region IVersioning Members
public void ClearVersions(Guid uuid)
{
dataContext.DeleteVersions(uuid);
}
#endregion
}
}
|