/// <summary> /// Updates the resource property. /// </summary> /// <param name="context">The context.</param> /// <param name="resource">The resource.</param> /// <param name="atomEntry">The atom entry.</param> private static void UpdateResourceProperty( ZentityContext context, ScholarlyWork resource, AtomEntryDocument atomEntry) { resource.Title = atomEntry.Title.Text; SetContentType(context, resource, atomEntry.Title.Type, AtomPubConstants.TitleTypeProperty); resource.DateModified = DateTime.Now; Publication publication = resource as Publication; if (null != publication && atomEntry.PublishDate != DateTimeOffset.MinValue) { publication.DatePublished = atomEntry.PublishDate.DateTime; } if (null != atomEntry.Copyright) { resource.Copyright = atomEntry.Copyright.Text; SetContentType(context, resource, atomEntry.Copyright.Type, AtomPubConstants.CopyrightTypeProperty); } if (null != atomEntry.Summary && !string.IsNullOrEmpty(atomEntry.Summary.Text)) { SetExtensionProperty(context, resource, AtomPubConstants.SummaryProperty, atomEntry.Summary.Text); SetContentType(context, resource, atomEntry.Summary.Type, AtomPubConstants.SummaryTypeProperty); } if (null != atomEntry.Content) { UrlSyndicationContent urlContent = atomEntry.Content as UrlSyndicationContent; if (null != urlContent) { resource.Description = null; SetExtensionProperty(context, resource, AtomPubConstants.ContentUrlProperty, urlContent.Url.AbsoluteUri); } else { ResourceProperty urlContentProperty = ZentityAtomPubStoreReader.GetResourceProperty(resource, AtomPubConstants.ContentUrlProperty); if (null != urlContentProperty) { resource.ResourceProperties.Remove(urlContentProperty); } TextSyndicationContent textDescription = atomEntry.Content as TextSyndicationContent; if (null != textDescription) { resource.Description = textDescription.Text; } else { XmlSyndicationContent content = atomEntry.Content as XmlSyndicationContent; if (null != content) { XmlDictionaryReader contentReader = content.GetReaderAtContent(); StringBuilder contentValue = new StringBuilder(151); try { while (contentReader.Read()) { contentValue.Append(contentReader.Value); } } finally { contentReader.Close(); } resource.Description = contentValue.ToString(); } } } SetContentType(context, resource, atomEntry.Content.Type, AtomPubConstants.DescriptionTypeProperty); } if (null != atomEntry.Source) { ResourceProperty source = ZentityAtomPubStoreReader.GetResourceProperty(resource, AtomPubConstants.SourceProperty); if (null == source) { Property sourceProperty = GetProperty(context, AtomPubConstants.SourceProperty); source = new ResourceProperty { Property = sourceProperty, Resource = resource, }; } source.Value = atomEntry.Source; } #region Add Links List <ResourceProperty> links = ZentityAtomPubStoreReader.GetResourceProperties(resource, AtomPubConstants.LinksProperty); if (0 == atomEntry.XmlLinks.Count && null != links) { foreach (var item in links) { resource.ResourceProperties.Remove(item); } } Property linkProperty = GetProperty(context, AtomPubConstants.LinksProperty); foreach (string xmlLink in atomEntry.XmlLinks) { resource.ResourceProperties.Add(new ResourceProperty { Resource = resource, Property = linkProperty, Value = xmlLink }); } #endregion var authors = atomEntry.Authors.Select(author => new Person { Title = author.Name, Email = author.Email, Uri = author.Uri }); // Bug Fix : 177689 - AtomPub (M2): Author node is appending after every PUT request instead // of overwriting it. // Remove previous authors. resource.Authors.Clear(); AddPersons(context, resource.Authors, authors); resource.Contributors.Clear(); var contributors = atomEntry.Contributors.Select(author => new Person { Title = author.Name, Email = author.Email, Uri = author.Uri }); AddPersons(context, resource.Contributors, contributors); }
/// <summary> /// Adds the links and source. /// </summary> /// <param name="baseUri">The base URI.</param> /// <param name="resource">The resource.</param> /// <param name="item">The syndication item.</param> private static void AddLinksAndSource(Uri baseUri, ScholarlyWork resource, ref SyndicationItem item) { // NameValue pair for creating Uri from UriTemplate. NameValueCollection parameters = new NameValueCollection(); parameters.Add(AtomPubParameterType.CollectionName.ToString(), resource.GetType().Name); parameters.Add(AtomPubParameterType.Id.ToString(), resource.Id.ToString()); Core.File mediaFile = resource.Files.FirstOrDefault(); if (null != mediaFile) { Uri mediaUri = AtomPubHelper.AtomPubTemplates[AtomPubRequestType.EditMedia] .BindByName(baseUri, parameters); // Add content linnk and edit-media link if (string.IsNullOrEmpty(mediaFile.MimeType)) { mediaFile.MimeType = AtomPubConstants.DefaultMimeType; } SyndicationLink resourceMediaLink = new SyndicationLink(mediaUri); resourceMediaLink.RelationshipType = AtomPubConstants.EditMedia; item.Links.Add(resourceMediaLink); item.Content = new UrlSyndicationContent(mediaUri, mediaFile.MimeType); } else { ResourceProperty urlContent = GetResourceProperty(resource, AtomPubConstants.ContentUrlProperty); if (null != urlContent && !string.IsNullOrEmpty(urlContent.Value)) { item.Content = GetContent <UrlSyndicationContent>(urlContent.Value, resource.ResourceProperties, AtomPubConstants.DescriptionTypeProperty, false); } else { item.Content = GetContent <SyndicationContent>(resource.Description, resource.ResourceProperties, AtomPubConstants.DescriptionTypeProperty, true); } } // Add resource Edit link Uri resourceUri = AtomPubHelper.AtomPubTemplates[AtomPubRequestType.EditMember].BindByName(baseUri, parameters); SyndicationLink resourceEditLink = new SyndicationLink(resourceUri); resourceEditLink.RelationshipType = AtomPubConstants.Edit; item.Links.Add(resourceEditLink); if (null != resource.Container) { var relatedItems = resource.Container.ContainedWorks.OfType <ScholarlyWorkContainer>() .SelectMany(tuple => tuple.ContainedWorks) .Where(tuple => !(tuple is ScholarlyWorkContainer)); foreach (ScholarlyWork containedItem in relatedItems) { parameters.Set(AtomPubParameterType.CollectionName.ToString(), containedItem.GetType().Name); parameters.Set(AtomPubParameterType.Id.ToString(), containedItem.Id.ToString()); resourceUri = AtomPubHelper.AtomPubTemplates[AtomPubRequestType.EditMember].BindByName(baseUri, parameters); SyndicationLink containsEditLink = new SyndicationLink(resourceUri); containsEditLink.RelationshipType = AtomPubConstants.Related; item.Links.Add(containsEditLink); } } AtomEntryDocument entry = new AtomEntryDocument(item); IEnumerable <ResourceProperty> links = ZentityAtomPubStoreReader.GetResourceProperties(resource, AtomPubConstants.LinksProperty); if (null != links) { foreach (ResourceProperty link in links) { entry.XmlLinks.Add(link.Value); } } ResourceProperty source = GetResourceProperty(resource, AtomPubConstants.SourceProperty); if (null != source) { entry.Source = source.Value; } using (XmlReader reader = new XmlTextReader(entry.AtomEntry, XmlNodeType.Document, null)) { item = SyndicationItem.Load(reader); } }