/* SPDX-License-Identifier: Apache-2.0
*
* The OpenSearch Contributors require contributions made to
* this file be licensed under the Apache-2.0 license or a
* compatible open source license.
*/
/*
* Modifications Copyright OpenSearch Contributors. See
* GitHub history for details.
*
* Licensed to Elasticsearch B.V. under one or more contributor
* license agreements. See the NOTICE file distributed with
* this work for additional information regarding copyright
* ownership. Elasticsearch B.V. licenses this file to you under
* the Apache License, Version 2.0 (the "License"); you may
* not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing,
* software distributed under the License is distributed on an
* "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
* KIND, either express or implied. See the License for the
* specific language governing permissions and limitations
* under the License.
*/
using System.Collections.Concurrent;
using System.Reflection;
using System.Runtime.Serialization;
namespace OpenSearch.Client
{
/// Determines how a POCO property maps to the property on a JSON object when serialized
public interface IPropertyMapping
{
///
/// Ignores this property.
/// - When mapping automatically using
/// - When Indexing this type do not serialize this property and its value
///
bool Ignore { get; set; }
/// Overrides the property name serialized to JSON for this property
string Name { get; set; }
}
///
public class PropertyMapping : IPropertyMapping
{
public static PropertyMapping Ignored = new PropertyMapping { Ignore = true };
///
public bool Ignore { get; set; }
///
public string Name { get; set; }
}
///
/// Provides mappings for CLR types
///
public interface IPropertyMappingProvider
{
///
/// Creates an for a
///
IPropertyMapping CreatePropertyMapping(MemberInfo memberInfo);
}
///
public class PropertyMappingProvider : IPropertyMappingProvider
{
protected readonly ConcurrentDictionary Properties = new ConcurrentDictionary();
///
public virtual IPropertyMapping CreatePropertyMapping(MemberInfo memberInfo)
{
var memberInfoString = $"{memberInfo.DeclaringType?.FullName}.{memberInfo.Name}";
if (Properties.TryGetValue(memberInfoString, out var mapping)) return mapping;
mapping = PropertyMappingFromAttributes(memberInfo);
Properties.TryAdd(memberInfoString, mapping);
return mapping;
}
private static IPropertyMapping PropertyMappingFromAttributes(MemberInfo memberInfo)
{
var dataMemberProperty = memberInfo.GetCustomAttribute(true);
var propertyName = memberInfo.GetCustomAttribute(true);
var ignore = memberInfo.GetCustomAttribute(true);
if (ignore == null && propertyName == null && dataMemberProperty == null) return null;
return new PropertyMapping
{
Name = propertyName?.Name ?? dataMemberProperty?.Name,
Ignore = ignore != null || propertyName != null && propertyName.Ignore
};
}
}
}