private bool checkOutDataset(Int64 datasetId, string username, DateTime timestamp)
{
bool checkedOut = false;
//XmlDocument doc = new XmlDocument();
//doc.LoadXml(@"<Metadata>Empty</Metadata>");
using (IUnitOfWork uow = this.GetUnitOfWork())
{
IRepository<Dataset> repo = uow.GetRepository<Dataset>();
var q = repo.Query(p => p.Id == datasetId && p.Status == DatasetStatus.CheckedIn && (p.CheckOutUser.Equals(string.Empty) || p.CheckOutUser == null));
Dataset ds = q.FirstOrDefault();
if (ds != null)
{
DatasetVersion dsNewVersion = new DatasetVersion()
{
Timestamp = timestamp,
//Metadata = doc,
//ExtendedPropertyValues = new List<ExtendedPropertyValue>(),
//ContentDescriptors = new List<ContentDescriptor>(),
Status = DatasetVersionStatus.CheckedOut,
Dataset = ds,
};
// if there is a previous version, copy its metadata, content descriptors and extended property values to the newly created version
if (ds.Versions.Count() > 0)
{
var previousCheckedInVersion = ds.Versions.Where(p => p.Status == DatasetVersionStatus.CheckedIn).First();
if (previousCheckedInVersion != null && previousCheckedInVersion.Timestamp >= timestamp) // it is an error
{
throw new Exception(string.Format("The provided timestamp {0} is earlier than the timestamp of the latest checked in version!", timestamp));
}
if (previousCheckedInVersion != null)
{
dsNewVersion.Metadata = previousCheckedInVersion.Metadata;
dsNewVersion.ExtendedPropertyValues = previousCheckedInVersion.ExtendedPropertyValues;
foreach (var item in previousCheckedInVersion.ContentDescriptors)
{
ContentDescriptor cd = new ContentDescriptor()
{
MimeType = item.MimeType,
Name = item.Name,
OrderNo = item.OrderNo,
URI = item.URI,
DatasetVersion = dsNewVersion,
};
dsNewVersion.ContentDescriptors.Add(cd);
}
}
}
ds.Status = DatasetStatus.CheckedOut;
ds.LastCheckIOTimestamp = timestamp;
ds.CheckOutUser = getUserIdentifier(username);
ds.Versions.Add(dsNewVersion);
repo.Put(ds);
uow.Commit();
checkedOut = true;
}
}
return (checkedOut);
}