Inheritance: Terradue.GeoJson.Feature.Feature, IOpenSearchResultItem
 public FeatureResult(FeatureResult result)
     : this((Terradue.GeoJson.Feature.Feature)result)
 {
     links = new Collection<SyndicationLink>(result.Links);
     elementExtensions = new SyndicationElementExtensionCollection(result.elementExtensions);
     this.Title = result.Title;
     this.LastUpdatedTime = result.LastUpdatedTime;
     base.Id = result.Id;
     this.authors = result.Authors;
     this.categories = result.Categories;
 }
        public override object ReadJson(JsonReader reader, Type objectType, object existingValue, JsonSerializer serializer)
        {
            FeatureResult f = new FeatureResult();
            JToken jsont = serializer.Deserialize<JToken>(reader);

            if (jsont.SelectToken("id") != null)
                f.Id = jsont.SelectToken("id").ToString();

            if (jsont.SelectToken("properties") != null)
                GenericFunctions.ImportProperties(jsont.SelectToken("properties"), f);

            if (jsont.SelectToken("geometry") != null) {
                GeometryConverter geomConverter = new GeometryConverter();
                f.Geometry = (GeometryObject)geomConverter.ReadJson(jsont.SelectToken("geometry").CreateReader(), typeof(GeometryObject), jsont, serializer);
            }

            return f;
        }
        public FeatureResult ImportItem(IOpenSearchResultItem result)
        {
            if (result == null)
                throw new ArgumentNullException("result");

            FeatureResult feature;
            XmlDocument doc = new XmlDocument();

            List<XmlElement> elements = new List<XmlElement>();
            foreach (var ext in result.ElementExtensions) {
                XmlElement element = ext.GetObject<XmlElement>();
                elements.Add(element);
            }

            XmlElement geometry = ImportUtils.FindGmlGeometry(elements.ToArray());
            if (geometry != null)
                feature = new FeatureResult(Terradue.GeoJson.Geometry.GeometryFactory.GmlToFeature(geometry));
            else {
                geometry = util.FindDctSpatialGeometry(elements.ToArray());
                if (geometry != null)
                    feature = new FeatureResult(Terradue.GeoJson.Geometry.GeometryFactory.WktToFeature(geometry.InnerXml));
                else
                    feature = new FeatureResult(Terradue.GeoJson.Geometry.GeometryFactory.WktToFeature(null));
            }

            NameValueCollection namespaces = null;
            XmlNamespaceManager xnsm = null;
            string prefix = "";

            feature.Id = result.Id;
            feature.Identifier = result.identifier;
            if (result.Date != null)
                feature.Properties.Add(prefix + "published", result.Date.ToString("yyyy'-'MM'-'dd'T'HH':'mm':'ss'Z'"));
            if (result.Links != null && result.Links.Count > 0) {
                feature.Links = result.Links;
            }
            if (result.Title != null)
                feature.Title = result.Title;

            return feature;
        }
        public static FeatureResult FromOpenSearchResultItem(IOpenSearchResultItem result)
        {
            if (result == null)
                throw new ArgumentNullException("result");

            FeatureResult feature;

            var geom = ImportUtils.FindGeometry(result);

            if (geom != null)
                feature = new FeatureResult(new Feature(geom, null));
            else
                feature = new FeatureResult();

            feature.ElementExtensions = new SyndicationElementExtensionCollection(result.ElementExtensions);
            feature.Id = result.Id;
            feature.LastUpdatedTime = result.LastUpdatedTime;
            feature.PublishDate = result.PublishDate;
            feature.Summary = result.Summary;
            feature.Content = result.Content;
            feature.contributors = result.Contributors;
            feature.authors = result.Authors;
            feature.Title = result.Title;
            feature.categories = result.Categories;
            feature.Copyright = result.Copyright;
            feature.Identifier = result.Identifier;

            feature.Links = new Collection<SyndicationLink>(result.Links);

            feature.sortKey = result.SortKey;

            return feature;
        }
        public FeatureResult ImportItem(SyndicationItem item)
        {
            if (item != null) {

                List<XmlElement> elements = new List<XmlElement>();
                foreach (var element in item.ElementExtensions) {
                    elements.Add(element.GetObject<XmlElement>());
                }

                XmlElement geometry = ImportUtils.FindGmlGeometry(elements.ToArray());

                FeatureResult feature = new FeatureResult(Terradue.GeoJson.Geometry.GeometryFactory.GmlToFeature(geometry));

                NameValueCollection namespaces = null;
                XmlNamespaceManager xnsm = null;
                string prefix = "";

                if (options.KeepNamespaces) {

                    // Initialize namespaces
                    namespaces = new NameValueCollection();
                    namespaces.Set("", "http://geojson.org/ns#");
                    namespaces.Set("atom", "http://www.w3.org/2005/Atom");
                    XmlReader reader = item.ElementExtensions.GetReaderAtElementExtensions();
                    xnsm = new XmlNamespaceManager(reader.NameTable);
                    foreach (var names in xnsm.GetNamespacesInScope(XmlNamespaceScope.All)) {
                        namespaces.Set(names.Key, names.Value);
                    }
                    feature.Properties.Add("@namespaces", namespaces);
                    prefix = "atom:";
                }

                // Import Item
                if ((item.Authors != null) && (item.Authors.Count > 0)) {
                    object[] authors = new object[item.Authors.Count];
                    feature.Properties.Add(prefix + "authors", authors);
                    for (int i = 0; i < item.Authors.Count; i++) {
                        Dictionary<string,object> author = new Dictionary<string, object>();
                        author.Add(prefix + "name", item.Authors[i].Name);
                        author.Add(prefix + "email", item.Authors[i].Email);
                        author.Add(prefix + "uri", item.Authors[i].Uri);
                        author = author.Union(util.ImportAttributeExtensions(item.Authors[i].AttributeExtensions, namespaces, xnsm)).ToDictionary(x => x.Key, x => x.Value);
                        author = author.Union(util.ImportElementExtensions(item.Authors[i].ElementExtensions, namespaces)).ToDictionary(x => x.Key, x => x.Value);
                        authors[i] = author;
                    }
                }
                if (item.BaseUri != null) {
                    feature.Properties.Add(prefix + "uri", item.BaseUri.ToString());
                }
                if ((item.Categories != null) && (item.Categories.Count > 0)) {
                    object[] categories = new object[item.Categories.Count];
                    feature.Properties.Add(prefix + "categories", categories);
                    for (int i = 0; i < item.Categories.Count; i++) {
                        Dictionary<string,object> category = new Dictionary<string, object>();
                        category.Add(prefix + "name", item.Categories[i].Name);
                        category.Add(prefix + "label", item.Categories[i].Label);
                        category.Add(prefix + "scheme", item.Categories[i].Scheme);
                        category = category.Union(util.ImportAttributeExtensions(item.Categories[i].AttributeExtensions, namespaces, xnsm)).ToDictionary(x => x.Key, x => x.Value);
                        category = category.Union(util.ImportElementExtensions(item.Categories[i].ElementExtensions, namespaces)).ToDictionary(x => x.Key, x => x.Value);
                        categories[i] = category;
                    }
                }
                if ((item.Contributors != null) && (item.Contributors.Count > 0)) {
                    object[] contributors = new object[item.Contributors.Count];
                    feature.Properties.Add(prefix + "categories", contributors);
                    for (int i = 0; i < item.Contributors.Count; i++) {
                        Dictionary<string,object> contributor = new Dictionary<string, object>();
                        contributor.Add(prefix + "name", item.Contributors[i].Name);
                        contributor.Add(prefix + "email", item.Contributors[i].Email);
                        contributor.Add(prefix + "uri", item.Contributors[i].Uri);
                        contributor = contributor.Union(util.ImportAttributeExtensions(item.Contributors[i].AttributeExtensions, namespaces, xnsm)).ToDictionary(x => x.Key, x => x.Value);
                        contributor = contributor.Union(util.ImportElementExtensions(item.Contributors[i].ElementExtensions, namespaces)).ToDictionary(x => x.Key, x => x.Value);
                        contributors[i] = contributor;
                    }
                }
                if (item.Copyright != null) {
                    feature.Properties.Add(prefix + "rights", item.Copyright.Text);
                }
                if (item.Summary != null) {
                    feature.Properties.Add(prefix + "summary", item.Summary.Text);
                }
                if (item.Content != null) {
                    feature.Properties.Add(prefix + "content", item.Summary.Text);
                }
                feature.Id = item.Id;
                if (item.LastUpdatedTime != null)
                    feature.Properties.Add(prefix + "published", item.LastUpdatedTime);
                if ((item.Links != null) && (item.Links.Count > 0)) {
                    feature.Links = item.Links;
                }
                if (item.Title != null)
                    feature.Properties.Add(prefix + "title", item.Title);

                return feature;
            }

            return null;
        }
        public static Dictionary<string, object> ExportProperties(FeatureResult feature)
        {
            // Start with an empty NameValueCollection
            Dictionary <string,object> properties = new Dictionary<string, object>();

            if (feature.Links != null && feature.Links.Count > 0) {
                properties["links"] = GenericFunctions.LinksToProperties(feature.Links);
            }
            if (feature.LastUpdatedTime.Ticks != 0)
                properties["updated"] = feature.LastUpdatedTime.ToUniversalTime().ToString("yyyy-MM-ddTHH:mm:ssZ");
            if (feature.PublishDate.Ticks != 0)
                properties["published"] = feature.PublishDate.ToUniversalTime().ToString("yyyy-MM-ddTHH:mm:ssZ");
            if (feature.Title != null)
                properties["title"] = feature.Title.Text;
            if (feature.Summary != null)
                properties["summary"] = feature.Summary.Text;
            if (feature.Content != null) {
                var dic = new Dictionary<string, string>();
                if (!string.IsNullOrEmpty(feature.Content.Type))
                    dic.Add("type", feature.Content.Type);
                if (feature.Content is XmlSyndicationContent)
                {
                    MemoryStream ms = new MemoryStream();
                    var xw = XmlWriter.Create(ms);
                    (feature.Content as XmlSyndicationContent).WriteTo(xw, "content", "");
                    xw.Flush();
                    ms.Seek(0, SeekOrigin.Begin);
                    dic.Add("value", XElement.Load(XmlReader.Create(ms)).Value);
                }
                if (feature.Content is TextSyndicationContent)
                {
                    dic.Add("value", (feature.Content as TextSyndicationContent).Text);
                }
                if (feature.Content is UrlSyndicationContent)
                {
                    dic.Add("src", (feature.Content as UrlSyndicationContent).Url.ToString());
                }
                properties["content"] = dic;
            }

            if (feature.Authors != null && feature.Authors.Count > 0) {
                List<object> authors = new List<object>();
                foreach (var author in feature.Authors) {
                    Dictionary<string,object> authord = GenericFunctions.ExportSyndicationElementExtensions(author.ElementExtensions);
                    if (authord == null)
                        authord = new Dictionary<string, object>();
                    authord.Add("email", author.Email);
                    authord.Add("name", author.Name);
                    if (author.Uri != null)
                        authord.Add("uri", author.Uri.ToString());

                    authors.Add(authord);
                }
                properties["authors"] = authors;
            }

            if (feature.Categories != null && feature.Categories.Count > 0) {
                List<object> categories = new List<object>();
                foreach (var category in feature.Categories) {
                    Dictionary<string,object> cat = GenericFunctions.ExportSyndicationElementExtensions(category.ElementExtensions);
                    if (cat == null)
                        cat = new Dictionary<string, object>();
                    cat.Add("@term", category.Name);
                    cat.Add("@label", category.Label);
                    cat.Add("@scheme", category.Scheme);

                    categories.Add(cat);
                }
                properties["categories"] = categories;
            }

            if (feature.Copyright != null) {
                properties["copyright"] = feature.Copyright.Text;
            }

            var exts = GenericFunctions.ExportSyndicationElementExtensions(feature.ElementExtensions);

            properties = properties.Concat(exts).ToDictionary(x => x.Key, x => x.Value);

            return properties;
        }
        public static void ImportProperties(JToken propObject, FeatureResult feature)
        {
            foreach (var child in propObject.Children<JProperty>()) {

                if (child.Path == "properties.authors") {
                    foreach (var linkObject in child.Values())
                        feature.Authors.Add(SyndicationPersonFromJTokenList(linkObject));
                    continue;
                }

                if (child.Path == "properties.contirbutors") {
                    foreach (var linkObject in child.Values())
                        feature.Contributors.Add(SyndicationPersonFromJTokenList(linkObject));
                    continue;
                }

                if (child.Path == "properties.title") {
                    feature.Title = GenericFunctions.TryTextSyndicationContent(child);
                    continue;
                }

                if (child.Path == "properties.links") {
                    foreach (var linkObject in child.Values())
                        feature.Links.Add(SyndicationLinkFromJTokenList(linkObject));
                    continue;
                }

                if (child.Path == "properties.published") {
                    feature.PublishDate = child.Values().First().Value<DateTime>();
                    continue;
                }

                if (child.Path == "properties.updated") {
                    feature.LastUpdatedTime = child.Values().First().Value<DateTime>();
                    continue;
                }

                if (child.Path == "properties.summary") {
                    feature.Summary = GenericFunctions.TryTextSyndicationContent(child);
                    continue;
                }

                if (child.Path == "properties.content") {
                    feature.Content = GenericFunctions.TrySyndicationContent(child);
                    continue;
                }

                if (child.Path == "properties.copyright") {
                    feature.Copyright = GenericFunctions.TryTextSyndicationContent(child);
                    continue;
                }

                try {
                    if (child.Value.Type == JTokenType.Array) {
                        foreach (var child1 in child.Value) {
                            var xmlReader = JsonConvert.DeserializeXNode("{" + child.Name + ":" + child1.ToString() + "}").CreateReader();
                            feature.ElementExtensions.Add(new SyndicationElementExtension(xmlReader));
                        }
                    } else {
                        var xmlReader = JsonConvert.DeserializeXNode("{" + child.ToString() + "}").CreateReader();
                        feature.ElementExtensions.Add(new SyndicationElementExtension(xmlReader));
                    }
                } catch (Exception) {
                }
            }
        }