private void ParseHistory([NotNull] XElement root)
        {
            Debug.ArgumentNotNull(root, nameof(root));

            history.Clear();

            foreach (var element in root.Elements())
            {
                var created = DateTimeExtensions.FromIso(element.GetAttributeValue("created"));

                var itemId   = new ItemId(new Guid(element.GetAttributeValue("id")));
                var language = new Language(element.GetAttributeValue("language"));
                var version  = new Data.Version(element.GetAttributeInt("version", Data.Version.Latest.Number));

                var entry = new HistoryEntry(Context.DatabaseUri)
                {
                    Action         = element.GetAttributeValue("action"),
                    Category       = element.GetAttributeValue("category"),
                    Created        = created,
                    ItemId         = itemId,
                    Language       = language,
                    Version        = version,
                    Task           = element.GetAttributeValue("task"),
                    UserName       = element.GetAttributeValue("username"),
                    Path           = element.GetAttributeValue("path"),
                    AdditionalInfo = element.Value
                };

                history.Add(entry);
            }
        }
Exemple #2
0
 public UploadContent(IDatabase db, Data.Version version,
                      int sendTimeout, int receiveTimeout, int sendBufferSize, int receiveBufferSize)
     : base(sendTimeout, receiveTimeout, sendBufferSize, receiveBufferSize)
 {
     _db      = db;
     _version = version;
 }
 public UploadContent(IDatabase db, Data.Version version,
     int sendTimeout, int receiveTimeout, int sendBufferSize, int receiveBufferSize)
     : base(sendTimeout, receiveTimeout, sendBufferSize, receiveBufferSize)
 {
     _db = db;
     _version = version;
 }
 public override void ModifyVersion(EngineRequest request, Data.Version version)
 {
     CheckInitialization();
     Logger.Storage.Debug("Modifying version '" + version.VersionId.ToString() + "'...");
     EngineMethods.ModifyVersion act = new EngineMethods.ModifyVersion(request, version);
     act.Execute();
 }
 public ModifyVersion(IDatabase db, Data.Version version,
     Security.RequestingPartyType requestingPartyType, Security.Session session, int sendTimeout,
     int receiveTimeout, int sendBufferSize, int receiveBufferSize)
     : base(db, sendTimeout, receiveTimeout, sendBufferSize, receiveBufferSize)
 {
     _version = version;
     _requestingPartyType = requestingPartyType;
     _session = session;
 }
 public ModifyVersion(IDatabase db, Data.Version version,
                      Security.RequestingPartyType requestingPartyType, Security.Session session, int sendTimeout,
                      int receiveTimeout, int sendBufferSize, int receiveBufferSize)
     : base(db, sendTimeout, receiveTimeout, sendBufferSize, receiveBufferSize)
 {
     _version             = version;
     _requestingPartyType = requestingPartyType;
     _session             = session;
 }
Exemple #7
0
        public Data.Version Transition(Model.Document document, out JObject remainder)
        {
            Data.Version   version;
            Data.VersionId id;
            string         rev;
            string         verifyString;

            if (!VerifyDocumentIntegrity(document, out verifyString))
            {
                Logger.Storage.Error("The document is not properly formatted.  It is missing the property '" + verifyString + "'.");
                throw new FormattingException("The argument document does not have the necessary property '" + verifyString + "'.");
            }

            try
            {
                id = new Data.VersionId(document.Id);
                if (document["_rev"] != null)
                {
                    rev     = document.Rev;
                    version = new Data.Version(id, rev);
                    document.Remove("_rev");
                }
                else
                {
                    version = new Data.Version(id);
                }

                document.Remove("_id");
                document.Remove("$type");

                version.Md5       = document["$md5"].Value <string>();
                version.Extension = document["$extension"].Value <string>();
                version.Created   = document["$created"].Value <DateTime>();
                version.Creator   = document["$creator"].Value <string>();
                version.Modified  = document["$modified"].Value <DateTime>();
                version.Modifier  = document["$modifier"].Value <string>();

                document.Remove("$md5");
                document.Remove("$extension");
                document.Remove("$created");
                document.Remove("$creator");
                document.Remove("$modified");
                document.Remove("$modifier");
            }
            catch (Exception e)
            {
                Logger.Storage.Error("An exception occurred while attempting to parse the document.", e);
                throw;
            }

            remainder = document;
            return(version);
        }
Exemple #8
0
        public Data.Version Transition(Model.Document document, out JObject remainder)
        {
            Data.Version version;
            Data.VersionId id;
            string rev;
            string verifyString;

            if (!VerifyDocumentIntegrity(document, out verifyString))
            {
                Logger.Storage.Error("The document is not properly formatted.  It is missing the property '" + verifyString + "'.");
                throw new FormattingException("The argument document does not have the necessary property '" + verifyString + "'.");
            }

            try
            {
                id = new Data.VersionId(document.Id);
                if (document["_rev"] != null)
                {
                    rev = document.Rev;
                    version = new Data.Version(id, rev);
                    document.Remove("_rev");
                }
                else
                {
                    version = new Data.Version(id);
                }

                document.Remove("_id");
                document.Remove("$type");

                version.Md5 = document["$md5"].Value<string>();
                version.Extension = document["$extension"].Value<string>();
                version.Created = document["$created"].Value<DateTime>();
                version.Creator = document["$creator"].Value<string>();
                version.Modified = document["$modified"].Value<DateTime>();
                version.Modifier = document["$modifier"].Value<string>();

                document.Remove("$md5");
                document.Remove("$extension");
                document.Remove("$created");
                document.Remove("$creator");
                document.Remove("$modified");
                document.Remove("$modifier");
            }
            catch (Exception e)
            {
                Logger.Storage.Error("An exception occurred while attempting to parse the document.", e);
                throw;
            }

            remainder = document;
            return version;
        }
 private void RemoveFields([NotNull] ID itemId, [NotNull] Language language, [NotNull] Data.Version version)
 {
     SharedFields.Remove(itemId);
     {
         var itemFields = UnversionedFields[itemId];
         itemFields.Where(r => r.Language == language.ToString()).ToList().Apply(r => itemFields.Remove(r));
     }
     {
         var itemFields = VersionedFields[itemId];
         itemFields.Where(r => (r.Language == language.ToString()) && (r.Version == version.ToInt32()))
         .ToList()
         .Apply(r => itemFields.Remove(r));
     }
 }
Exemple #10
0
        private List <Exception> AddMetadata(Data.Version version, Model.Document doc)
        {
            List <Exception> errors = null;

            Dictionary <string, object> .Enumerator en = version.Metadata.GetEnumerator();

            while (en.MoveNext())
            {
                if ((errors = AddMetadata(en.Current.Key, en.Current.Value, doc)) != null)
                {
                    return(errors);
                }
            }

            return(null);
        }
Exemple #11
0
 public CreateNewVersion(IDatabase db, CreateVersionArgs args,
                         Security.RequestingPartyType requestingPartyType, Security.Session session, int sendTimeout,
                         int receiveTimeout, int sendBufferSize, int receiveBufferSize)
     : base(db, sendTimeout, receiveTimeout, sendBufferSize, receiveBufferSize)
 {
     _args = args;
     _requestingPartyType = requestingPartyType;
     _session             = session;
     _version             = new Data.Version(_args.VersionId, _args.Metadata, _args.Content);
     _version.Md5         = _args.Md5;
     _version.Extension   = _args.Extension;
     _version.Created     = DateTime.Now;
     _version.Creator     = session.User.Username;
     _version.Modified    = _version.Created;
     _version.Modifier    = _version.Creator;
 }
 public CreateNewVersion(IDatabase db, CreateVersionArgs args,
     Security.RequestingPartyType requestingPartyType, Security.Session session, int sendTimeout,
     int receiveTimeout, int sendBufferSize, int receiveBufferSize)
     : base(db, sendTimeout, receiveTimeout, sendBufferSize, receiveBufferSize)
 {
     _args = args;
     _requestingPartyType = requestingPartyType;
     _session = session;
     _version = new Data.Version(_args.VersionId, _args.Metadata, _args.Content);
     _version.Md5 = _args.Md5;
     _version.Extension = _args.Extension;
     _version.Created = DateTime.Now;
     _version.Creator = session.User.Username;
     _version.Modified = _version.Created;
     _version.Modifier = _version.Creator;
 }
            public PackageItem([NotNull] ZipEntry entry)
            {
                Assert.ArgumentNotNull(entry, nameof(entry));

                Entry = entry;

                var parts = entry.Name.Split('/');

                DatabaseName = parts[0];
                ItemName     = parts[parts.Length - 5];
                ItemId       = new ItemId(new Guid(parts[parts.Length - 4]));
                Language     = new Language(parts[parts.Length - 3]);
                Version      = new Data.Version(int.Parse(parts[parts.Length - 2]));

                var path = string.Empty;

                for (var n = 2; n < parts.Length - 5; n++)
                {
                    path += @"/" + parts[n];
                }

                Path = path;
            }
Exemple #14
0
        private Item GetItem(ID itemId, Language language, Data.Version version)
        {
            Item item;

            if (language == null && version == null)
            {
                item = WorkingDatabase.GetItem(itemId);
            }
            else if (language == null && version != null)
            {
                item = WorkingDatabase.GetItem(itemId, Sitecore.Context.Language, version);
            }
            else if (language != null && version == null)
            {
                item = WorkingDatabase.GetItem(itemId, language);
            }
            else
            {
                item = WorkingDatabase.GetItem(itemId, language, version);
            }

            return(item);
        }
 public ModifyVersion(EngineRequest request, Data.Version version)
     : base(request)
 {
     _version = version;
 }
 public SaveContent(IDatabase db, Data.Version version, int sendTimeout, int receiveTimeout, int sendBufferSize, int receiveBufferSize)
     : base(db, version.VersionId.ToString(), sendTimeout, receiveTimeout, sendBufferSize, receiveBufferSize)
 {
     _version = version;
 }
 public bool Equals(Data.Version other)
 {
     return((other != null) && (other.Number == _number));
 }
        public override void TaskComplete(Tasks.Base sender, ICommandReply reply)
        {
            Type t = sender.GetType();

            if (t == typeof(Tasks.DownloadResource))
            {
                Tasks.DownloadResource task = (Tasks.DownloadResource)sender;
                _resource          = task.Resource;
                _resourceRemainder = task.Remainder;
                RunTaskProcess(new Tasks.CheckResourcePermissions(_db, _resource, _requestingPartyType,
                                                                  _session, Security.Authorization.ResourcePermissionType.Modify, _sendTimeout, _receiveTimeout,
                                                                  _sendBufferSize, _receiveBufferSize));
            }
            else if (t == typeof(Tasks.CheckResourcePermissions))
            {
                Tasks.CheckResourcePermissions task = (Tasks.CheckResourcePermissions)sender;
                if (!task.IsAuthorized)
                {
                    TriggerOnAuthorizationDenied(task);
                    return;
                }
                RunTaskProcess(new Tasks.MarkResourceForCheckout(_resource, _session.User.Username, _sendTimeout, _receiveTimeout,
                                                                 _sendBufferSize, _receiveBufferSize));
            }
            else if (t == typeof(Tasks.MarkResourceForCheckout))
            {
                Tasks.MarkResourceForCheckout task = (Tasks.MarkResourceForCheckout)sender;
                _resource = task.Resource;

                List <Exception>      errors;
                List <Model.Document> docs       = new List <Model.Document>();
                Transitions.Version   txVersion  = new Transitions.Version();
                Transitions.Resource  txResource = new Transitions.Resource();

                docs.Add(txResource.Transition(_resource, out errors));
                if (errors != null)
                {
                    TriggerOnError(null, errors[0].Message, errors[0]);
                    return;
                }
                docs[0].CombineWith(_resourceRemainder);
                docs.Add(txVersion.Transition(_version, out errors));
                if (errors != null)
                {
                    TriggerOnError(null, errors[0].Message, errors[0]);
                    return;
                }

                RunTaskProcess(new Tasks.MakeBulkDocument(docs, _sendTimeout, _receiveTimeout,
                                                          _sendBufferSize, _receiveBufferSize));
            }
            else if (t == typeof(Tasks.MakeBulkDocument))
            {
                Tasks.MakeBulkDocument task = (Tasks.MakeBulkDocument)sender;
                RunTaskProcess(new Tasks.UploadBulkDocuments(_db, task.BulkDocument, _sendTimeout, _receiveTimeout,
                                                             _sendBufferSize, _receiveBufferSize));
            }
            else if (t == typeof(Tasks.UploadBulkDocuments))
            {
                Tasks.UploadBulkDocuments task = (Tasks.UploadBulkDocuments)sender;

                Commands.PostBulkDocumentsReply.Entry entry = task.FindEntryById(_version.VersionId.ToString());

                if (entry == null)
                {
                    TriggerOnError(task, "Failed to locate " + _version.VersionId.ToString() + " in the " +
                                   "bulk document post results.", null);
                    return;
                }

                // This is needed so that couchdb can apply the content to the correct revision.
                _version.UpdateRevision(entry.Rev);

                // If no content -> return
                if (_version.Content == null)
                {
                    Resource = _resource;
                    Version  = _version;
                    TriggerOnComplete(reply, new Tuple <Data.Resource, Data.Version>(_resource, _version));
                    return;
                }

                // Upload Data.Content from Data.Version
                RunTaskProcess(new Tasks.UploadContent(_db, _version, _sendTimeout, _receiveTimeout,
                                                       _sendBufferSize, _receiveBufferSize));
            }
            else if (t == typeof(Tasks.UploadContent))
            {
                Resource = _resource;
                Version  = _version;
                TriggerOnComplete(reply, new Tuple <Data.Resource, Data.Version>(_resource, _version));
            }
            else
            {
                TriggerOnError(sender, reply.ToString(), null);
            }
        }
Exemple #19
0
 public ModifyVersion(EngineRequest request, Data.Version version)
     : base(request)
 {
     _version = version;
 }
 public virtual void ModifyVersion(EngineRequest request, Data.Version version)
 {
     throw new NotImplementedException();
 }
        public override void TaskComplete(Tasks.Base sender, ICommandReply reply)
        {
            Type t = sender.GetType();

            if (t == typeof(Tasks.DownloadGlobalPermissions))
            {
                Tasks.DownloadGlobalPermissions task = (Tasks.DownloadGlobalPermissions)sender;
                _gur = task.GlobalUsageRights;
                RunTaskProcess(new Tasks.CheckGlobalPermissions(_db, _gur, _requestingPartyType,
                    _session, Security.Authorization.GlobalPermissionType.CreateResource, _sendTimeout, _receiveTimeout,
                    _sendBufferSize, _receiveBufferSize));
            }
            else if (t == typeof(Tasks.CheckGlobalPermissions))
            {
                Tasks.CheckGlobalPermissions task = (Tasks.CheckGlobalPermissions)sender;
                if (!task.IsAuthorized)
                {
                    TriggerOnAuthorizationDenied(task);
                    return;
                }
                RunTaskProcess(new Tasks.DownloadResourceUsageRightsTemplate(_db, _sendTimeout, _receiveTimeout,
                    _sendBufferSize, _receiveBufferSize));
            }
            else if (t == typeof(Tasks.DownloadResourceUsageRightsTemplate))
            {
                string username = _session.User.Username;
                DateTime creation = DateTime.Now;
                List<Exception> errors;
                List<Model.Document> docs = new List<Model.Document>();

                Tasks.DownloadResourceUsageRightsTemplate task = (Tasks.DownloadResourceUsageRightsTemplate)sender;
                
                // Create the Resource and Version objects
                List<Data.VersionId> versions = new List<Data.VersionId>();

                Data.ResourceId resourceId = Data.ResourceId.Create();

                _version = new Data.Version(new Data.VersionId(resourceId), _args.VersionArgs.Metadata, _args.VersionArgs.Content)
                {
                    Md5 = _args.VersionArgs.Md5,
                    Extension = _args.VersionArgs.Extension,
                    Created = creation,
                    Creator = username,
                    Modified = creation,
                    Modifier = username
                };

                versions.Add(_version.VersionId);

                _resource = new Data.Resource(resourceId, null, versions, _version.VersionId,
                    _args.Metadata, task.Value.UsageRights)
                {
                    Tags = _args.Tags,
                    Created = creation,
                    Creator = username,
                    Modified = creation,
                    Modifier = username,
                    CheckedOutAt = creation,
                    CheckedOutTo = username,
                    LastCommit = creation,
                    LastCommitter = username,
                    Title = _args.Title
                };
                
                // Transition to json objects
                
                Transitions.Resource txResource = new Transitions.Resource();
                docs.Add(txResource.Transition(_resource, out errors));
                if (errors != null)
                {
                    TriggerOnError(null, errors[0].Message, errors[0]);
                    return;
                }
                Transitions.Version txVersion = new Transitions.Version();
                docs.Add(txVersion.Transition(_version, out errors));
                if (errors != null)
                {
                    TriggerOnError(null, errors[0].Message, errors[0]);
                    return;
                }

                RunTaskProcess(new Tasks.MakeBulkDocument(docs, _sendTimeout, _receiveTimeout,
                    _sendBufferSize, _receiveBufferSize));
            }
            else if (t == typeof(Tasks.MakeBulkDocument))
            {
                Tasks.MakeBulkDocument task = (Tasks.MakeBulkDocument)sender;
                RunTaskProcess(new Tasks.UploadBulkDocuments(_db, task.BulkDocument, _sendTimeout, _receiveTimeout,
                    _sendBufferSize, _receiveBufferSize));
            }
            else if (t == typeof(Tasks.UploadBulkDocuments))
            {
                Tasks.UploadBulkDocuments task = (Tasks.UploadBulkDocuments)sender;

                Commands.PostBulkDocumentsReply.Entry entry = task.FindEntryById(_version.VersionId.ToString());

                if (entry == null)
                {
                    TriggerOnError(task, "Failed to locate " + _version.VersionId.ToString() + " in the " +
                        "bulk document post results.", null);
                    return;
                }

                // This is needed so that couchdb can apply the content to the correct revision.
                _version.UpdateRevision(entry.Rev);

                // Upload Data.Content from Data.Version
                RunTaskProcess(new Tasks.UploadContent(_db, _version, _sendTimeout, _receiveTimeout,
                    _sendBufferSize, _receiveBufferSize));
            }
            else if (t == typeof(Tasks.UploadContent))
            {
                TriggerOnComplete(reply, new Tuple<Data.Resource, Data.Version>(_resource, _version));
            }
            else
            {
                TriggerOnError(sender, reply.ToString(), null);
            }
        }
Exemple #22
0
        public ImportResult ImportCsv(Stream stream)
        {
            var importResult = new ImportResult();

            using (var streamReader = new System.IO.StreamReader(stream))
            {
                var csvReader = new CsvReader(streamReader);

                csvReader.Configuration.HasHeaderRecord = true;

                //csvReader.Read() acts like a move next. Will return false when at the end of the file
                while (csvReader.Read())
                {
                    var importItemResult = new ImportItemResult();

                    try
                    {
                        Item item   = null;
                        ID   itemId = null;

                        if (csvReader.FieldHeaders.Contains(Constants.FIELD_ITEM_ID))
                        {
                            itemId = ParseIdOrError(csvReader, Constants.FIELD_ITEM_ID);
                            importItemResult.ItemId = itemId;
                        }

                        Language     language = null;
                        Data.Version version  = null;

                        if (csvReader.FieldHeaders.Contains(Constants.FIELD_LANGUAGE))
                        {
                            language = ParseLanguageOrError(csvReader, Constants.FIELD_LANGUAGE);
                        }

                        if (csvReader.FieldHeaders.Contains(Constants.FIELD_VERSION))
                        {
                            version = ParseVersionOrError(csvReader, Constants.FIELD_VERSION);
                        }

                        if (!ID.IsNullOrEmpty(itemId))
                        {
                            item = GetItem(itemId, language, version);

                            //The user might not be able to access this item. We need to make sure the item dosent exist yet
                            if (item == null)
                            {
                                using (new SecurityDisabler())
                                {
                                    item = GetItem(itemId, language, version);

                                    Assert.IsNull(item, String.Format("User does not have access to the item with ID {0}", itemId));
                                }
                            }

                            Assert.IsNotNull(item, String.Format("Could not find item with ID {0}", itemId));
                        }

                        importItemResult.IsCreation = item == null;

                        if (importItemResult.IsCreation)
                        {
                            CreateItem(csvReader, language, importItemResult);
                        }
                        else
                        {
                            UpdateItem(csvReader, item, importItemResult);
                        }
                    }
                    catch (Exception ex)
                    {
                        importItemResult.Success      = false;
                        importItemResult.ErrorMessage = ex.Message;

                        Sitecore.Diagnostics.Log.Error("BulkManager import process failed for item", ex, this);
                    }
                    finally
                    {
                        importResult.ItemResults.Add(importItemResult);

                        //Increment metrics
                        if (importItemResult.Success && importItemResult.IsCreation)
                        {
                            importResult.ItemsCreated++;
                        }
                        else if (importItemResult.Success && !importItemResult.IsCreation)
                        {
                            importResult.ItemsUpdated++;
                        }
                        else if (!importItemResult.Success)
                        {
                            importResult.ItemsFailed++;
                        }
                    }
                }
            }

            return(importResult);
        }
 public SaveContent(IDatabase db, Data.Version version, int sendTimeout, int receiveTimeout, int sendBufferSize, int receiveBufferSize)
     : base(db, version.VersionId.ToString(), sendTimeout, receiveTimeout, sendBufferSize, receiveBufferSize)
 {
     _version = version;
 }
Exemple #24
0
        public static bool HasVersionedRenderingsOnVersion(this Item item, Language language, Data.Version version)
        {
            var versionItem = item.Database.GetItem(item.ID, language, version);

            return(versionItem != null && versionItem.HasVersionedRenderings());
        }
Exemple #25
0
 public static Uri Build(IDatabase db, Data.Version version)
 {
     return(Build(db, version.VersionId));
 }
 public int CompareTo(Data.Version other)
 {
     return(this.Equals(other) ? 0 : this._number.CompareTo(other.Number));
 }
Exemple #27
0
        public Model.Document Transition(Data.Version version, out List <Exception> errors)
        {
            Model.Document   document = new Model.Document();
            Model.Attachment att      = null;
            string           prop;

            errors = null;

            try
            {
                document.Id = version.VersionId.ToString();
                if (!string.IsNullOrEmpty(version.Revision))
                {
                    document.Rev = version.Revision;
                }

                document.Add("$type", "version");
                document.Add("$md5", version.Md5);
                document.Add("$extension", version.Extension);
                document.Add("$created", version.Created);
                document.Add("$creator", version.Creator);
                document.Add("$modified", version.Modified);
                document.Add("$modifier", version.Modifier);

                if (version.Metadata != null)
                {
                    if ((errors = AddMetadata(version, document)) != null)
                    {
                        return(null);
                    }
                }

                if (version.Content != null)
                {
                    att                  = new Model.Attachment();
                    att.ContentType      = version.Content.ContentType.Name;
                    att.AttachmentLength = version.Content.Length;
                    if (string.IsNullOrEmpty(version.Content.LocalFilepath))
                    {
                        document.AddAttachment("file", att);
                    }
                    else
                    {
                        document.AddAttachment(System.IO.Path.GetFileName(version.Content.LocalFilepath), att);
                    }
                }

                if (!VerifyDocumentIntegrity(document, out prop))
                {
                    Logger.Storage.Error("The document is not properly formatted.  It is missing the property '" + prop + "'.");
                    throw new FormattingException("The argument document does not have the necessary property '" + prop + "'.");
                }
            }
            catch (Exception e)
            {
                Logger.Storage.Error("An exception occurred while attempting to parse the version object.", e);
                throw;
            }

            return(document);
        }
        public override void TaskComplete(Tasks.Base sender, ICommandReply reply)
        {
            Type t = sender.GetType();

            if (t == typeof(Tasks.DownloadResource))
            {
                Tasks.DownloadResource task = (Tasks.DownloadResource)sender;
                _resource = task.Resource;
                _resourceRemainder = task.Remainder;
                RunTaskProcess(new Tasks.CheckResourcePermissions(_db, _resource, _requestingPartyType,
                    _session, Security.Authorization.ResourcePermissionType.Modify, _sendTimeout, _receiveTimeout,
                    _sendBufferSize, _receiveBufferSize));
            }
            else if (t == typeof(Tasks.CheckResourcePermissions))
            {
                Tasks.CheckResourcePermissions task = (Tasks.CheckResourcePermissions)sender;
                if (!task.IsAuthorized)
                {
                    TriggerOnAuthorizationDenied(task);
                    return;
                }
                RunTaskProcess(new Tasks.MarkResourceForCheckout(_resource, _session.User.Username, _sendTimeout, _receiveTimeout,
                    _sendBufferSize, _receiveBufferSize));
            }
            else if (t == typeof(Tasks.MarkResourceForCheckout))
            {
                Tasks.MarkResourceForCheckout task = (Tasks.MarkResourceForCheckout)sender;
                _resource = task.Resource;

                List<Exception> errors;
                List<Model.Document> docs = new List<Model.Document>();
                Transitions.Version txVersion = new Transitions.Version();
                Transitions.Resource txResource = new Transitions.Resource();

                docs.Add(txResource.Transition(_resource, out errors));
                if (errors != null)
                {
                    TriggerOnError(null, errors[0].Message, errors[0]);
                    return;
                }
                docs[0].CombineWith(_resourceRemainder);
                docs.Add(txVersion.Transition(_version, out errors));
                if (errors != null)
                {
                    TriggerOnError(null, errors[0].Message, errors[0]);
                    return;
                }

                RunTaskProcess(new Tasks.MakeBulkDocument(docs, _sendTimeout, _receiveTimeout,
                    _sendBufferSize, _receiveBufferSize));
            }
            else if (t == typeof(Tasks.MakeBulkDocument))
            {
                Tasks.MakeBulkDocument task = (Tasks.MakeBulkDocument)sender;
                RunTaskProcess(new Tasks.UploadBulkDocuments(_db, task.BulkDocument, _sendTimeout, _receiveTimeout,
                    _sendBufferSize, _receiveBufferSize));
            }
            else if (t == typeof(Tasks.UploadBulkDocuments))
            {
                Tasks.UploadBulkDocuments task = (Tasks.UploadBulkDocuments)sender;

                Commands.PostBulkDocumentsReply.Entry entry = task.FindEntryById(_version.VersionId.ToString());

                if (entry == null)
                {
                    TriggerOnError(task, "Failed to locate " + _version.VersionId.ToString() + " in the " +
                        "bulk document post results.", null);
                    return;
                }

                // This is needed so that couchdb can apply the content to the correct revision.
                _version.UpdateRevision(entry.Rev);

                // If no content -> return
                if (_version.Content == null)
                {
                    Resource = _resource;
                    Version = _version;
                    TriggerOnComplete(reply, new Tuple<Data.Resource, Data.Version>(_resource, _version));
                    return;
                }

                // Upload Data.Content from Data.Version
                RunTaskProcess(new Tasks.UploadContent(_db, _version, _sendTimeout, _receiveTimeout,
                    _sendBufferSize, _receiveBufferSize));
            }
            else if (t == typeof(Tasks.UploadContent))
            {
                Resource = _resource;
                Version = _version;
                TriggerOnComplete(reply, new Tuple<Data.Resource, Data.Version>(_resource, _version));
            }
            else
            {
                TriggerOnError(sender, reply.ToString(), null);
            }
        }
        public override void TaskComplete(Tasks.Base sender, ICommandReply reply)
        {
            Type t = sender.GetType();

            if (t == typeof(Tasks.DownloadGlobalPermissions))
            {
                Tasks.DownloadGlobalPermissions task = (Tasks.DownloadGlobalPermissions)sender;
                _gur = task.GlobalUsageRights;
                RunTaskProcess(new Tasks.CheckGlobalPermissions(_db, _gur, _requestingPartyType,
                                                                _session, Security.Authorization.GlobalPermissionType.CreateResource, _sendTimeout, _receiveTimeout,
                                                                _sendBufferSize, _receiveBufferSize));
            }
            else if (t == typeof(Tasks.CheckGlobalPermissions))
            {
                Tasks.CheckGlobalPermissions task = (Tasks.CheckGlobalPermissions)sender;
                if (!task.IsAuthorized)
                {
                    TriggerOnAuthorizationDenied(task);
                    return;
                }
                RunTaskProcess(new Tasks.DownloadResourceUsageRightsTemplate(_db, _sendTimeout, _receiveTimeout,
                                                                             _sendBufferSize, _receiveBufferSize));
            }
            else if (t == typeof(Tasks.DownloadResourceUsageRightsTemplate))
            {
                string                username = _session.User.Username;
                DateTime              creation = DateTime.Now;
                List <Exception>      errors;
                List <Model.Document> docs = new List <Model.Document>();

                Tasks.DownloadResourceUsageRightsTemplate task = (Tasks.DownloadResourceUsageRightsTemplate)sender;

                // Create the Resource and Version objects
                List <Data.VersionId> versions = new List <Data.VersionId>();

                Data.ResourceId resourceId = Data.ResourceId.Create();

                _version = new Data.Version(new Data.VersionId(resourceId), _args.VersionArgs.Metadata, _args.VersionArgs.Content)
                {
                    Md5       = _args.VersionArgs.Md5,
                    Extension = _args.VersionArgs.Extension,
                    Created   = creation,
                    Creator   = username,
                    Modified  = creation,
                    Modifier  = username
                };

                versions.Add(_version.VersionId);

                _resource = new Data.Resource(resourceId, null, versions, _version.VersionId,
                                              _args.Metadata, task.Value.UsageRights)
                {
                    Tags          = _args.Tags,
                    Created       = creation,
                    Creator       = username,
                    Modified      = creation,
                    Modifier      = username,
                    CheckedOutAt  = creation,
                    CheckedOutTo  = username,
                    LastCommit    = creation,
                    LastCommitter = username,
                    Title         = _args.Title
                };

                // Transition to json objects

                Transitions.Resource txResource = new Transitions.Resource();
                docs.Add(txResource.Transition(_resource, out errors));
                if (errors != null)
                {
                    TriggerOnError(null, errors[0].Message, errors[0]);
                    return;
                }
                Transitions.Version txVersion = new Transitions.Version();
                docs.Add(txVersion.Transition(_version, out errors));
                if (errors != null)
                {
                    TriggerOnError(null, errors[0].Message, errors[0]);
                    return;
                }

                RunTaskProcess(new Tasks.MakeBulkDocument(docs, _sendTimeout, _receiveTimeout,
                                                          _sendBufferSize, _receiveBufferSize));
            }
            else if (t == typeof(Tasks.MakeBulkDocument))
            {
                Tasks.MakeBulkDocument task = (Tasks.MakeBulkDocument)sender;
                RunTaskProcess(new Tasks.UploadBulkDocuments(_db, task.BulkDocument, _sendTimeout, _receiveTimeout,
                                                             _sendBufferSize, _receiveBufferSize));
            }
            else if (t == typeof(Tasks.UploadBulkDocuments))
            {
                Tasks.UploadBulkDocuments task = (Tasks.UploadBulkDocuments)sender;

                Commands.PostBulkDocumentsReply.Entry entry = task.FindEntryById(_version.VersionId.ToString());

                if (entry == null)
                {
                    TriggerOnError(task, "Failed to locate " + _version.VersionId.ToString() + " in the " +
                                   "bulk document post results.", null);
                    return;
                }

                // This is needed so that couchdb can apply the content to the correct revision.
                _version.UpdateRevision(entry.Rev);

                // Upload Data.Content from Data.Version
                RunTaskProcess(new Tasks.UploadContent(_db, _version, _sendTimeout, _receiveTimeout,
                                                       _sendBufferSize, _receiveBufferSize));
            }
            else if (t == typeof(Tasks.UploadContent))
            {
                TriggerOnComplete(reply, new Tuple <Data.Resource, Data.Version>(_resource, _version));
            }
            else
            {
                TriggerOnError(sender, reply.ToString(), null);
            }
        }