blob: c2f384e145e4e13c1903e432f7fc25a0d0ef78cb [file] [log] [blame]
/*
* Licensed to the Apache Software Foundation (ASF) under one or more
* contributor license agreements. See the NOTICE file distributed with
* this work for additional information regarding copyright ownership.
* The ASF 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.
*/
namespace Apache.Ignite.Core.Binary
{
using System.Diagnostics.CodeAnalysis;
using System.Globalization;
using System.Text;
using Apache.Ignite.Core.Impl.Binary;
using Apache.Ignite.Core.Impl.Common;
/// <summary>
/// Base binary name mapper implementation.
/// </summary>
public class BinaryBasicNameMapper : IBinaryNameMapper
{
/// <summary>
/// The simple name instance.
/// </summary>
internal static readonly BinaryBasicNameMapper SimpleNameInstance = new BinaryBasicNameMapper
{
IsSimpleName = true
};
/// <summary>
/// The full name instance.
/// </summary>
internal static readonly BinaryBasicNameMapper FullNameInstance = new BinaryBasicNameMapper();
/// <summary>
/// Gets or sets a value indicating whether this instance maps to simple type names.
/// </summary>
public bool IsSimpleName { get; set; }
/// <summary>
/// Gets or sets the prefix to be added to the full type name.
/// For example, Java package names usually begin with <c>org.</c> or <c>com.</c>.
/// <para />
/// In combination with <see cref="NamespaceToLower"/>, we can map .NET type name <c>Apache.Ignite.Foo</c>
/// to a corresponding Java type name <c>org.apache.ignite.Foo</c>, conforming to the naming conventions
/// for both languages.
/// </summary>
public string NamespacePrefix { get; set; }
/// <summary>
/// Gets or sets a value indicating whether this instance converts the namespace part to the lower case.
/// For example, Java package names are usually lowercase.
/// <para />
/// In combination with <see cref="NamespacePrefix"/>, we can map .NET type name <c>Apache.Ignite.Foo</c>
/// to a corresponding Java type name <c>org.apache.ignite.Foo</c>, conforming to the naming conventions
/// for both languages.
/// </summary>
public bool NamespaceToLower { get; set; }
/// <summary>
/// Gets the type name.
/// </summary>
public string GetTypeName(string name)
{
IgniteArgumentCheck.NotNullOrEmpty(name, "typeName");
var parsedName = TypeNameParser.Parse(name);
if (parsedName.Generics == null)
{
// Generics are rare, use simpler logic for the common case.
return GetTypeName(parsedName) + parsedName.GetArray();
}
return BuildTypeName(parsedName, new StringBuilder()).ToString();
}
/// <summary>
/// Gets the field name.
/// </summary>
public string GetFieldName(string name)
{
return name;
}
/// <summary>
/// Builds the type name.
/// </summary>
private StringBuilder BuildTypeName(TypeNameParser typeName, StringBuilder sb)
{
sb.Append(GetTypeName(typeName));
var generics = typeName.Generics;
if (generics != null && generics.Count > 0) // Generics are non-null but empty when unbound.
{
sb.Append('[');
var first = true;
foreach (var genArg in generics)
{
if (first)
{
first = false;
}
else
{
sb.Append(',');
}
sb.Append('[');
BuildTypeName(genArg, sb);
sb.Append(']');
}
sb.Append(']');
}
sb.Append(typeName.GetArray());
return sb;
}
/// <summary>
/// Gets the type name from the parser.
/// </summary>
[SuppressMessage("Microsoft.Globalization", "CA1308:NormalizeStringsToUppercase",
Justification = "Not applicable, lower case is required.")]
private string GetTypeName(TypeNameParser name)
{
if (IsSimpleName)
return name.GetName();
var fullName = NamespaceToLower && name.HasNamespace()
? name.GetNamespace().ToLower(CultureInfo.InvariantCulture) + name.GetName()
: name.GetNameWithNamespace();
return NamespacePrefix + fullName;
}
}
}