コード例 #1
0
        /// <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);
        }
コード例 #2
0
        /// <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);
            }
        }