OpenAPI.NET.OData/src/Microsoft.OpenApi.OData.Reader/Edm/EdmOperationProvider.cs
Gareth Jones c1aa5a6f94
Add model reference support to library and command line utility. (#81)
* Support many conversion options in the command-line tool.
Support local reference files in file-based csdl in the library and command-line tool.

* Added tests for references.

* Updates from github review.
2021-01-14 16:56:26 -08:00

92 lines
3.5 KiB
C#

// ------------------------------------------------------------
// Copyright (c) Microsoft Corporation. All rights reserved.
// Licensed under the MIT License (MIT). See LICENSE in the repo root for license information.
// ------------------------------------------------------------
using System;
using System.Collections.Generic;
using System.Linq;
using Microsoft.OData.Edm;
using Microsoft.OpenApi.OData.Common;
namespace Microsoft.OpenApi.OData.Edm
{
internal class EdmOperationProvider
{
private Lazy<IDictionary<string, IList<IEdmOperation>>> _boundEdmOperations;
/// <summary>
/// Gets the Edm model.
/// </summary>
public IEdmModel Model { get; }
/// <summary>
/// Initializes a new instance of <see cref="EdmOperationProvider"/> class.
/// </summary>
/// <param name="model">The Edm model.</param>
public EdmOperationProvider(IEdmModel model)
{
Utils.CheckArgumentNull(model, nameof(model));
Model = model;
_boundEdmOperations = new Lazy<IDictionary<string, IList<IEdmOperation>>>(
() => LoadEdmOperations(), isThreadSafe: false);
}
public IDictionary<string, IList<IEdmOperation>> Operations => _boundEdmOperations.Value;
/// <summary>
/// Find the Edm operation bounding to the given entity type.
/// </summary>
/// <param name="entityType">The binding entity type.</param>
/// <param name="collection">The collection or not.</param>
/// <returns>The found Edm operations.</returns>
public IEnumerable<IEdmOperation> FindOperations(IEdmEntityType entityType, bool collection)
{
Utils.CheckArgumentNull(entityType, nameof(entityType));
string fullTypeName = collection ? "Collection(" + entityType.FullName() + ")" : entityType.FullName();
IList<IEdmOperation> edmOperations;
_boundEdmOperations.Value.TryGetValue(fullTypeName, out edmOperations);
foreach (IEdmEntityType derived in Model.FindAllDerivedTypes(entityType).OfType<IEdmEntityType>())
{
string subFullTypeName = collection ? "Collection(" + derived.FullName() + ")" : derived.FullName();
if (_boundEdmOperations.Value.TryGetValue(subFullTypeName, out IList<IEdmOperation> edmSubOperations))
{
foreach(var edmOperation in edmSubOperations)
{
edmOperations.Add(edmOperation);
}
}
}
return edmOperations;
}
private IDictionary<string, IList<IEdmOperation>> LoadEdmOperations()
{
IDictionary<string, IList<IEdmOperation>> edmOperationDict = new Dictionary<string, IList<IEdmOperation>>();
foreach (var edmOperation in Model.GetAllElements().OfType<IEdmOperation>().Where(e => e.IsBound))
{
IEdmOperationParameter bindingParameter = edmOperation.Parameters.First();
string bindingTypeName = bindingParameter.Type.FullName();
if (!edmOperationDict.TryGetValue(bindingTypeName, out IList<IEdmOperation> value))
{
value = new List<IEdmOperation>();
edmOperationDict[bindingTypeName] = value;
}
value.Add(edmOperation);
}
return edmOperationDict;
}
}
}