Ejemplo n.º 1
0
        public void ShouldRetrieveProjectsByUser()
        {
            var context = new RoughCutEditorEntities();

            using (TransactionScope transactionScope = new TransactionScope())
            {
                var libraryId    = CreateId(typeof(Services.Contracts.Container).Name);
                var dataProvider = new DataProvider(this.loggerService, null, libraryId);

                Project project1 = Project.CreateProject(1, "creator", DateTime.Now);
                project1.Duration         = 100;
                project1.Resolution       = "HD";
                project1.AutoSaveInterval = 100;
                project1.StartTimeCode    = 3600;
                project1.SmpteFrameRate   = "Smpte2997NonDrop";
                project1.RippleMode       = true;

                Container mediaBin1 = Container.CreateContainer(1);

                project1.MediaBin = mediaBin1;

                Project project2 = Project.CreateProject(2, "notthesamecreator", DateTime.Now);
                project2.Duration         = 100;
                project2.Resolution       = "HD";
                project2.AutoSaveInterval = 100;
                project2.StartTimeCode    = 3600;
                project2.SmpteFrameRate   = "Smpte2997NonDrop";
                project2.RippleMode       = true;

                Container mediaBin2 = Container.CreateContainer(2);

                project2.MediaBin = mediaBin2;

                context.AddToProject(project1);
                context.AddToProject(project2);
                context.SaveChanges();

                var projects = dataProvider.GetProjectsByUser("creator");

                Assert.AreEqual(1, projects.Count());
                Assert.AreEqual(project1.Duration, projects[0].Duration);
                Assert.AreEqual(project1.Resolution, projects[0].Resolution);
                Assert.AreEqual(project1.AutoSaveInterval, projects[0].AutoSaveInterval);
                Assert.AreEqual(project1.StartTimeCode, projects[0].StartTimeCode);
                Assert.AreEqual(project1.SmpteFrameRate, projects[0].SmpteFrameRate);
                Assert.AreEqual(project1.RippleMode, projects[0].RippleMode);
                Assert.AreEqual(project1.Creator, projects[0].Creator);
            }
        }
Ejemplo n.º 2
0
        public void ShouldDeleteProject()
        {
            var context = new RoughCutEditorEntities();

            using (TransactionScope transactionScope = new TransactionScope())
            {
                var libraryId    = CreateId(typeof(Services.Contracts.Container).Name);
                var dataProvider = new DataProvider(this.loggerService, null, libraryId);

                Item item = Item.CreateItem(1, "title", "Video");
                item.Description = "description";
                item.Resources   = new EntityCollection <Resource>();
                Resource resource = Resource.CreateResource(1, "\test\test.wmv", "Master");
                resource.VideoFormat             = VideoFormat.CreateVideoFormat(1);
                resource.VideoFormat.Duration    = 10;
                resource.VideoFormat.FrameRate   = "Smpte25";
                resource.VideoFormat.ResolutionX = 200;
                resource.VideoFormat.ResolutionY = 500;
                item.Resources.Add(resource);

                context.AddToItem(item);

                TitleTemplate titleTemplate = TitleTemplate.CreateTitleTemplate(1, "TemplateName");

                context.AddToTitleTemplate(titleTemplate);

                context.SaveChanges();

                Project project = Project.CreateProject(1, "creator", DateTime.Now);
                project.Duration         = 100;
                project.Resolution       = "HD";
                project.AutoSaveInterval = 100;
                project.StartTimeCode    = 3600;
                project.SmpteFrameRate   = "Smpte2997NonDrop";
                project.RippleMode       = true;

                Container mediaBin = Container.CreateContainer(1);
                mediaBin.Items.Add(item);

                Container container = Container.CreateContainer(2);
                mediaBin.Containers.Add(container);

                project.MediaBin = mediaBin;

                Comment comment = Comment.CreateComment(1, "Text", "Timeline", "user", DateTime.Today);
                comment.MarkIn  = 1200;
                comment.MarkOut = 1500;

                Comment shotComment = Comment.CreateComment(2, "Text", "Shot", "user", DateTime.Today);
                shotComment.MarkIn  = 170;
                shotComment.MarkOut = 180;

                project.Comments.Add(comment);
                project.Comments.Add(shotComment);

                Track track = Track.CreateTrack(1, "Video");

                Shot shot = Shot.CreateShot(1);
                shot.Item         = item;
                shot.ItemMarkIn   = 150;
                shot.ItemMarkOut  = 200;
                shot.TrackMarkIn  = 500;
                shot.TrackMarkOut = 0;
                shot.Volume       = 5;
                shot.Comments.Add(shotComment);

                track.Shots = new EntityCollection <Shot>();
                track.Shots.Add(shot);

                project.Tracks.Add(track);

                Title title = Title.CreateTitle(1, 600, 100, "Main", "Sub");
                title.TitleTemplate = titleTemplate;

                project.Titles.Add(title);

                context.AddToProject(project);

                context.SaveChanges();

                var retrievedProject = dataProvider.LoadProject(new Uri(string.Format("http://temp/{0}", project.Id)));

                bool result = dataProvider.DeleteProject(new Uri(string.Format("http://temp/{0}", project.Id)));
                var  retrievedDeletedProject = dataProvider.LoadProject(new Uri(string.Format("http://temp/{0}", project.Id)));

                Assert.IsTrue(result);
                Assert.IsNull(retrievedDeletedProject.Id);
            }
        }
Ejemplo n.º 3
0
        public void ShouldLoadProject()
        {
            var context = new RoughCutEditorEntities();

            using (TransactionScope transactionScope = new TransactionScope())
            {
                var libraryId    = CreateId(typeof(Services.Contracts.Container).Name);
                var dataProvider = new DataProvider(this.loggerService, null, libraryId);

                Item item = Item.CreateItem(1, "title", "Video");
                item.Description = "description";
                item.Resources   = new EntityCollection <Resource>();
                Resource resource = Resource.CreateResource(1, "\test\test.wmv", "Master");
                resource.VideoFormat             = VideoFormat.CreateVideoFormat(1);
                resource.VideoFormat.Duration    = 10;
                resource.VideoFormat.FrameRate   = "Smpte25";
                resource.VideoFormat.ResolutionX = 200;
                resource.VideoFormat.ResolutionY = 500;
                item.Resources.Add(resource);

                context.AddToItem(item);

                TitleTemplate titleTemplate = TitleTemplate.CreateTitleTemplate(1, "TemplateName");

                context.AddToTitleTemplate(titleTemplate);

                context.SaveChanges();

                Project project = Project.CreateProject(1, "creator", DateTime.Now);
                project.Duration         = 100;
                project.Resolution       = "HD";
                project.AutoSaveInterval = 100;
                project.StartTimeCode    = 3600;
                project.SmpteFrameRate   = "Smpte2997NonDrop";
                project.RippleMode       = true;

                Container mediaBin = Container.CreateContainer(1);
                mediaBin.Items.Add(item);

                Container container = Container.CreateContainer(2);
                container.Items.Add(item);
                mediaBin.Containers.Add(container);

                project.MediaBin = mediaBin;

                Comment comment = Comment.CreateComment(3, "Text", "Timeline", "user", DateTime.Today);
                comment.MarkIn  = 1200;
                comment.MarkOut = 1500;

                Comment shotComment = Comment.CreateComment(4, "Text", "Shot", "user", DateTime.Today);
                shotComment.MarkIn  = 170;
                shotComment.MarkOut = 180;

                project.Comments.Add(comment);
                project.Comments.Add(shotComment);

                Track track = Track.CreateTrack(1, "Video");

                Shot shot = Shot.CreateShot(1);
                shot.Item         = item;
                shot.ItemMarkIn   = 150;
                shot.ItemMarkOut  = 200;
                shot.TrackMarkIn  = 500;
                shot.TrackMarkOut = 0;
                shot.Volume       = 5;
                shot.Comments.Add(shotComment);

                track.Shots = new EntityCollection <Shot>();
                track.Shots.Add(shot);

                project.Tracks.Add(track);

                Title title = Title.CreateTitle(1, 600, 100, "Main", "Sub");
                title.TitleTemplate = titleTemplate;

                project.Titles.Add(title);

                context.AddToProject(project);

                context.SaveChanges();

                var retrievedProject = dataProvider.LoadProject(new Uri(string.Format(IdUrlTemplate, project.Id)));

                Assert.AreEqual(project.Duration, retrievedProject.Duration);
                Assert.AreEqual(project.Resolution, retrievedProject.Resolution);
                Assert.AreEqual(project.AutoSaveInterval, retrievedProject.AutoSaveInterval);
                Assert.AreEqual(project.StartTimeCode, retrievedProject.StartTimeCode);
                Assert.AreEqual(project.SmpteFrameRate, retrievedProject.SmpteFrameRate);
                Assert.AreEqual(project.RippleMode, retrievedProject.RippleMode);
                Assert.AreEqual(project.Creator, retrievedProject.Creator);
                Assert.IsNotNull(retrievedProject.MediaBin);
                Assert.AreEqual(string.Format(IdUrlTemplate, mediaBin.Id), retrievedProject.MediaBin.Id.ToString());
                Assert.AreEqual(1, retrievedProject.MediaBin.Items.Count);
                Assert.AreEqual(1, retrievedProject.MediaBin.Containers.Count);
                Assert.AreEqual(0, retrievedProject.MediaBin.Containers[0].Items.Count);
                Assert.AreEqual(1, retrievedProject.Sequences[0].Tracks.Count);
                Assert.AreEqual(string.Format(IdUrlTemplate, track.Id), retrievedProject.Sequences[0].Tracks[0].Id.ToString());
                Assert.AreEqual(track.TrackType, retrievedProject.Sequences[0].Tracks[0].TrackType);
                Assert.AreEqual(track.Shots.Count, retrievedProject.Sequences[0].Tracks[0].Shots.Count);
                Assert.AreEqual(string.Format(IdUrlTemplate, shot.Id), retrievedProject.Sequences[0].Tracks[0].Shots[0].Id.ToString());
                Assert.AreEqual(shot.TrackMarkIn, retrievedProject.Sequences[0].Tracks[0].Shots[0].TrackAnchor.MarkIn);
                Assert.AreEqual(shot.TrackMarkOut, retrievedProject.Sequences[0].Tracks[0].Shots[0].TrackAnchor.MarkOut);
                Assert.AreEqual(shot.ItemMarkIn, retrievedProject.Sequences[0].Tracks[0].Shots[0].SourceAnchor.MarkIn);
                Assert.AreEqual(shot.ItemMarkOut, retrievedProject.Sequences[0].Tracks[0].Shots[0].SourceAnchor.MarkOut);
                Assert.AreEqual(shot.Volume, retrievedProject.Sequences[0].Tracks[0].Shots[0].Volume);
                Assert.AreEqual(1, retrievedProject.Sequences[0].Tracks[0].Shots[0].Comments.Count);
                Assert.AreEqual(string.Format(IdUrlTemplate, shotComment.Id), retrievedProject.Sequences[0].Tracks[0].Shots[0].Comments[0].Id.ToString());
                Assert.AreEqual(shotComment.Creator, retrievedProject.Sequences[0].Tracks[0].Shots[0].Comments[0].Creator);
                Assert.AreEqual(shotComment.Created, retrievedProject.Sequences[0].Tracks[0].Shots[0].Comments[0].Created);
                Assert.AreEqual(shotComment.Text, retrievedProject.Sequences[0].Tracks[0].Shots[0].Comments[0].Text);
                Assert.AreEqual(shotComment.CommentType, retrievedProject.Sequences[0].Tracks[0].Shots[0].Comments[0].Type);
                Assert.AreEqual(shotComment.MarkIn, retrievedProject.Sequences[0].Tracks[0].Shots[0].Comments[0].MarkIn);
                Assert.AreEqual(shotComment.MarkOut, retrievedProject.Sequences[0].Tracks[0].Shots[0].Comments[0].MarkOut);
                Assert.AreEqual(2, retrievedProject.Comments.Count);
                Assert.AreEqual(string.Format(IdUrlTemplate, comment.Id), retrievedProject.Comments[1].Id.ToString());
                Assert.AreEqual(comment.Created, retrievedProject.Comments[1].Created);
                Assert.AreEqual(comment.Creator, retrievedProject.Comments[1].Creator);
                Assert.AreEqual(comment.Text, retrievedProject.Comments[1].Text);
                Assert.AreEqual(comment.CommentType, retrievedProject.Comments[1].Type);
                Assert.AreEqual(comment.MarkIn, retrievedProject.Comments[1].MarkIn);
                Assert.AreEqual(comment.MarkOut, retrievedProject.Comments[1].MarkOut);
                Assert.AreEqual(string.Format(IdUrlTemplate, shotComment.Id), retrievedProject.Comments[0].Id.ToString());
                Assert.AreEqual(shotComment.Created, retrievedProject.Comments[0].Created);
                Assert.AreEqual(shotComment.Creator, retrievedProject.Comments[0].Creator);
                Assert.AreEqual(shotComment.Text, retrievedProject.Comments[0].Text);
                Assert.AreEqual(shotComment.CommentType, retrievedProject.Comments[0].Type);
                Assert.AreEqual(shotComment.MarkIn, retrievedProject.Comments[0].MarkIn);
                Assert.AreEqual(shotComment.MarkOut, retrievedProject.Comments[0].MarkOut);
                Assert.AreEqual(string.Format(IdUrlTemplate, item.Id), retrievedProject.Sequences[0].Tracks[0].Shots[0].Source.Id.ToString());
                Assert.AreEqual(item.Title, retrievedProject.Sequences[0].Tracks[0].Shots[0].Source.Title);
                Assert.AreEqual(item.Description, retrievedProject.Sequences[0].Tracks[0].Shots[0].Source.Description);
                Assert.IsInstanceOfType(retrievedProject.Sequences[0].Tracks[0].Shots[0].Source, typeof(VideoItem));
                Assert.AreEqual(string.Format(IdUrlTemplate, item.Resources.First().Id), retrievedProject.Sequences[0].Tracks[0].Shots[0].Source.Resources[0].Id.ToString());
                Assert.AreEqual(item.Resources.First().Ref, retrievedProject.Sequences[0].Tracks[0].Shots[0].Source.Resources[0].Ref);
                Assert.AreEqual(item.Resources.First().VideoFormat.Duration, ((VideoItem)retrievedProject.Sequences[0].Tracks[0].Shots[0].Source).Duration);
                Assert.AreEqual(item.Resources.First().VideoFormat.FrameRate, ((VideoItem)retrievedProject.Sequences[0].Tracks[0].Shots[0].Source).FrameRate.ToString());
                Assert.AreEqual(item.Resources.First().VideoFormat.ResolutionX, ((VideoItem)retrievedProject.Sequences[0].Tracks[0].Shots[0].Source).Width);
                Assert.AreEqual(item.Resources.First().VideoFormat.ResolutionY, ((VideoItem)retrievedProject.Sequences[0].Tracks[0].Shots[0].Source).Height);
                Assert.AreEqual(1, retrievedProject.Titles.Count);
                Assert.AreEqual(string.Format(IdUrlTemplate, title.Id), retrievedProject.Titles[0].Id.ToString());
                Assert.AreEqual(title.MainText, retrievedProject.Titles[0].TextBlockCollection[0].Text);
                Assert.AreEqual(title.SubText, retrievedProject.Titles[0].TextBlockCollection[1].Text);
                Assert.AreEqual(title.TrackMarkIn, retrievedProject.Titles[0].TrackAnchor.MarkIn);
                Assert.AreEqual(title.TrackMarkOut, retrievedProject.Titles[0].TrackAnchor.MarkOut);
                Assert.AreEqual(string.Format(IdUrlTemplate, title.TitleTemplate.Id), retrievedProject.Titles[0].TitleTemplate.Id.ToString());
                Assert.AreEqual(title.TitleTemplate.TemplateName, retrievedProject.Titles[0].TitleTemplate.TemplateName);
            }
        }
Ejemplo n.º 4
0
        /// <summary>
        /// Saves a project into the repository.
        /// </summary>
        /// <param name="project">The project to be saved.</param>
        /// <returns>true, indicates that the project was saved. false, that the save failed.</returns>
        public bool SaveProject(Services.Contracts.Project project)
        {
            // TODO
            // This method must also start the Sub-Clipping Job. Use the same code that is in the
            // RCE.Services.OutputService.GenerateCompositeStreamManifest method. You can ignore all
            // the additional method parameters (pbpDataStreamName, adsDataStreamName, compressManifest,
            // gapUriString, gapCmsId, gapAzureId) since they are not being used.

            RoughCutEditorEntities context = null;

            try
            {
                context = new RoughCutEditorEntities();
                context.CommandTimeout = 1000;
                IList <Item> items = new List <Item>();

                RetrieveItems(items, project.MediaBin.Items, context);
                RetrieveItems(items, project.MediaBin.Containers, context);

                var     id         = ExtractIdFromUri(project.Id);
                Project sqlProject = LoadFullProject(id, context);

                if (sqlProject == null)
                {
                    sqlProject = new Project {
                        Id = id
                    };
                    context.AddToProject(sqlProject);
                }

                SqlDataProviderTranslator.ConvertToSqlProject(project, sqlProject);

                id = ExtractIdFromUri(project.MediaBin.Id);

                Container sqlMediaBin = context.Container.Where(m => m.Id == id).FirstOrDefault();

                if (sqlMediaBin == null)
                {
                    sqlMediaBin = new Container {
                        Id = id, Title = project.MediaBin.Title
                    };
                }

                sqlMediaBin.Items.Clear();

                sqlProject.MediaBin = SqlDataProviderTranslator.ConvertToSqlMediaBin(
                    project.MediaBin, sqlMediaBin, items);

                foreach (RCE.Services.Contracts.Container container in project.MediaBin.Containers)
                {
                    id = ExtractIdFromUri(container.Id);
                    Container sqlContainer = context.Container.Where(m => m.Id == id).FirstOrDefault();

                    if (sqlContainer == null)
                    {
                        sqlContainer = new Container {
                            Id = id, Title = container.Title
                        };
                        sqlMediaBin.Containers.Add(sqlContainer);
                    }

                    sqlContainer.Items.Clear();
                    SqlDataProviderTranslator.ConvertToSqlMediaBin(container, sqlContainer, items);
                }

                sqlMediaBin.Containers.Where(x => x.EntityState == EntityState.Unchanged).ToList().ForEach(
                    x =>
                {
                    x.Items.Where(i => i.EntityState == EntityState.Unchanged).ToList().ForEach(
                        i =>
                        { x.Items.Remove(i); });

                    sqlMediaBin.Containers.Remove(x);
                    context.DeleteObject(x);
                });

                foreach (Services.Contracts.Comment comment in project.Comments)
                {
                    id = ExtractIdFromUri(comment.Id);

                    Comment sqlComment = sqlProject.Comments.Where(m => m.Id == id).FirstOrDefault();

                    if (sqlComment == null)
                    {
                        sqlComment = new Comment {
                            Id = id
                        };
                        sqlProject.Comments.Add(sqlComment);
                    }

                    SqlDataProviderTranslator.ConvertToSqlComment(comment, sqlComment);
                }

                sqlProject.Comments.Where(x => x.EntityState == EntityState.Unchanged).ToList().ForEach(
                    x =>
                {
                    sqlProject.Comments.Remove(x);
                    context.DeleteObject(x);
                });

                foreach (Services.Contracts.Track track in project.Sequences[0].Tracks)
                {
                    id = ExtractIdFromUri(track.Id);

                    Track sqlTrack = sqlProject.Tracks.Where(m => m.Id == id).FirstOrDefault();

                    if (sqlTrack == null)
                    {
                        sqlTrack = new Track {
                            Id = id
                        };
                        sqlProject.Tracks.Add(sqlTrack);
                    }

                    SqlDataProviderTranslator.ConvertToSqlTrack(track, sqlTrack);

                    foreach (Services.Contracts.Shot shot in track.Shots)
                    {
                        id = ExtractIdFromUri(shot.Id);

                        Shot sqlShot = sqlTrack.Shots.Where(m => m.Id == id).FirstOrDefault();

                        if (sqlShot == null)
                        {
                            sqlShot = new Shot {
                                Id = id
                            };
                            sqlTrack.Shots.Add(sqlShot);
                        }

                        SqlDataProviderTranslator.ConvertToSqlShot(shot, sqlShot, items);

                        foreach (Services.Contracts.Comment comment in shot.Comments)
                        {
                            id = ExtractIdFromUri(comment.Id);

                            Comment sqlComment = sqlProject.Comments.Where(m => m.Id == id).FirstOrDefault();

                            if (sqlComment == null)
                            {
                                sqlComment = new Comment {
                                    Id = id
                                };
                                sqlShot.Comments.Add(sqlComment);
                            }
                            else if (sqlComment.EntityState == EntityState.Added)
                            {
                                sqlShot.Comments.Add(sqlComment);
                            }

                            SqlDataProviderTranslator.ConvertToSqlComment(comment, sqlComment);
                        }

                        sqlShot.Comments.Where(x => x.EntityState == EntityState.Unchanged).ToList().ForEach(
                            x =>
                        {
                            sqlProject.Comments.Remove(x);
                            context.DeleteObject(x);
                        });
                    }

                    sqlTrack.Shots.Where(x => x.EntityState == EntityState.Unchanged).ToList().ForEach(
                        x =>
                    {
                        sqlTrack.Shots.Remove(x);
                        context.DeleteObject(x);
                    });
                }

                sqlProject.Tracks.Where(x => x.EntityState == EntityState.Unchanged).ToList().ForEach(
                    x =>
                {
                    sqlProject.Tracks.Remove(x);
                    context.DeleteObject(x);
                });

                foreach (Services.Contracts.Title title in project.Titles)
                {
                    id = ExtractIdFromUri(title.Id);

                    Title sqlTitle = sqlProject.Titles.Where(m => m.Id == id).FirstOrDefault();

                    if (sqlTitle == null)
                    {
                        sqlTitle = new Title {
                            Id = id
                        };
                        var tempId = ExtractIdFromUri(title.TitleTemplate.Id);
                        sqlTitle.TitleTemplate = context.TitleTemplate.Where(m => m.Id == tempId).FirstOrDefault();
                        sqlProject.Titles.Add(sqlTitle);
                    }

                    SqlDataProviderTranslator.ConvertToSqlTitle(title, sqlTitle);
                }

                sqlProject.Titles.Where(x => x.EntityState == EntityState.Unchanged).ToList().ForEach(
                    x =>
                {
                    sqlProject.Titles.Remove(x);
                    context.DeleteObject(x);
                });

                context.SaveChanges();

                return(true);
            }
            catch (Exception ex)
            {
                this.Log(ex);
                return(false);
            }
            finally
            {
                if (context != null)
                {
                    context.Dispose();
                }
            }
        }
Ejemplo n.º 5
0
        /// <summary>
        /// Saves a project into the repository.
        /// </summary>
        /// <param name="project">The project to be saved.</param>
        /// <returns>true, indicates that the project was saved. false, that the save failed.</returns>
        public bool SaveProject(Services.Contracts.Project project)
        {
            RoughCutEditorEntities context = new RoughCutEditorEntities {
                CommandTimeout = 1000
            };

            try
            {
                IList <Item> items = new List <Item>();

                RetrieveItems(items, project.MediaBin.Items, context);
                RetrieveItems(items, project.MediaBin.Containers, context);

                string  uriString  = project.Id.ToString();
                Project sqlProject = LoadFullProject(uriString, context);

                if (sqlProject == null)
                {
                    sqlProject = new Project {
                        Id = uriString
                    };
                    context.AddToProject(sqlProject);
                }

                SqlDataProviderTranslator.ConvertToSqlProject(project, sqlProject);

                uriString = project.MediaBin.Id.ToString();

                Container sqlMediaBin = context.Container.Where(m => m.Id == uriString).FirstOrDefault();

                if (sqlMediaBin == null)
                {
                    sqlMediaBin = new Container {
                        Id = uriString, Title = project.MediaBin.Title
                    };
                }

                sqlMediaBin.Items.Clear();

                sqlProject.MediaBin = SqlDataProviderTranslator.ConvertToSqlMediaBin(project.MediaBin, sqlMediaBin, items);

                foreach (RCE.Services.Contracts.Container container in project.MediaBin.Containers)
                {
                    uriString = container.Id.ToString();
                    Container sqlContainer = context.Container.Where(m => m.Id == uriString).FirstOrDefault();

                    if (sqlContainer == null)
                    {
                        sqlContainer = new Container {
                            Id = uriString, Title = container.Title
                        };
                        sqlMediaBin.Containers.Add(sqlContainer);
                    }

                    sqlContainer.Items.Clear();
                    SqlDataProviderTranslator.ConvertToSqlMediaBin(container, sqlContainer, items);
                }

                sqlMediaBin.Containers.Where(x => x.EntityState == EntityState.Unchanged)
                .ToList()
                .ForEach(x =>
                {
                    x.Items.Where(i => i.EntityState == EntityState.Unchanged)
                    .ToList()
                    .ForEach(i =>
                    {
                        x.Items.Remove(i);
                    });

                    sqlMediaBin.Containers.Remove(x);
                    context.DeleteObject(x);
                });

                foreach (Services.Contracts.Comment comment in project.Comments)
                {
                    uriString = comment.Id.ToString();

                    Comment sqlComment = sqlProject.Comments.Where(m => m.Id == uriString).FirstOrDefault();

                    if (sqlComment == null)
                    {
                        sqlComment = new Comment {
                            Id = uriString
                        };
                        sqlProject.Comments.Add(sqlComment);
                    }

                    SqlDataProviderTranslator.ConvertToSqlComment(comment, sqlComment);
                }

                sqlProject.Comments.Where(x => x.EntityState == EntityState.Unchanged)
                .ToList()
                .ForEach(x =>
                {
                    sqlProject.Comments.Remove(x);
                    context.DeleteObject(x);
                });

                foreach (Services.Contracts.Track track in project.Timeline)
                {
                    uriString = track.Id.ToString();

                    Track sqlTrack = sqlProject.Tracks.Where(m => m.Id == uriString).FirstOrDefault();

                    if (sqlTrack == null)
                    {
                        sqlTrack = new Track {
                            Id = uriString
                        };
                        sqlProject.Tracks.Add(sqlTrack);
                    }

                    SqlDataProviderTranslator.ConvertToSqlTrack(track, sqlTrack);

                    foreach (Services.Contracts.Shot shot in track.Shots)
                    {
                        uriString = shot.Id.ToString();

                        Shot sqlShot = sqlTrack.Shots.Where(m => m.Id == uriString).FirstOrDefault();

                        if (sqlShot == null)
                        {
                            sqlShot = new Shot {
                                Id = uriString
                            };
                            sqlTrack.Shots.Add(sqlShot);
                        }

                        SqlDataProviderTranslator.ConvertToSqlShot(shot, sqlShot, items);

                        foreach (Services.Contracts.Comment comment in shot.Comments)
                        {
                            uriString = comment.Id.ToString();

                            Comment sqlComment = sqlProject.Comments.Where(m => m.Id == uriString).FirstOrDefault();

                            if (sqlComment == null)
                            {
                                sqlComment = new Comment {
                                    Id = uriString
                                };
                                sqlShot.Comments.Add(sqlComment);
                            }
                            else if (sqlComment.EntityState == EntityState.Added)
                            {
                                sqlShot.Comments.Add(sqlComment);
                            }

                            SqlDataProviderTranslator.ConvertToSqlComment(comment, sqlComment);
                        }

                        sqlShot.Comments.Where(x => x.EntityState == EntityState.Unchanged)
                        .ToList()
                        .ForEach(x =>
                        {
                            sqlProject.Comments.Remove(x);
                            context.DeleteObject(x);
                        });
                    }

                    sqlTrack.Shots.Where(x => x.EntityState == EntityState.Unchanged)
                    .ToList()
                    .ForEach(x =>
                    {
                        sqlTrack.Shots.Remove(x);
                        context.DeleteObject(x);
                    });
                }

                sqlProject.Tracks.Where(x => x.EntityState == EntityState.Unchanged)
                .ToList()
                .ForEach(x =>
                {
                    sqlProject.Tracks.Remove(x);
                    context.DeleteObject(x);
                });

                foreach (Services.Contracts.Title title in project.Titles)
                {
                    uriString = title.Id.ToString();

                    Title sqlTitle = sqlProject.Titles.Where(m => m.Id == uriString).FirstOrDefault();

                    if (sqlTitle == null)
                    {
                        sqlTitle = new Title {
                            Id = uriString
                        };
                        string tempId = title.TitleTemplate.Id.ToString();
                        sqlTitle.TitleTemplate = context.TitleTemplate.Where(m => m.Id == tempId).FirstOrDefault();
                        sqlProject.Titles.Add(sqlTitle);
                    }

                    SqlDataProviderTranslator.ConvertToSqlTitle(title, sqlTitle);
                }

                sqlProject.Titles.Where(x => x.EntityState == EntityState.Unchanged)
                .ToList()
                .ForEach(x =>
                {
                    sqlProject.Titles.Remove(x);
                    context.DeleteObject(x);
                });

                context.SaveChanges();

                return(true);
            }
            catch (Exception ex)
            {
                this.Log(ex);

                return(false);
            }
        }