diff --git a/src/MetadataExtractorCron.sln b/src/MetadataExtractorCron.sln index 80cac292f3bfbb8f2444554141f60bc187b7558b..792e506fa06e77e39e9089a98c2afc3549f17829 100644 --- a/src/MetadataExtractorCron.sln +++ b/src/MetadataExtractorCron.sln @@ -3,7 +3,9 @@ Microsoft Visual Studio Solution File, Format Version 12.00 # Visual Studio Version 17 VisualStudioVersion = 17.1.32414.318 MinimumVisualStudioVersion = 10.0.40219.1 -Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "MetadataExtractorCron", "MetadataExtractorCron\MetadataExtractorCron.csproj", "{B76A7422-1D0F-491F-B71C-D00E7C885C4A}" +Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "MetadataExtractorCron", "MetadataExtractorCron\MetadataExtractorCron.csproj", "{B76A7422-1D0F-491F-B71C-D00E7C885C4A}" +EndProject +Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "OpenApiGeneratedConnector", "OpenApiGeneratedConnector\OpenApiGeneratedConnector.csproj", "{6FAAF00B-335B-4896-826F-06CA79CAA2E0}" EndProject Global GlobalSection(SolutionConfigurationPlatforms) = preSolution @@ -15,6 +17,10 @@ Global {B76A7422-1D0F-491F-B71C-D00E7C885C4A}.Debug|Any CPU.Build.0 = Debug|Any CPU {B76A7422-1D0F-491F-B71C-D00E7C885C4A}.Release|Any CPU.ActiveCfg = Release|Any CPU {B76A7422-1D0F-491F-B71C-D00E7C885C4A}.Release|Any CPU.Build.0 = Release|Any CPU + {6FAAF00B-335B-4896-826F-06CA79CAA2E0}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {6FAAF00B-335B-4896-826F-06CA79CAA2E0}.Debug|Any CPU.Build.0 = Debug|Any CPU + {6FAAF00B-335B-4896-826F-06CA79CAA2E0}.Release|Any CPU.ActiveCfg = Release|Any CPU + {6FAAF00B-335B-4896-826F-06CA79CAA2E0}.Release|Any CPU.Build.0 = Release|Any CPU EndGlobalSection GlobalSection(SolutionProperties) = preSolution HideSolutionNode = FALSE diff --git a/src/MetadataExtractorCron/Extractors/CoscineMetadataExtractor.cs b/src/MetadataExtractorCron/Extractors/CoscineMetadataExtractor.cs new file mode 100644 index 0000000000000000000000000000000000000000..c79a593b8a9bf1706dc00007a7ae769a6a1ac6c0 --- /dev/null +++ b/src/MetadataExtractorCron/Extractors/CoscineMetadataExtractor.cs @@ -0,0 +1,387 @@ +using Coscine.Configuration; +using Coscine.Database.Models; +using Coscine.Metadata; +using Coscine.ResourceTypes; +using Coscine.ResourceTypes.Base; +using Coscine.ResourceTypes.Base.Models; +using Org.OpenAPITools.Api; +using Org.OpenAPITools.Model; +using VDS.RDF.Query; +using VDS.RDF; +using MetadataExtractorCron.Util; +using VDS.RDF.Parsing; +using System.Globalization; +using System.Security.Cryptography; + +namespace MetadataExtractorCron.Extractors; + +public class CoscineMetadataExtractor : IMetadataExtractor +{ + private readonly string _resourceUrlPrefix = "https://purl.org/coscine/resources"; + + private readonly IConfiguration _configuration; + private readonly DefaultApi _apiClient; + + private readonly RdfStoreConnector _rdfStoreConnector; + private readonly MetadataGraphsCreator _metadataGraphsCreator; + + private const string metadataExtractionVersionUrl = "https://purl.org/coscine/terms/metatadataextraction#version"; + private const string dcatdistributionUrl = "http://www.w3.org/ns/dcat#distribution"; + private const string partOfUri = "http://purl.org/dc/terms/isPartOf"; + private const string aUri = "http://www.w3.org/1999/02/22-rdf-syntax-ns#type"; + private const string dctermsModifiedUri = "http://purl.org/dc/terms/modified"; + private const string rdfSourceUri = "http://www.w3.org/ns/ldp#RDFSource"; + private const string trellisGraphUri = "http://www.trellisldp.org/ns/trellis#PreferServerManaged"; + + public CoscineMetadataExtractor() + { + _configuration = new ConsulConfiguration(); + _apiClient = new DefaultApi( + _configuration.GetStringAndWait( + "coscine/local/metadataextractor/url", + "https://metadataextractor.otc.coscine.dev/" + ) + ); + _rdfStoreConnector = new RdfStoreConnector(_configuration.GetStringAndWait("coscine/local/virtuoso/additional/url")); + _metadataGraphsCreator = new MetadataGraphsCreator(_rdfStoreConnector); + } + + public async Task PerformExtraction() + { + var modelVersion = await _apiClient.GetVersionWorkerAsync(); + var version = modelVersion._Version; + + var metadataExtractionModel = new MetadataExtractionModel(); + var resourceModel = new ResourceModel(); + + foreach (var extraction in metadataExtractionModel.GetAllWhere((extration) => extration.Activated)) + { + var resourceId = extraction.ResourceId; + Console.WriteLine($"Working on resource {resourceId}"); + var resource = resourceModel.GetByIdIncludingDeleted(resourceId); + + var resourceTypeDefinition = ResourceTypeFactory.Instance.GetResourceType(resource); + if (resourceTypeDefinition == null) + { + Console.WriteLine($"Broken resource type for resource {resourceId}"); + continue; + } + var resourceTypeOptions = resourceModel.GetResourceTypeOptions(resourceId); + + var fileInfos = await ReceiveAllFiles(resourceTypeDefinition, resourceId.ToString(), resourceTypeOptions); + + foreach (var file in fileInfos.Where((fileInfo) => fileInfo.HasBody)) + { + if (file.BodyBytes > 16 * 1000 * 1000) + { + Console.WriteLine($"Skipping {file.Key} on {resourceId} since it has a too large byte size"); + continue; + } + Console.WriteLine($"Iterating over {file.Key} on {resourceId}"); + CreateMetadataSetsIfDontExist(resourceId.ToString(), file, fileInfos); + if (!HasCurrentMetadataExtracted(resourceId.ToString(), file)) + { + Console.WriteLine($"Extracting metadata for {file.Key} on {resourceId}"); + try + { + var extractedMetadata = await ExtractMetadata(resourceId.ToString(), file, resourceTypeDefinition, resourceTypeOptions); + await StoreExtractedMetadata(resourceId.ToString(), file, extractedMetadata, resourceTypeDefinition, resourceTypeOptions); + } + catch (Exception e) + { + Console.WriteLine($"Error extracting metadata for {file.Key} on {resourceId} with error message: {e.Message}, Inner: {(e.InnerException != null ? e.InnerException.Message : "none")}"); + } + } + else + { + Console.WriteLine($"Metadata for {file.Key} on {resourceId} already exists"); + } + } + } + } + + private async Task<IEnumerable<ResourceEntry>> ReceiveAllFiles(BaseResourceType resourceTypeDefinition, string resourceId, Dictionary<string, string>? resourceTypeOptions, string path = "") + { + var fileInfos = new List<ResourceEntry>(); + var currentFileInfos = await resourceTypeDefinition.ListEntries(resourceId, path, resourceTypeOptions); + fileInfos.AddRange(currentFileInfos); + foreach (var currentFileInfo in currentFileInfos.Where((currentFileInfo) => !currentFileInfo.HasBody)) + { + fileInfos.AddRange(await ReceiveAllFiles(resourceTypeDefinition, resourceId, resourceTypeOptions, currentFileInfo.Key)); + } + return fileInfos; + } + + private void CreateMetadataSetsIfDontExist(string resourceId, ResourceEntry entry, IEnumerable<ResourceEntry> fileInfos) + { + var resourceGraphName = $"{_resourceUrlPrefix}/{resourceId}"; + var newFileGraphName = $"{resourceGraphName}/{entry.Key}"; + if (!newFileGraphName.EndsWith("/")) + { + newFileGraphName += "/"; + } + + var existingGraphs = ListGraphs(newFileGraphName); + if (!existingGraphs.Any()) + { + Console.WriteLine($"Creating graphs for {newFileGraphName} since they did not exist before!"); + _metadataGraphsCreator.CreateGraphs(resourceId, entry, fileInfos); + } + } + + private IEnumerable<Uri> ListGraphs(string id) + { + var cmdString = new SparqlParameterizedString + { + CommandText = @"SELECT DISTINCT ?g + WHERE { GRAPH ?g { ?s ?p ?o } + FILTER(contains(str(?g), @graph)) }" + }; + cmdString.SetLiteral("graph", id); + + var resultSet = _rdfStoreConnector.QueryEndpoint.QueryWithResultSet(cmdString.ToString()); + + var graphs = new List<Uri>(); + foreach (SparqlResult r in resultSet) + { + var uriNode = r.Value("g") as UriNode; + if (uriNode is not null) + { + graphs.Add(uriNode.Uri); + } + } + return graphs; + } + + private bool HasCurrentMetadataExtracted(string resourceId, ResourceEntry entry) + { + var resourceGraphName = $"{_resourceUrlPrefix}/{resourceId}"; + var newFileGraphName = $"{resourceGraphName}/{entry.Key}"; + if (!newFileGraphName.EndsWith("/")) + { + newFileGraphName += "/"; + } + + var existingGraphs = ListGraphs(newFileGraphName); + var recentDataVersion = VersionUtil.GetRecentDataVersion(existingGraphs); + var recentDataExtractedVersion = VersionUtil.GetRecentDataExtractedVersion(existingGraphs); + + return + recentDataExtractedVersion != null + && recentDataVersion != null + && recentDataExtractedVersion.AbsoluteUri.Contains(recentDataVersion.AbsoluteUri) + && recentDataExtractedVersion.AbsoluteUri != recentDataVersion.AbsoluteUri; + } + + private async Task<MetadataOutput> ExtractMetadata(string resourceId, ResourceEntry entry, BaseResourceType resourceTypeDefinition, Dictionary<string, string>? resourceTypeOptions) + { + var loadedEntry = await resourceTypeDefinition.LoadEntry(resourceId, entry.Key, resourceTypeOptions); + + if (loadedEntry is null) + { + throw new NullReferenceException("The resulting stream of the loaded entry is null."); + } + + var extractedOutputs = await _apiClient.PostMetadataExtractorWorkerAsync( + loadedEntry, + $"{resourceId}/{entry.Key}", + null, + entry.Created?.ToString("o", CultureInfo.InvariantCulture), + entry.Modified?.ToString("o", CultureInfo.InvariantCulture) + ); + + return extractedOutputs[0]; + } + + private async Task StoreExtractedMetadata(string resourceId, ResourceEntry entry, MetadataOutput extractedMetadata, BaseResourceType resourceTypeDefinition, Dictionary<string, string>? resourceTypeOptions) + { + var metadataExtractorVersion = (await _apiClient.GetVersionWorkerAsync())._Version; + + var resourceGraphName = $"{_resourceUrlPrefix}/{resourceId}"; + var newFileGraphName = $"{resourceGraphName}/{entry.Key}"; + var newFileGraphNameAddon = newFileGraphName; + if (!newFileGraphNameAddon.EndsWith("/")) + { + newFileGraphNameAddon += "/"; + } + + var existingGraphs = ListGraphs(newFileGraphNameAddon); + var recentDataVersion = VersionUtil.GetRecentDataVersion(existingGraphs); + var recentMetadataVersion = VersionUtil.GetRecentMetadataVersion(existingGraphs); + + await CreateHashData(resourceId, entry, resourceTypeDefinition, resourceTypeOptions, newFileGraphNameAddon, recentDataVersion); + + if (recentDataVersion is null) + { + throw new NullReferenceException("The recent data version is null and can't be used."); + } + + var recentDataExtractedVersion = new Uri(recentDataVersion.AbsoluteUri + "&extracted=true"); + + if (recentMetadataVersion is null) + { + throw new NullReferenceException("The recent metadata version is null and can't be used."); + } + + var recentMetadataExtractedVersion = new Uri(recentMetadataVersion.AbsoluteUri + "&extracted=true"); + + var tripleStore = new TripleStore(); + tripleStore.LoadFromString(extractedMetadata.Metadata, new TriGParser(TriGSyntax.Recommendation)); + + FormatResultMetadata(tripleStore, recentDataExtractedVersion, recentMetadataExtractedVersion); + + GraphStorer.StoreGraphs(tripleStore.Graphs, _rdfStoreConnector); + + var trellisGraph = _rdfStoreConnector.GetGraph(trellisGraphUri); + var triples = new List<Triple>(); + + AddToTrellis(trellisGraph, rdfSourceUri, newFileGraphName, recentDataExtractedVersion.AbsoluteUri, triples); + AddToTrellis(trellisGraph, rdfSourceUri, newFileGraphName, recentMetadataExtractedVersion.AbsoluteUri, triples); + GraphStorer.AddToGraph(trellisGraph, triples, _rdfStoreConnector); + + var newDataFileGraphName = $"{newFileGraphName}/@type=data"; + var newMetadataFileGraphName = $"{newFileGraphName}/@type=metadata"; + + var dataGraph = CreateOrGetGraph(newDataFileGraphName); + var metadataGraph = CreateOrGetGraph(newMetadataFileGraphName); + + dataGraph.Assert(new Triple( + dataGraph.CreateUriNode(new Uri(newDataFileGraphName)), + dataGraph.CreateUriNode(new Uri(dcatdistributionUrl)), + dataGraph.CreateUriNode(recentDataExtractedVersion) + )); + dataGraph.Assert(new Triple( + dataGraph.CreateUriNode(recentDataExtractedVersion), + dataGraph.CreateUriNode(new Uri(metadataExtractionVersionUrl)), + dataGraph.CreateLiteralNode(metadataExtractorVersion) + )); + + metadataGraph.Assert(new Triple( + metadataGraph.CreateUriNode(new Uri(newMetadataFileGraphName)), + metadataGraph.CreateUriNode(new Uri(dcatdistributionUrl)), + metadataGraph.CreateUriNode(recentMetadataExtractedVersion) + )); + metadataGraph.Assert(new Triple( + metadataGraph.CreateUriNode(recentMetadataExtractedVersion), + metadataGraph.CreateUriNode(new Uri(metadataExtractionVersionUrl)), + metadataGraph.CreateLiteralNode(metadataExtractorVersion) + )); + metadataGraph.Assert(new Triple( + metadataGraph.CreateUriNode(recentMetadataVersion), + metadataGraph.CreateUriNode(new Uri("http://purl.org/fdp/fdp-o#isMetadataOf")), + metadataGraph.CreateUriNode(recentDataVersion) + )); + + var provenanceGraphs = new List<IGraph> { dataGraph, metadataGraph }; + GraphStorer.StoreGraphs(provenanceGraphs, _rdfStoreConnector); + } + + private async Task CreateHashData(string resourceId, ResourceEntry entry, BaseResourceType resourceTypeDefinition, Dictionary<string, string>? resourceTypeOptions, string newFileGraphNameAddon, Uri? recentDataVersion) + { + var dataGraphName = $"{newFileGraphNameAddon}@type=data"; + var dataGraph = CreateOrGetGraph(dataGraphName); + + var hashTriples = new List<Triple>(); + + var loadedEntry = await resourceTypeDefinition.LoadEntry(resourceId, entry.Key, resourceTypeOptions); + + if (loadedEntry is null) + { + throw new NullReferenceException("The resulting stream of the loaded entry is null, when trying to hash the data."); + } + + var sha512Hash = Convert.ToBase64String(HashUtil.HashData(loadedEntry, HashAlgorithmName.SHA512)); + + var dataGraphId = recentDataVersion; + var hashGraphId = new Uri($"{dataGraphId?.AbsoluteUri}&hash={Guid.NewGuid()}"); + + var dataGraphSubject = dataGraph.CreateUriNode(dataGraphId); + var hashSubject = dataGraph.CreateUriNode(hashGraphId); + + hashTriples.Add(new Triple(dataGraphSubject, + dataGraph.CreateUriNode(new Uri("http://www.ebu.ch/metadata/ontologies/ebucore/ebucore#hashType")), + hashSubject)); + hashTriples.Add(new Triple(hashSubject, + dataGraph.CreateUriNode(new Uri("http://www.ebu.ch/metadata/ontologies/ebucore/ebucore#hashFunction")), + dataGraph.CreateLiteralNode("SHA512"))); + hashTriples.Add(new Triple(hashSubject, + dataGraph.CreateUriNode(new Uri("http://www.ebu.ch/metadata/ontologies/ebucore/ebucore#hashValue")), + dataGraph.CreateLiteralNode(sha512Hash, new Uri("http://www.w3.org/2001/XMLSchema#hexBinary")))); + + GraphStorer.AddToGraph(dataGraph, hashTriples, _rdfStoreConnector); + } + + private static void FormatResultMetadata(TripleStore tripleStore, Uri dataExtractGraph, Uri metadataExtractGraph) + { + foreach (var graph in tripleStore.Graphs.ToArray()) + { + if (graph.BaseUri != dataExtractGraph && graph.BaseUri != metadataExtractGraph) + { + tripleStore.Remove(graph.BaseUri); + if (graph.BaseUri.AbsoluteUri.Contains("type=data")) + { + graph.BaseUri = dataExtractGraph; + } + else + { + graph.BaseUri = metadataExtractGraph; + } + tripleStore.Add(graph, true); + } + } + } + + private static void AddToTrellis(IGraph trellisGraph, string ldpAssignment, string thePartUri, string graphUri, ICollection<Triple> triples) + { + var setGraphNode = trellisGraph.CreateUriNode(new Uri(graphUri)); + var setThePartNode = trellisGraph.CreateUriNode(new Uri(thePartUri)); + var triple = new Triple( + setGraphNode, + trellisGraph.CreateUriNode(new Uri(partOfUri)), + setThePartNode + ); + if (!trellisGraph.ContainsTriple(triple)) + { + triples.Add(triple); + trellisGraph.Assert(triple); + var assignmentTriple = new Triple( + setGraphNode, + trellisGraph.CreateUriNode(new Uri(aUri)), + trellisGraph.CreateUriNode(new Uri(ldpAssignment)) + ); + triples.Add(assignmentTriple); + trellisGraph.Assert(assignmentTriple); + AddModifiedDate(trellisGraph, graphUri, triples); + } + } + + private IGraph CreateOrGetGraph(string graphUrl) + { + var entryAlreadyExists = _rdfStoreConnector.HasGraph(graphUrl); + return entryAlreadyExists + ? _rdfStoreConnector.GetGraph(graphUrl) + : new Graph() + { + BaseUri = new Uri(graphUrl) + }; + } + + private static void AddModifiedDate(IGraph graph, string root, ICollection<Triple> triples) + { + var dcTermsModifiedNode = graph.CreateUriNode(new Uri(dctermsModifiedUri)); + var rootNode = graph.CreateUriNode(new Uri(root)); + if (!graph.GetTriplesWithSubjectPredicate(rootNode, dcTermsModifiedNode).Any()) + { + var triple = new Triple( + rootNode, + dcTermsModifiedNode, + graph.CreateLiteralNode( + DateTime.UtcNow.ToString("o", CultureInfo.InvariantCulture), + new Uri(XmlSpecsHelper.XmlSchemaDataTypeDateTime) + ) + ); + triples.Add(triple); + graph.Assert(triple); + } + } +} \ No newline at end of file diff --git a/src/MetadataExtractorCron/Extractors/IMetadataExtractor.cs b/src/MetadataExtractorCron/Extractors/IMetadataExtractor.cs new file mode 100644 index 0000000000000000000000000000000000000000..06e92d32dbc6da99a090e132f8025616faac2917 --- /dev/null +++ b/src/MetadataExtractorCron/Extractors/IMetadataExtractor.cs @@ -0,0 +1,6 @@ +namespace MetadataExtractorCron.Extractors; + +public interface IMetadataExtractor +{ + Task PerformExtraction(); +} \ No newline at end of file diff --git a/src/MetadataExtractorCron/MetadataExtractorCron.csproj b/src/MetadataExtractorCron/MetadataExtractorCron.csproj index e87d93a3b1d1f7f7a4adccc3e79ac4ce1f792893..4a1c967f19720fa440f743250b60d5e5d90c8206 100644 --- a/src/MetadataExtractorCron/MetadataExtractorCron.csproj +++ b/src/MetadataExtractorCron/MetadataExtractorCron.csproj @@ -1,4 +1,4 @@ -<Project Sdk="Microsoft.NET.Sdk"> +<Project Sdk="Microsoft.NET.Sdk"> <PropertyGroup> <OutputType>Exe</OutputType> @@ -8,8 +8,14 @@ <Version>0.1.0</Version></PropertyGroup> <ItemGroup> - <PackageReference Include="Coscine.Database" Version="2.*-*" /> + <PackageReference Include="Coscine.Database" Version="2.15.0-issue-1788-extra0002" /> <PackageReference Include="Coscine.Metadata" Version="2.*-*" /> + <PackageReference Include="Coscine.ResourceTypes" Version="1.5.1" /> + <PackageReference Include="dotNetRDF" Version="2.7.5" /> + </ItemGroup> + + <ItemGroup> + <ProjectReference Include="..\OpenApiGeneratedConnector\OpenApiGeneratedConnector.csproj" /> </ItemGroup> </Project> diff --git a/src/MetadataExtractorCron/Program.cs b/src/MetadataExtractorCron/Program.cs index 7141c13161d4085c23a5342fbb0d84f7d9cb2c45..7913c0f2f241156ab1e76b62a1d75cd4457b19a3 100644 --- a/src/MetadataExtractorCron/Program.cs +++ b/src/MetadataExtractorCron/Program.cs @@ -1 +1,7 @@ -Console.WriteLine("\n Finished."); +using MetadataExtractorCron.Extractors; + +var metadataExtractor = new CoscineMetadataExtractor(); + +await metadataExtractor.PerformExtraction(); + +Console.WriteLine("Finished."); \ No newline at end of file diff --git a/src/MetadataExtractorCron/Util/GraphStorer.cs b/src/MetadataExtractorCron/Util/GraphStorer.cs new file mode 100644 index 0000000000000000000000000000000000000000..438552b9ff6307e7a4a56ced6048ca536122bc5e --- /dev/null +++ b/src/MetadataExtractorCron/Util/GraphStorer.cs @@ -0,0 +1,41 @@ +using Coscine.Metadata; +using VDS.RDF; + +namespace MetadataExtractorCron.Util; + +public static class GraphStorer +{ + public static void StoreGraphs(IEnumerable<IGraph> graphUris, RdfStoreConnector rdfStoreConnector) + { + foreach (var graphUri in graphUris) + { + Console.WriteLine($" ({graphUri.BaseUri})"); + + if (rdfStoreConnector.HasGraph(graphUri.BaseUri)) + { + Console.WriteLine($" - Graph {graphUri.BaseUri} exists"); + + // Clear the existing graph from the store + rdfStoreConnector.ClearGraph(graphUri.BaseUri); + Console.WriteLine($" - Cleared Graph {graphUri.BaseUri}"); + } + + // Chunking since the size otherwise can be too large + foreach (var triples in graphUri.Triples.Chunk(100)) + { + rdfStoreConnector.ReadWriteSparqlConnector.UpdateGraph(graphUri.BaseUri, triples, Enumerable.Empty<Triple>()); + } + + Console.WriteLine($" - Graph {graphUri.BaseUri} added successfully"); + Console.WriteLine(); + } + } + + public static void AddToGraph(IGraph graph, IEnumerable<Triple> triples, RdfStoreConnector rdfStoreConnector) + { + Console.WriteLine($" - Adding Triples to {graph.BaseUri}"); + rdfStoreConnector.ReadWriteSparqlConnector.UpdateGraph(graph.BaseUri, triples, Enumerable.Empty<Triple>()); + Console.WriteLine($" - Triples added to Graph {graph.BaseUri} successfully"); + Console.WriteLine(); + } +} \ No newline at end of file diff --git a/src/MetadataExtractorCron/Util/HashUtil.cs b/src/MetadataExtractorCron/Util/HashUtil.cs new file mode 100644 index 0000000000000000000000000000000000000000..315b2f8f4656fb1bca544033c95a241da1923297 --- /dev/null +++ b/src/MetadataExtractorCron/Util/HashUtil.cs @@ -0,0 +1,29 @@ +using System.Security.Cryptography; + +namespace MetadataExtractorCron.Util; + +public static class HashUtil +{ + private static HashAlgorithm GetHashAlgorithm(HashAlgorithmName hashAlgorithmName) + { + if (hashAlgorithmName == HashAlgorithmName.MD5) + return MD5.Create(); + if (hashAlgorithmName == HashAlgorithmName.SHA1) + return SHA1.Create(); + if (hashAlgorithmName == HashAlgorithmName.SHA256) + return SHA256.Create(); + if (hashAlgorithmName == HashAlgorithmName.SHA384) + return SHA384.Create(); + if (hashAlgorithmName == HashAlgorithmName.SHA512) + return SHA512.Create(); + + throw new CryptographicException($"Unknown hash algorithm \"{hashAlgorithmName.Name}\"."); + } + + public static byte[] HashData(Stream data, + HashAlgorithmName hashAlgorithm) + { + using var hashAlgorithmObject = GetHashAlgorithm(hashAlgorithm); + return hashAlgorithmObject.ComputeHash(data); + } +} \ No newline at end of file diff --git a/src/MetadataExtractorCron/Util/MetadataGraphsCreator.cs b/src/MetadataExtractorCron/Util/MetadataGraphsCreator.cs new file mode 100644 index 0000000000000000000000000000000000000000..afbfe1aeef8db2acc4825e19fa0c03bf49b452b5 --- /dev/null +++ b/src/MetadataExtractorCron/Util/MetadataGraphsCreator.cs @@ -0,0 +1,319 @@ +using Coscine.Metadata; +using Coscine.ResourceTypes.Base.Models; +using System.Globalization; +using VDS.RDF; +using VDS.RDF.Parsing; +using VDS.RDF.Query; + +namespace MetadataExtractorCron.Util; + +/// <summary> +/// Derived from MetadataMigrator +/// </summary> +public class MetadataGraphsCreator +{ + private const string partOfUri = "http://purl.org/dc/terms/isPartOf"; + private const string aUri = "http://www.w3.org/1999/02/22-rdf-syntax-ns#type"; + private const string basicContainerUri = "http://www.w3.org/ns/ldp#BasicContainer"; + private const string nonRdfSourceUri = "http://www.w3.org/ns/ldp#NonRDFSource"; + private const string rdfSourceUri = "http://www.w3.org/ns/ldp#RDFSource"; + + private const string dcatcatalogUri = "http://www.w3.org/ns/dcat#catalog"; + private const string dcatCatalogClassUri = "http://www.w3.org/ns/dcat#Catalog"; + + private const string dctermsIdentifierUri = "http://purl.org/dc/terms/identifier"; + private const string dctermsModifiedUri = "http://purl.org/dc/terms/modified"; + + private const string fdpMetadataServiceUri = "http://purl.org/fdp/fdp-o#MetadataService"; + private const string fdphasMetadataUri = "http://purl.org/fdp/fdp-o#hasMetadata"; + + private const string provEntityUri = "http://www.w3.org/ns/prov#Entity"; + private const string provGeneratedAtTimeUri = "http://www.w3.org/ns/prov#generatedAtTime"; + private const string provWasRevisionOfUri = "http://www.w3.org/ns/prov#wasRevisionOfNode"; + + private const string ldpDescribedByUri = "http://www.w3.org/ns/ldp#describedBy"; + + private const string resourceUrlPrefix = "https://purl.org/coscine/resources"; + + private const string trellisGraphUri = "http://www.trellisldp.org/ns/trellis#PreferServerManaged"; + + private RdfStoreConnector RdfStoreConnector { get; } + + public MetadataGraphsCreator(RdfStoreConnector rdfStoreConnector) + { + RdfStoreConnector = rdfStoreConnector; + } + + public void CreateGraphs(string resourceId, ResourceEntry entry, IEnumerable<ResourceEntry> fileInfos) + { + var trellisGraph = RdfStoreConnector.GetGraph(trellisGraphUri); + + var graphs = new List<IGraph>(); + var triples = new List<Triple>(); + + var resourceGraphName = $"{resourceUrlPrefix}/{resourceId}"; + + var fileGraphs = fileInfos.Select((entry) => + { + var entryGraphName = $"{resourceGraphName}/{entry.Key}"; + if (!entryGraphName.EndsWith("/")) + { + entryGraphName += "/"; + } + return new Uri(entryGraphName); + }); + + var newFileGraphName = $"{resourceGraphName}/{entry.Key}"; + Console.WriteLine($"Migrating {newFileGraphName}"); + + var version = VersionUtil.GetNewVersion(); + + var newMetadataFileGraphName = $"{newFileGraphName}/@type=metadata"; + var newDataFileGraphName = $"{newFileGraphName}/@type=data"; + var newMetadataVersionFileGraphName = $"{newFileGraphName}/@type=metadata&version={version}"; + var newDataVersionFileGraphName = $"{newFileGraphName}/@type=data&version={version}"; + + var newFileGraph = CreateOrGetGraph(newFileGraphName); + var fileNode = newFileGraph.CreateUriNode(new Uri(newFileGraphName)); + graphs.Add(newFileGraph); + + // Set relation to resource, if a plain file in no folder + if (!entry.Key.Any((character) => character == '/')) + { + AddToTrellis(trellisGraph, basicContainerUri, resourceGraphName, newFileGraphName, triples); + } + + newFileGraph.Assert(new Triple(fileNode, newFileGraph.CreateUriNode(new Uri(aUri)), newFileGraph.CreateUriNode(new Uri(dcatCatalogClassUri)))); + newFileGraph.Assert(new Triple(fileNode, newFileGraph.CreateUriNode(new Uri(aUri)), newFileGraph.CreateUriNode(new Uri(fdpMetadataServiceUri)))); + AddFilesToAFolder(trellisGraph, fileGraphs, new Uri(newFileGraphName), newFileGraph, newFileGraphName, triples); + + var metadataFileGraph = SetMetadataGraph(trellisGraph, graphs, newMetadataFileGraphName, newFileGraph, newFileGraphName, triples); + var dataFileGraph = SetDataGraph(trellisGraph, graphs, newDataFileGraphName, newFileGraph, newFileGraphName, metadataFileGraph.BaseUri.AbsoluteUri, triples); + + var existingGraphs = ListGraphs(newFileGraphName + "/"); + + SetDataVersionGraph(graphs, newDataVersionFileGraphName, dataFileGraph, existingGraphs, trellisGraph, newFileGraphName, triples); + SetMetadataVersionGraph(graphs, newMetadataVersionFileGraphName, metadataFileGraph, existingGraphs, trellisGraph, newFileGraphName, triples); + + GraphStorer.StoreGraphs(graphs, RdfStoreConnector); + GraphStorer.AddToGraph(trellisGraph, triples, RdfStoreConnector); + } + + private static void AddFilesToAFolder(IGraph trellisGraph, IEnumerable<Uri> fileGraphs, Uri fileGraph, IGraph newFileGraph, string fileUri, ICollection<Triple> triples) + { + // Add all files to a folder + foreach (var otherFileGraph in fileGraphs) + { + // TODO: Deal with multiple levels of files + if (otherFileGraph.AbsoluteUri != fileGraph.AbsoluteUri + && otherFileGraph.AbsoluteUri.Contains(fileGraph.AbsoluteUri + "/") + && !otherFileGraph.AbsoluteUri.Contains("&data") + && !otherFileGraph.AbsoluteUri.Contains("?type=") + && !otherFileGraph.AbsoluteUri.Contains("&type=") + && !otherFileGraph.AbsoluteUri.Contains("@type=")) + { + var otherFileNode = newFileGraph.CreateUriNode(otherFileGraph); + newFileGraph.Assert(new Triple(newFileGraph.CreateUriNode(new Uri(fileUri)), newFileGraph.CreateUriNode(new Uri(dcatcatalogUri)), otherFileNode)); + AddToTrellis(trellisGraph, basicContainerUri, fileUri, otherFileGraph.AbsoluteUri, triples); + } + } + } + + private IGraph SetMetadataGraph(IGraph trellisGraph, List<IGraph> graphs, string newMetadataFileGraphName, IGraph newFileGraph, string fileUri, ICollection<Triple> triples) + { + var metadataFileNode = newFileGraph.CreateUriNode(new Uri(newMetadataFileGraphName)); + var metadataFileGraph = CreateOrGetGraph(newMetadataFileGraphName); + graphs.Add(metadataFileGraph); + AddToTrellis(trellisGraph, rdfSourceUri, fileUri, newMetadataFileGraphName, triples); + var fileNode = newFileGraph.CreateUriNode(new Uri(fileUri)); + newFileGraph.Assert(new Triple(fileNode, newFileGraph.CreateUriNode(new Uri(dcatcatalogUri)), metadataFileNode)); + newFileGraph.Assert(new Triple(fileNode, newFileGraph.CreateUriNode(new Uri(fdphasMetadataUri)), metadataFileNode)); + metadataFileGraph.Assert(new Triple( + Tools.CopyNode(metadataFileNode, metadataFileGraph), + metadataFileGraph.CreateUriNode(new Uri(aUri)), + metadataFileGraph.CreateUriNode(new Uri(dcatCatalogClassUri)) + )); + return metadataFileGraph; + } + + private IGraph SetDataGraph(IGraph trellisGraph, List<IGraph> graphs, string newDataFileGraphName, IGraph newFileGraph, string fileUri, string metadataFileUri, ICollection<Triple> triples) + { + var dataFileNode = newFileGraph.CreateUriNode(new Uri(newDataFileGraphName)); + var dataFileGraph = CreateOrGetGraph(newDataFileGraphName); + graphs.Add(dataFileGraph); + AddToTrellis(trellisGraph, nonRdfSourceUri, fileUri, newDataFileGraphName, triples); + var fileNode = newFileGraph.CreateUriNode(new Uri(fileUri)); + newFileGraph.Assert(new Triple(fileNode, newFileGraph.CreateUriNode(new Uri(dcatcatalogUri)), dataFileNode)); + dataFileGraph.Assert(new Triple(Tools.CopyNode(dataFileNode, dataFileGraph), dataFileGraph.CreateUriNode(new Uri(aUri)), dataFileGraph.CreateUriNode(new Uri(dcatCatalogClassUri)))); + dataFileGraph.Assert(new Triple(Tools.CopyNode(dataFileNode, dataFileGraph), dataFileGraph.CreateUriNode(new Uri(ldpDescribedByUri)), dataFileGraph.CreateUriNode(new Uri(metadataFileUri)))); + return dataFileGraph; + } + + private void SetDataVersionGraph(List<IGraph> graphs, string newDataVersionFileGraphName, IGraph dataFileGraph, IEnumerable<Uri> existingGraphs, IGraph trellisGraph, string fileUri, ICollection<Triple> triples) + { + var recentDataVersion = VersionUtil.GetRecentDataVersion(existingGraphs); + + IGraph currentDataVersionGraph; + if (recentDataVersion == null) + { + currentDataVersionGraph = new Graph() + { + BaseUri = new Uri(newDataVersionFileGraphName), + }; + } + else + { + currentDataVersionGraph = RdfStoreConnector.GetGraph(recentDataVersion); + } + var currentDataVersionNode = currentDataVersionGraph.CreateUriNode(currentDataVersionGraph.BaseUri); + currentDataVersionGraph.Assert(new Triple(currentDataVersionNode, currentDataVersionGraph.CreateUriNode(new Uri(dctermsIdentifierUri)), currentDataVersionGraph.CreateLiteralNode( + currentDataVersionGraph.BaseUri.AbsoluteUri, + new Uri(XmlSpecsHelper.XmlSchemaDataTypeString) + ))); + + // PROV Info + var provTriple = new Triple(Tools.CopyNode(currentDataVersionNode, dataFileGraph), dataFileGraph.CreateUriNode(new Uri(aUri)), dataFileGraph.CreateUriNode(new Uri(provEntityUri))); + if (!dataFileGraph.ContainsTriple(provTriple)) + { + dataFileGraph.Assert(provTriple); + dataFileGraph.Assert(new Triple( + dataFileGraph.CreateUriNode(dataFileGraph.BaseUri), + dataFileGraph.CreateUriNode(new Uri("http://www.w3.org/ns/dcat#dataset")), + Tools.CopyNode(currentDataVersionNode, dataFileGraph) + )); + dataFileGraph.Assert(new Triple(Tools.CopyNode(currentDataVersionNode, dataFileGraph), dataFileGraph.CreateUriNode(new Uri(provGeneratedAtTimeUri)), dataFileGraph.CreateLiteralNode( + DateTime.UtcNow.ToString("o", CultureInfo.InvariantCulture), + new Uri(XmlSpecsHelper.XmlSchemaDataTypeDateTime) + ))); + AddToTrellis(trellisGraph, nonRdfSourceUri, fileUri, currentDataVersionGraph.BaseUri.AbsoluteUri, triples); + } + if (recentDataVersion != null && recentDataVersion.AbsoluteUri != currentDataVersionGraph.BaseUri.AbsoluteUri) + { + var recentDataVersionNode = dataFileGraph.CreateUriNode(recentDataVersion); + dataFileGraph.Assert(new Triple(Tools.CopyNode(currentDataVersionNode, dataFileGraph), dataFileGraph.CreateUriNode(new Uri(provWasRevisionOfUri)), recentDataVersionNode)); + } + + graphs.Add(currentDataVersionGraph); + } + + private void SetMetadataVersionGraph(List<IGraph> graphs, string newMetadataVersionFileGraphName, IGraph metadataFileGraph, IEnumerable<Uri> existingGraphs, IGraph trellisGraph, string fileUri, ICollection<Triple> triples) + { + var recentMetadataVersion = VersionUtil.GetRecentMetadataVersion(existingGraphs); + + IGraph currentMetadataVersionGraph; + if (recentMetadataVersion == null) + { + currentMetadataVersionGraph = new Graph() + { + BaseUri = new Uri(newMetadataVersionFileGraphName), + }; + } + else + { + currentMetadataVersionGraph = RdfStoreConnector.GetGraph(recentMetadataVersion); + } + var currentMetadataVersionNode = currentMetadataVersionGraph.CreateUriNode(currentMetadataVersionGraph.BaseUri); + + // PROV Info + var provTriple = new Triple(Tools.CopyNode(currentMetadataVersionNode, metadataFileGraph), metadataFileGraph.CreateUriNode(new Uri(aUri)), metadataFileGraph.CreateUriNode(new Uri(provEntityUri))); + if (!metadataFileGraph.ContainsTriple(provTriple)) + { + metadataFileGraph.Assert(provTriple); + metadataFileGraph.Assert(new Triple( + metadataFileGraph.CreateUriNode(metadataFileGraph.BaseUri), + metadataFileGraph.CreateUriNode(new Uri("http://purl.org/fdp/fdp-o#hasMetadata")), + Tools.CopyNode(currentMetadataVersionNode, metadataFileGraph) + )); + metadataFileGraph.Assert(new Triple(Tools.CopyNode(currentMetadataVersionNode, metadataFileGraph), metadataFileGraph.CreateUriNode(new Uri(provGeneratedAtTimeUri)), metadataFileGraph.CreateLiteralNode( + DateTime.UtcNow.ToString("o", CultureInfo.InvariantCulture), + new Uri(XmlSpecsHelper.XmlSchemaDataTypeDateTime) + ))); + AddToTrellis(trellisGraph, rdfSourceUri, fileUri, currentMetadataVersionGraph.BaseUri.AbsoluteUri, triples); + } + if (recentMetadataVersion != null && recentMetadataVersion.AbsoluteUri != currentMetadataVersionGraph.BaseUri.AbsoluteUri) + { + var recentMetadataVersionNode = metadataFileGraph.CreateUriNode(recentMetadataVersion); + metadataFileGraph.Assert(new Triple(Tools.CopyNode(currentMetadataVersionNode, metadataFileGraph), metadataFileGraph.CreateUriNode(new Uri(provWasRevisionOfUri)), recentMetadataVersionNode)); + } + + graphs.Add(currentMetadataVersionGraph); + } + + private static void AddToTrellis(IGraph trellisGraph, string ldpAssignment, string thePartUri, string graphUri, ICollection<Triple> triples) + { + var setGraphNode = trellisGraph.CreateUriNode(new Uri(graphUri)); + var setThePartNode = trellisGraph.CreateUriNode(new Uri(thePartUri)); + var triple = new Triple( + setGraphNode, + trellisGraph.CreateUriNode(new Uri(partOfUri)), + setThePartNode + ); + if (!trellisGraph.ContainsTriple(triple)) + { + triples.Add(triple); + trellisGraph.Assert(triple); + var assignmentTriple = new Triple( + setGraphNode, + trellisGraph.CreateUriNode(new Uri(aUri)), + trellisGraph.CreateUriNode(new Uri(ldpAssignment)) + ); + triples.Add(assignmentTriple); + trellisGraph.Assert(assignmentTriple); + AddModifiedDate(trellisGraph, graphUri, triples); + } + } + + private IGraph CreateOrGetGraph(string graphUrl) + { + var entryAlreadyExists = RdfStoreConnector.HasGraph(graphUrl); + return entryAlreadyExists + ? RdfStoreConnector.GetGraph(graphUrl) + : new Graph() + { + BaseUri = new Uri(graphUrl) + }; + } + + public IEnumerable<Uri> ListGraphs(string id) + { + var cmdString = new SparqlParameterizedString + { + CommandText = @"SELECT DISTINCT ?g + WHERE { GRAPH ?g { ?s ?p ?o } + FILTER(contains(str(?g), @graph)) }" + }; + cmdString.SetLiteral("graph", id); + + var resultSet = RdfStoreConnector.QueryEndpoint.QueryWithResultSet(cmdString.ToString()); + + var graphs = new List<Uri>(); + foreach (SparqlResult r in resultSet) + { + var uriNode = r.Value("g") as UriNode; + if (uriNode is not null) + { + graphs.Add(uriNode.Uri); + } + } + return graphs; + } + + private static void AddModifiedDate(IGraph graph, string root, ICollection<Triple> triples) + { + var dcTermsModifiedNode = graph.CreateUriNode(new Uri(dctermsModifiedUri)); + var rootNode = graph.CreateUriNode(new Uri(root)); + if (!graph.GetTriplesWithSubjectPredicate(rootNode, dcTermsModifiedNode).Any()) + { + var triple = new Triple( + rootNode, + dcTermsModifiedNode, + graph.CreateLiteralNode( + DateTime.UtcNow.ToString("o", CultureInfo.InvariantCulture), + new Uri(XmlSpecsHelper.XmlSchemaDataTypeDateTime) + ) + ); + triples.Add(triple); + graph.Assert(triple); + } + } +} \ No newline at end of file diff --git a/src/MetadataExtractorCron/VersionUtil.cs b/src/MetadataExtractorCron/VersionUtil.cs index 474eaf6405bf203b58936c46af757fa157e0abf2..6c0105f5c1099f6c9b5aa9d6f0d92e000402f2e8 100644 --- a/src/MetadataExtractorCron/VersionUtil.cs +++ b/src/MetadataExtractorCron/VersionUtil.cs @@ -1,47 +1,53 @@ -using System; -using System.Collections.Generic; -using System.Linq; +using System.Web; -namespace MetadataMigrator +namespace MetadataExtractorCron; + +public static class VersionUtil { - public class VersionUtil + public static Uri? GetRecentVersion(IEnumerable<Uri> graphUris, string? filter = null, bool notFilterExtracted = true) { - public static Uri? GetRecentVersion(IEnumerable<Uri> graphs, string filter = null) + var currentBest = graphUris.FirstOrDefault(); + var currentBestVersion = 0L; + foreach (var graphUri in graphUris) { - var currentBest = graphs.FirstOrDefault(); - var currentBestVersion = 0L; - foreach (var graph in graphs) + var queryDictionary = HttpUtility.ParseQueryString(new Uri(graphUri.ToString().Replace("@", "?")).Query); + var version = queryDictionary["version"]; + if (version == null || !long.TryParse(version, out long longVersion)) + { + continue; + } + if (longVersion > currentBestVersion + && (filter == null || queryDictionary["type"] == filter) + && + ((notFilterExtracted && queryDictionary["extracted"] == null) + || (!notFilterExtracted && queryDictionary["extracted"] != null)) + ) { - var queryDictionary = System.Web.HttpUtility.ParseQueryString( - new Uri(graph.ToString().Replace("@", "?")).Query); - var version = queryDictionary["version"]; - if (version == null || !long.TryParse(version, out long longVersion)) - { - continue; - } - if (longVersion > currentBestVersion && queryDictionary["extracted"] == null && (filter == null || queryDictionary[filter] != null)) - { - currentBestVersion = longVersion; - currentBest = graph; - } + currentBestVersion = longVersion; + currentBest = graphUri; } - return currentBest; } + return currentBest; + } - public static Uri GetRecentDataVersion(IEnumerable<Uri> graphs) - { - return GetRecentVersion(graphs, "data"); - } + public static Uri? GetRecentDataExtractedVersion(IEnumerable<Uri> graphUris) + { + return GetRecentVersion(graphUris, "data", false); + } - public static Uri GetRecentMetadataVersion(IEnumerable<Uri> graphs) - { - return GetRecentVersion(graphs, "metadata"); - } + public static Uri? GetRecentDataVersion(IEnumerable<Uri> graphUris) + { + return GetRecentVersion(graphUris, "data"); + } - public static long GetNewVersion() - { - // UTC Timestamp - return long.Parse(Convert.ToString((int)DateTime.UtcNow.Subtract(new DateTime(1970, 1, 1)).TotalSeconds)); - } + public static Uri? GetRecentMetadataVersion(IEnumerable<Uri> graphUris) + { + return GetRecentVersion(graphUris, "metadata"); + } + + public static long GetNewVersion() + { + // UTC Timestamp + return long.Parse(Convert.ToString((int)DateTime.UtcNow.Subtract(new DateTime(1970, 1, 1)).TotalSeconds)); } -} +} \ No newline at end of file diff --git a/src/OpenApiGeneratedConnector/.gitignore b/src/OpenApiGeneratedConnector/.gitignore new file mode 100644 index 0000000000000000000000000000000000000000..1ee53850b84cd478da00264a919c8180a746056e --- /dev/null +++ b/src/OpenApiGeneratedConnector/.gitignore @@ -0,0 +1,362 @@ +## Ignore Visual Studio temporary files, build results, and +## files generated by popular Visual Studio add-ons. +## +## Get latest from https://github.com/github/gitignore/blob/master/VisualStudio.gitignore + +# User-specific files +*.rsuser +*.suo +*.user +*.userosscache +*.sln.docstates + +# User-specific files (MonoDevelop/Xamarin Studio) +*.userprefs + +# Mono auto generated files +mono_crash.* + +# Build results +[Dd]ebug/ +[Dd]ebugPublic/ +[Rr]elease/ +[Rr]eleases/ +x64/ +x86/ +[Ww][Ii][Nn]32/ +[Aa][Rr][Mm]/ +[Aa][Rr][Mm]64/ +bld/ +[Bb]in/ +[Oo]bj/ +[Ll]og/ +[Ll]ogs/ + +# Visual Studio 2015/2017 cache/options directory +.vs/ +# Uncomment if you have tasks that create the project's static files in wwwroot +#wwwroot/ + +# Visual Studio 2017 auto generated files +Generated\ Files/ + +# MSTest test Results +[Tt]est[Rr]esult*/ +[Bb]uild[Ll]og.* + +# NUnit +*.VisualState.xml +TestResult.xml +nunit-*.xml + +# Build Results of an ATL Project +[Dd]ebugPS/ +[Rr]eleasePS/ +dlldata.c + +# Benchmark Results +BenchmarkDotNet.Artifacts/ + +# .NET Core +project.lock.json +project.fragment.lock.json +artifacts/ + +# ASP.NET Scaffolding +ScaffoldingReadMe.txt + +# StyleCop +StyleCopReport.xml + +# Files built by Visual Studio +*_i.c +*_p.c +*_h.h +*.ilk +*.meta +*.obj +*.iobj +*.pch +*.pdb +*.ipdb +*.pgc +*.pgd +*.rsp +*.sbr +*.tlb +*.tli +*.tlh +*.tmp +*.tmp_proj +*_wpftmp.csproj +*.log +*.vspscc +*.vssscc +.builds +*.pidb +*.svclog +*.scc + +# Chutzpah Test files +_Chutzpah* + +# Visual C++ cache files +ipch/ +*.aps +*.ncb +*.opendb +*.opensdf +*.sdf +*.cachefile +*.VC.db +*.VC.VC.opendb + +# Visual Studio profiler +*.psess +*.vsp +*.vspx +*.sap + +# Visual Studio Trace Files +*.e2e + +# TFS 2012 Local Workspace +$tf/ + +# Guidance Automation Toolkit +*.gpState + +# ReSharper is a .NET coding add-in +_ReSharper*/ +*.[Rr]e[Ss]harper +*.DotSettings.user + +# TeamCity is a build add-in +_TeamCity* + +# DotCover is a Code Coverage Tool +*.dotCover + +# AxoCover is a Code Coverage Tool +.axoCover/* +!.axoCover/settings.json + +# Coverlet is a free, cross platform Code Coverage Tool +coverage*.json +coverage*.xml +coverage*.info + +# Visual Studio code coverage results +*.coverage +*.coveragexml + +# NCrunch +_NCrunch_* +.*crunch*.local.xml +nCrunchTemp_* + +# MightyMoose +*.mm.* +AutoTest.Net/ + +# Web workbench (sass) +.sass-cache/ + +# Installshield output folder +[Ee]xpress/ + +# DocProject is a documentation generator add-in +DocProject/buildhelp/ +DocProject/Help/*.HxT +DocProject/Help/*.HxC +DocProject/Help/*.hhc +DocProject/Help/*.hhk +DocProject/Help/*.hhp +DocProject/Help/Html2 +DocProject/Help/html + +# Click-Once directory +publish/ + +# Publish Web Output +*.[Pp]ublish.xml +*.azurePubxml +# Note: Comment the next line if you want to checkin your web deploy settings, +# but database connection strings (with potential passwords) will be unencrypted +*.pubxml +*.publishproj + +# Microsoft Azure Web App publish settings. Comment the next line if you want to +# checkin your Azure Web App publish settings, but sensitive information contained +# in these scripts will be unencrypted +PublishScripts/ + +# NuGet Packages +*.nupkg +# NuGet Symbol Packages +*.snupkg +# The packages folder can be ignored because of Package Restore +**/[Pp]ackages/* +# except build/, which is used as an MSBuild target. +!**/[Pp]ackages/build/ +# Uncomment if necessary however generally it will be regenerated when needed +#!**/[Pp]ackages/repositories.config +# NuGet v3's project.json files produces more ignorable files +*.nuget.props +*.nuget.targets + +# Microsoft Azure Build Output +csx/ +*.build.csdef + +# Microsoft Azure Emulator +ecf/ +rcf/ + +# Windows Store app package directories and files +AppPackages/ +BundleArtifacts/ +Package.StoreAssociation.xml +_pkginfo.txt +*.appx +*.appxbundle +*.appxupload + +# Visual Studio cache files +# files ending in .cache can be ignored +*.[Cc]ache +# but keep track of directories ending in .cache +!?*.[Cc]ache/ + +# Others +ClientBin/ +~$* +*~ +*.dbmdl +*.dbproj.schemaview +*.jfm +*.pfx +*.publishsettings +orleans.codegen.cs + +# Including strong name files can present a security risk +# (https://github.com/github/gitignore/pull/2483#issue-259490424) +#*.snk + +# Since there are multiple workflows, uncomment next line to ignore bower_components +# (https://github.com/github/gitignore/pull/1529#issuecomment-104372622) +#bower_components/ + +# RIA/Silverlight projects +Generated_Code/ + +# Backup & report files from converting an old project file +# to a newer Visual Studio version. Backup files are not needed, +# because we have git ;-) +_UpgradeReport_Files/ +Backup*/ +UpgradeLog*.XML +UpgradeLog*.htm +ServiceFabricBackup/ +*.rptproj.bak + +# SQL Server files +*.mdf +*.ldf +*.ndf + +# Business Intelligence projects +*.rdl.data +*.bim.layout +*.bim_*.settings +*.rptproj.rsuser +*- [Bb]ackup.rdl +*- [Bb]ackup ([0-9]).rdl +*- [Bb]ackup ([0-9][0-9]).rdl + +# Microsoft Fakes +FakesAssemblies/ + +# GhostDoc plugin setting file +*.GhostDoc.xml + +# Node.js Tools for Visual Studio +.ntvs_analysis.dat +node_modules/ + +# Visual Studio 6 build log +*.plg + +# Visual Studio 6 workspace options file +*.opt + +# Visual Studio 6 auto-generated workspace file (contains which files were open etc.) +*.vbw + +# Visual Studio LightSwitch build output +**/*.HTMLClient/GeneratedArtifacts +**/*.DesktopClient/GeneratedArtifacts +**/*.DesktopClient/ModelManifest.xml +**/*.Server/GeneratedArtifacts +**/*.Server/ModelManifest.xml +_Pvt_Extensions + +# Paket dependency manager +.paket/paket.exe +paket-files/ + +# FAKE - F# Make +.fake/ + +# CodeRush personal settings +.cr/personal + +# Python Tools for Visual Studio (PTVS) +__pycache__/ +*.pyc + +# Cake - Uncomment if you are using it +# tools/** +# !tools/packages.config + +# Tabs Studio +*.tss + +# Telerik's JustMock configuration file +*.jmconfig + +# BizTalk build output +*.btp.cs +*.btm.cs +*.odx.cs +*.xsd.cs + +# OpenCover UI analysis results +OpenCover/ + +# Azure Stream Analytics local run output +ASALocalRun/ + +# MSBuild Binary and Structured Log +*.binlog + +# NVidia Nsight GPU debugger configuration file +*.nvuser + +# MFractors (Xamarin productivity tool) working folder +.mfractor/ + +# Local History for Visual Studio +.localhistory/ + +# BeatPulse healthcheck temp database +healthchecksdb + +# Backup folder for Package Reference Convert tool in Visual Studio 2017 +MigrationBackup/ + +# Ionide (cross platform F# VS Code tools) working folder +.ionide/ + +# Fody - auto-generated XML schema +FodyWeavers.xsd diff --git a/src/OpenApiGeneratedConnector/.openapi-generator-ignore b/src/OpenApiGeneratedConnector/.openapi-generator-ignore new file mode 100644 index 0000000000000000000000000000000000000000..7484ee590a3894506cf063799b885428f95a71be --- /dev/null +++ b/src/OpenApiGeneratedConnector/.openapi-generator-ignore @@ -0,0 +1,23 @@ +# OpenAPI Generator Ignore +# Generated by openapi-generator https://github.com/openapitools/openapi-generator + +# Use this file to prevent files from being overwritten by the generator. +# The patterns follow closely to .gitignore or .dockerignore. + +# As an example, the C# client generator defines ApiClient.cs. +# You can make changes and tell OpenAPI Generator to ignore just this file by uncommenting the following line: +#ApiClient.cs + +# You can match any string of characters against a directory, file or extension with a single asterisk (*): +#foo/*/qux +# The above matches foo/bar/qux and foo/baz/qux, but not foo/bar/baz/qux + +# You can recursively match patterns against a directory, file or extension with a double asterisk (**): +#foo/**/qux +# This matches foo/bar/qux, foo/baz/qux, and foo/bar/baz/qux + +# You can also negate patterns with an exclamation (!). +# For example, you can ignore all files in a docs folder with the file extension .md: +#docs/*.md +# Then explicitly reverse the ignore rule for a single file: +#!docs/README.md diff --git a/src/OpenApiGeneratedConnector/OpenApiGeneratedConnector.csproj b/src/OpenApiGeneratedConnector/OpenApiGeneratedConnector.csproj new file mode 100644 index 0000000000000000000000000000000000000000..806f3e4bc667b8ca729f0e29001d47c5b35a06ae --- /dev/null +++ b/src/OpenApiGeneratedConnector/OpenApiGeneratedConnector.csproj @@ -0,0 +1,17 @@ +<Project Sdk="Microsoft.NET.Sdk"> + + <PropertyGroup> + <TargetFramework>net6.0</TargetFramework> + <ImplicitUsings>enable</ImplicitUsings> + <Nullable>enable</Nullable> + </PropertyGroup> + + + <ItemGroup> + <PackageReference Include="JsonSubTypes" Version="1.9.0" /> + <PackageReference Include="Polly" Version="7.2.3" /> + <PackageReference Include="RestSharp" Version="108.0.2" /> + <PackageReference Include="System.ComponentModel.Annotations" Version="5.0.0" /> + </ItemGroup> + +</Project> diff --git a/src/OpenApiGeneratedConnector/README.md b/src/OpenApiGeneratedConnector/README.md new file mode 100644 index 0000000000000000000000000000000000000000..3a2117b74fbce1589377bde12c16da849bd3824a --- /dev/null +++ b/src/OpenApiGeneratedConnector/README.md @@ -0,0 +1,116 @@ +# Org.OpenAPITools - the C# library for the Metadata Extractor API + +This API extracts RDF triples from files + +This C# SDK is automatically generated by the [OpenAPI Generator](https://openapi-generator.tech) project: + +- API version: 0.1.1 +- SDK version: 1.0.0 +- Build package: org.openapitools.codegen.languages.CSharpNetCoreClientCodegen + +<a name="frameworks-supported"></a> +## Frameworks supported +- .NET Core >=1.0 +- .NET Framework >=4.6 +- Mono/Xamarin >=vNext + +<a name="dependencies"></a> +## Dependencies + +- [RestSharp](https://www.nuget.org/packages/RestSharp) - 106.13.0 or later +- [Json.NET](https://www.nuget.org/packages/Newtonsoft.Json/) - 13.0.1 or later +- [JsonSubTypes](https://www.nuget.org/packages/JsonSubTypes/) - 1.8.0 or later +- [System.ComponentModel.Annotations](https://www.nuget.org/packages/System.ComponentModel.Annotations) - 5.0.0 or later + +The DLLs included in the package may not be the latest version. We recommend using [NuGet](https://docs.nuget.org/consume/installing-nuget) to obtain the latest version of the packages: +``` +Install-Package RestSharp +Install-Package Newtonsoft.Json +Install-Package JsonSubTypes +Install-Package System.ComponentModel.Annotations +``` + +NOTE: RestSharp versions greater than 105.1.0 have a bug which causes file uploads to fail. See [RestSharp#742](https://github.com/restsharp/RestSharp/issues/742). +NOTE: RestSharp for .Net Core creates a new socket for each api call, which can lead to a socket exhaustion problem. See [RestSharp#1406](https://github.com/restsharp/RestSharp/issues/1406). + +<a name="installation"></a> +## Installation +Generate the DLL using your preferred tool (e.g. `dotnet build`) + +Then include the DLL (under the `bin` folder) in the C# project, and use the namespaces: +```csharp +using Org.OpenAPITools.Api; +using Org.OpenAPITools.Client; +using Org.OpenAPITools.Model; +``` +<a name="usage"></a> +## Usage + +To use the API client with a HTTP proxy, setup a `System.Net.WebProxy` +```csharp +Configuration c = new Configuration(); +System.Net.WebProxy webProxy = new System.Net.WebProxy("http://myProxyUrl:80/"); +webProxy.Credentials = System.Net.CredentialCache.DefaultCredentials; +c.Proxy = webProxy; +``` + +<a name="getting-started"></a> +## Getting Started + +```csharp +using System.Collections.Generic; +using System.Diagnostics; +using Org.OpenAPITools.Api; +using Org.OpenAPITools.Client; +using Org.OpenAPITools.Model; + +namespace Example +{ + public class Example + { + public static void Main() + { + + Configuration config = new Configuration(); + config.BasePath = "http://localhost"; + var apiInstance = new DefaultApi(config); + + try + { + apiInstance.GetConfigWorker(); + } + catch (ApiException e) + { + Debug.Print("Exception when calling DefaultApi.GetConfigWorker: " + e.Message ); + Debug.Print("Status Code: "+ e.ErrorCode); + Debug.Print(e.StackTrace); + } + + } + } +} +``` + +<a name="documentation-for-api-endpoints"></a> +## Documentation for API Endpoints + +All URIs are relative to *http://localhost* + +Class | Method | HTTP request | Description +------------ | ------------- | ------------- | ------------- +*DefaultApi* | [**GetConfigWorker**](docs/DefaultApi.md#getconfigworker) | **GET** /defaultConfig | +*DefaultApi* | [**GetVersionWorker**](docs/DefaultApi.md#getversionworker) | **GET** /version | +*DefaultApi* | [**PostMetadataExtractorWorker**](docs/DefaultApi.md#postmetadataextractorworker) | **POST** / | + + +<a name="documentation-for-models"></a> +## Documentation for Models + + - [Model.MetadataOutput](docs/MetadataOutput.md) + - [Model.ModelVersion](docs/ModelVersion.md) + + +<a name="documentation-for-authorization"></a> +## Documentation for Authorization + +All endpoints do not require authorization. diff --git a/src/OpenApiGeneratedConnector/appveyor.yml b/src/OpenApiGeneratedConnector/appveyor.yml new file mode 100644 index 0000000000000000000000000000000000000000..f76f63cee506c8807857554d21b8d2693b9464d4 --- /dev/null +++ b/src/OpenApiGeneratedConnector/appveyor.yml @@ -0,0 +1,9 @@ +# auto-generated by OpenAPI Generator (https://github.com/OpenAPITools/openapi-generator) +# +image: Visual Studio 2019 +clone_depth: 1 +build_script: +- dotnet build -c Release +- dotnet test -c Release +after_build: +- dotnet pack .\src\Org.OpenAPITools\Org.OpenAPITools.csproj -o ../../output -c Release --no-build diff --git a/src/OpenApiGeneratedConnector/docs/DefaultApi.md b/src/OpenApiGeneratedConnector/docs/DefaultApi.md new file mode 100644 index 0000000000000000000000000000000000000000..7c97e8ce8fa7e123ef08cdda2c37ede803aacbcc --- /dev/null +++ b/src/OpenApiGeneratedConnector/docs/DefaultApi.md @@ -0,0 +1,266 @@ +# Org.OpenAPITools.Api.DefaultApi + +All URIs are relative to *http://localhost* + +| Method | HTTP request | Description | +|--------|--------------|-------------| +| [**GetConfigWorker**](DefaultApi.md#getconfigworker) | **GET** /defaultConfig | | +| [**GetVersionWorker**](DefaultApi.md#getversionworker) | **GET** /version | | +| [**PostMetadataExtractorWorker**](DefaultApi.md#postmetadataextractorworker) | **POST** / | | + +<a name="getconfigworker"></a> +# **GetConfigWorker** +> void GetConfigWorker () + + + +### Example +```csharp +using System.Collections.Generic; +using System.Diagnostics; +using Org.OpenAPITools.Api; +using Org.OpenAPITools.Client; +using Org.OpenAPITools.Model; + +namespace Example +{ + public class GetConfigWorkerExample + { + public static void Main() + { + Configuration config = new Configuration(); + config.BasePath = "http://localhost"; + var apiInstance = new DefaultApi(config); + + try + { + apiInstance.GetConfigWorker(); + } + catch (ApiException e) + { + Debug.Print("Exception when calling DefaultApi.GetConfigWorker: " + e.Message); + Debug.Print("Status Code: " + e.ErrorCode); + Debug.Print(e.StackTrace); + } + } + } +} +``` + +#### Using the GetConfigWorkerWithHttpInfo variant +This returns an ApiResponse object which contains the response data, status code and headers. + +```csharp +try +{ + apiInstance.GetConfigWorkerWithHttpInfo(); +} +catch (ApiException e) +{ + Debug.Print("Exception when calling DefaultApi.GetConfigWorkerWithHttpInfo: " + e.Message); + Debug.Print("Status Code: " + e.ErrorCode); + Debug.Print(e.StackTrace); +} +``` + +### Parameters +This endpoint does not need any parameter. +### Return type + +void (empty response body) + +### Authorization + +No authorization required + +### HTTP request headers + + - **Content-Type**: Not defined + - **Accept**: Not defined + + +### HTTP response details +| Status code | Description | Response headers | +|-------------|-------------|------------------| +| **200** | Success | - | + +[[Back to top]](#) [[Back to API list]](../README.md#documentation-for-api-endpoints) [[Back to Model list]](../README.md#documentation-for-models) [[Back to README]](../README.md) + +<a name="getversionworker"></a> +# **GetVersionWorker** +> ModelVersion GetVersionWorker () + + + +### Example +```csharp +using System.Collections.Generic; +using System.Diagnostics; +using Org.OpenAPITools.Api; +using Org.OpenAPITools.Client; +using Org.OpenAPITools.Model; + +namespace Example +{ + public class GetVersionWorkerExample + { + public static void Main() + { + Configuration config = new Configuration(); + config.BasePath = "http://localhost"; + var apiInstance = new DefaultApi(config); + + try + { + ModelVersion result = apiInstance.GetVersionWorker(); + Debug.WriteLine(result); + } + catch (ApiException e) + { + Debug.Print("Exception when calling DefaultApi.GetVersionWorker: " + e.Message); + Debug.Print("Status Code: " + e.ErrorCode); + Debug.Print(e.StackTrace); + } + } + } +} +``` + +#### Using the GetVersionWorkerWithHttpInfo variant +This returns an ApiResponse object which contains the response data, status code and headers. + +```csharp +try +{ + ApiResponse<ModelVersion> response = apiInstance.GetVersionWorkerWithHttpInfo(); + Debug.Write("Status Code: " + response.StatusCode); + Debug.Write("Response Headers: " + response.Headers); + Debug.Write("Response Body: " + response.Data); +} +catch (ApiException e) +{ + Debug.Print("Exception when calling DefaultApi.GetVersionWorkerWithHttpInfo: " + e.Message); + Debug.Print("Status Code: " + e.ErrorCode); + Debug.Print(e.StackTrace); +} +``` + +### Parameters +This endpoint does not need any parameter. +### Return type + +[**ModelVersion**](ModelVersion.md) + +### Authorization + +No authorization required + +### HTTP request headers + + - **Content-Type**: Not defined + - **Accept**: application/json + + +### HTTP response details +| Status code | Description | Response headers | +|-------------|-------------|------------------| +| **200** | Success | - | + +[[Back to top]](#) [[Back to API list]](../README.md#documentation-for-api-endpoints) [[Back to Model list]](../README.md#documentation-for-models) [[Back to README]](../README.md) + +<a name="postmetadataextractorworker"></a> +# **PostMetadataExtractorWorker** +> List<MetadataOutput> PostMetadataExtractorWorker (System.IO.Stream file, string identifier = null, string config = null, string creationDate = null, string modificationDate = null) + + + +### Example +```csharp +using System.Collections.Generic; +using System.Diagnostics; +using Org.OpenAPITools.Api; +using Org.OpenAPITools.Client; +using Org.OpenAPITools.Model; + +namespace Example +{ + public class PostMetadataExtractorWorkerExample + { + public static void Main() + { + Configuration config = new Configuration(); + config.BasePath = "http://localhost"; + var apiInstance = new DefaultApi(config); + var file = new System.IO.MemoryStream(System.IO.File.ReadAllBytes("/path/to/file.txt")); // System.IO.Stream | + var identifier = "identifier_example"; // string | File Identifier (optional) + var config = "config_example"; // string | Object defining the utilized configuration (try \\\"/defaultConfig\\\" to get the structure) (optional) + var creationDate = "creationDate_example"; // string | Creation Date (Time) (e.g. \\\"2022-09-15T09:27:17.3550000+02:00\\\") (optional) + var modificationDate = "modificationDate_example"; // string | Modification Date (Time) (e.g. \\\"2022-09-15T09:27:17.3550000+02:00\\\") (optional) + + try + { + List<MetadataOutput> result = apiInstance.PostMetadataExtractorWorker(file, identifier, config, creationDate, modificationDate); + Debug.WriteLine(result); + } + catch (ApiException e) + { + Debug.Print("Exception when calling DefaultApi.PostMetadataExtractorWorker: " + e.Message); + Debug.Print("Status Code: " + e.ErrorCode); + Debug.Print(e.StackTrace); + } + } + } +} +``` + +#### Using the PostMetadataExtractorWorkerWithHttpInfo variant +This returns an ApiResponse object which contains the response data, status code and headers. + +```csharp +try +{ + ApiResponse<List<MetadataOutput>> response = apiInstance.PostMetadataExtractorWorkerWithHttpInfo(file, identifier, config, creationDate, modificationDate); + Debug.Write("Status Code: " + response.StatusCode); + Debug.Write("Response Headers: " + response.Headers); + Debug.Write("Response Body: " + response.Data); +} +catch (ApiException e) +{ + Debug.Print("Exception when calling DefaultApi.PostMetadataExtractorWorkerWithHttpInfo: " + e.Message); + Debug.Print("Status Code: " + e.ErrorCode); + Debug.Print(e.StackTrace); +} +``` + +### Parameters + +| Name | Type | Description | Notes | +|------|------|-------------|-------| +| **file** | **System.IO.Stream****System.IO.Stream** | | | +| **identifier** | **string** | File Identifier | [optional] | +| **config** | **string** | Object defining the utilized configuration (try \\\"/defaultConfig\\\" to get the structure) | [optional] | +| **creationDate** | **string** | Creation Date (Time) (e.g. \\\"2022-09-15T09:27:17.3550000+02:00\\\") | [optional] | +| **modificationDate** | **string** | Modification Date (Time) (e.g. \\\"2022-09-15T09:27:17.3550000+02:00\\\") | [optional] | + +### Return type + +[**List<MetadataOutput>**](MetadataOutput.md) + +### Authorization + +No authorization required + +### HTTP request headers + + - **Content-Type**: multipart/form-data + - **Accept**: application/json + + +### HTTP response details +| Status code | Description | Response headers | +|-------------|-------------|------------------| +| **400** | Bad Request | - | +| **200** | Success | - | + +[[Back to top]](#) [[Back to API list]](../README.md#documentation-for-api-endpoints) [[Back to Model list]](../README.md#documentation-for-models) [[Back to README]](../README.md) + diff --git a/src/OpenApiGeneratedConnector/docs/MetadataOutput.md b/src/OpenApiGeneratedConnector/docs/MetadataOutput.md new file mode 100644 index 0000000000000000000000000000000000000000..0897e68f7438c411cc6d2e94886748ecc20be545 --- /dev/null +++ b/src/OpenApiGeneratedConnector/docs/MetadataOutput.md @@ -0,0 +1,12 @@ +# Org.OpenAPITools.Model.MetadataOutput + +## Properties + +Name | Type | Description | Notes +------------ | ------------- | ------------- | ------------- +**Identifier** | **string** | | [optional] +**Metadata** | **string** | | [optional] +**Text** | **string** | | [optional] + +[[Back to Model list]](../README.md#documentation-for-models) [[Back to API list]](../README.md#documentation-for-api-endpoints) [[Back to README]](../README.md) + diff --git a/src/OpenApiGeneratedConnector/docs/ModelVersion.md b/src/OpenApiGeneratedConnector/docs/ModelVersion.md new file mode 100644 index 0000000000000000000000000000000000000000..2b00f35278a07628356c36fd7c3201905fd48890 --- /dev/null +++ b/src/OpenApiGeneratedConnector/docs/ModelVersion.md @@ -0,0 +1,10 @@ +# Org.OpenAPITools.Model.ModelVersion + +## Properties + +Name | Type | Description | Notes +------------ | ------------- | ------------- | ------------- +**_Version** | **string** | | [optional] + +[[Back to Model list]](../README.md#documentation-for-models) [[Back to API list]](../README.md#documentation-for-api-endpoints) [[Back to README]](../README.md) + diff --git a/src/OpenApiGeneratedConnector/git_push.sh b/src/OpenApiGeneratedConnector/git_push.sh new file mode 100644 index 0000000000000000000000000000000000000000..f53a75d4fabe760cce49eddfd62fcc702938ea90 --- /dev/null +++ b/src/OpenApiGeneratedConnector/git_push.sh @@ -0,0 +1,57 @@ +#!/bin/sh +# ref: https://help.github.com/articles/adding-an-existing-project-to-github-using-the-command-line/ +# +# Usage example: /bin/sh ./git_push.sh wing328 openapi-petstore-perl "minor update" "gitlab.com" + +git_user_id=$1 +git_repo_id=$2 +release_note=$3 +git_host=$4 + +if [ "$git_host" = "" ]; then + git_host="github.com" + echo "[INFO] No command line input provided. Set \$git_host to $git_host" +fi + +if [ "$git_user_id" = "" ]; then + git_user_id="GIT_USER_ID" + echo "[INFO] No command line input provided. Set \$git_user_id to $git_user_id" +fi + +if [ "$git_repo_id" = "" ]; then + git_repo_id="GIT_REPO_ID" + echo "[INFO] No command line input provided. Set \$git_repo_id to $git_repo_id" +fi + +if [ "$release_note" = "" ]; then + release_note="Minor update" + echo "[INFO] No command line input provided. Set \$release_note to $release_note" +fi + +# Initialize the local directory as a Git repository +git init + +# Adds the files in the local repository and stages them for commit. +git add . + +# Commits the tracked changes and prepares them to be pushed to a remote repository. +git commit -m "$release_note" + +# Sets the new remote +git_remote=$(git remote) +if [ "$git_remote" = "" ]; then # git remote not defined + + if [ "$GIT_TOKEN" = "" ]; then + echo "[INFO] \$GIT_TOKEN (environment variable) is not set. Using the git credential in your environment." + git remote add origin https://${git_host}/${git_user_id}/${git_repo_id}.git + else + git remote add origin https://${git_user_id}:"${GIT_TOKEN}"@${git_host}/${git_user_id}/${git_repo_id}.git + fi + +fi + +git pull origin master + +# Pushes (Forces) the changes in the local repository up to the remote repository +echo "Git pushing to https://${git_host}/${git_user_id}/${git_repo_id}.git" +git push origin master 2>&1 | grep -v 'To https' diff --git a/src/OpenApiGeneratedConnector/src/Org.OpenAPITools/Api/DefaultApi.cs b/src/OpenApiGeneratedConnector/src/Org.OpenAPITools/Api/DefaultApi.cs new file mode 100644 index 0000000000000000000000000000000000000000..5d5541c8dfe218eedea91d5ce8c89f5d474b3a2a --- /dev/null +++ b/src/OpenApiGeneratedConnector/src/Org.OpenAPITools/Api/DefaultApi.cs @@ -0,0 +1,729 @@ +/* + * Metadata Extractor API + * + * This API extracts RDF triples from files + * + * The version of the OpenAPI document: 0.1.1 + * Generated by: https://github.com/openapitools/openapi-generator.git + */ + +using Org.OpenAPITools.Client; +using Org.OpenAPITools.Model; + +namespace Org.OpenAPITools.Api +{ + /// <summary> + /// Represents a collection of functions to interact with the API endpoints + /// </summary> + public interface IDefaultApiSync : IApiAccessor + { + #region Synchronous Operations + + /// <summary> + /// + /// </summary> + /// <exception cref="Org.OpenAPITools.Client.ApiException">Thrown when fails to make API call</exception> + /// <param name="operationIndex">Index associated with the operation.</param> + /// <returns></returns> + void GetConfigWorker(int operationIndex = 0); + + /// <summary> + /// + /// </summary> + /// <remarks> + /// + /// </remarks> + /// <exception cref="Org.OpenAPITools.Client.ApiException">Thrown when fails to make API call</exception> + /// <param name="operationIndex">Index associated with the operation.</param> + /// <returns>ApiResponse of Object(void)</returns> + ApiResponse<Object> GetConfigWorkerWithHttpInfo(int operationIndex = 0); + + /// <summary> + /// + /// </summary> + /// <exception cref="Org.OpenAPITools.Client.ApiException">Thrown when fails to make API call</exception> + /// <param name="operationIndex">Index associated with the operation.</param> + /// <returns>ModelVersion</returns> + ModelVersion GetVersionWorker(int operationIndex = 0); + + /// <summary> + /// + /// </summary> + /// <remarks> + /// + /// </remarks> + /// <exception cref="Org.OpenAPITools.Client.ApiException">Thrown when fails to make API call</exception> + /// <param name="operationIndex">Index associated with the operation.</param> + /// <returns>ApiResponse of ModelVersion</returns> + ApiResponse<ModelVersion> GetVersionWorkerWithHttpInfo(int operationIndex = 0); + + /// <summary> + /// + /// </summary> + /// <exception cref="Org.OpenAPITools.Client.ApiException">Thrown when fails to make API call</exception> + /// <param name="file"></param> + /// <param name="identifier">File Identifier (optional)</param> + /// <param name="config">Object defining the utilized configuration (try \\\"/defaultConfig\\\" to get the structure) (optional)</param> + /// <param name="creationDate">Creation Date (Time) (e.g. \\\"2022-09-15T09:27:17.3550000+02:00\\\") (optional)</param> + /// <param name="modificationDate">Modification Date (Time) (e.g. \\\"2022-09-15T09:27:17.3550000+02:00\\\") (optional)</param> + /// <param name="operationIndex">Index associated with the operation.</param> + /// <returns>List<MetadataOutput></returns> + List<MetadataOutput> PostMetadataExtractorWorker(System.IO.Stream file, string identifier = default(string), string config = default(string), string creationDate = default(string), string modificationDate = default(string), int operationIndex = 0); + + /// <summary> + /// + /// </summary> + /// <remarks> + /// + /// </remarks> + /// <exception cref="Org.OpenAPITools.Client.ApiException">Thrown when fails to make API call</exception> + /// <param name="file"></param> + /// <param name="identifier">File Identifier (optional)</param> + /// <param name="config">Object defining the utilized configuration (try \\\"/defaultConfig\\\" to get the structure) (optional)</param> + /// <param name="creationDate">Creation Date (Time) (e.g. \\\"2022-09-15T09:27:17.3550000+02:00\\\") (optional)</param> + /// <param name="modificationDate">Modification Date (Time) (e.g. \\\"2022-09-15T09:27:17.3550000+02:00\\\") (optional)</param> + /// <param name="operationIndex">Index associated with the operation.</param> + /// <returns>ApiResponse of List<MetadataOutput></returns> + ApiResponse<List<MetadataOutput>> PostMetadataExtractorWorkerWithHttpInfo(System.IO.Stream file, string identifier = default(string), string config = default(string), string creationDate = default(string), string modificationDate = default(string), int operationIndex = 0); + + #endregion Synchronous Operations + } + + /// <summary> + /// Represents a collection of functions to interact with the API endpoints + /// </summary> + public interface IDefaultApiAsync : IApiAccessor + { + #region Asynchronous Operations + + /// <summary> + /// + /// </summary> + /// <remarks> + /// + /// </remarks> + /// <exception cref="Org.OpenAPITools.Client.ApiException">Thrown when fails to make API call</exception> + /// <param name="operationIndex">Index associated with the operation.</param> + /// <param name="cancellationToken">Cancellation Token to cancel the request.</param> + /// <returns>Task of void</returns> + System.Threading.Tasks.Task GetConfigWorkerAsync(int operationIndex = 0, System.Threading.CancellationToken cancellationToken = default(System.Threading.CancellationToken)); + + /// <summary> + /// + /// </summary> + /// <remarks> + /// + /// </remarks> + /// <exception cref="Org.OpenAPITools.Client.ApiException">Thrown when fails to make API call</exception> + /// <param name="operationIndex">Index associated with the operation.</param> + /// <param name="cancellationToken">Cancellation Token to cancel the request.</param> + /// <returns>Task of ApiResponse</returns> + System.Threading.Tasks.Task<ApiResponse<Object>> GetConfigWorkerWithHttpInfoAsync(int operationIndex = 0, System.Threading.CancellationToken cancellationToken = default(System.Threading.CancellationToken)); + + /// <summary> + /// + /// </summary> + /// <remarks> + /// + /// </remarks> + /// <exception cref="Org.OpenAPITools.Client.ApiException">Thrown when fails to make API call</exception> + /// <param name="operationIndex">Index associated with the operation.</param> + /// <param name="cancellationToken">Cancellation Token to cancel the request.</param> + /// <returns>Task of ModelVersion</returns> + System.Threading.Tasks.Task<ModelVersion> GetVersionWorkerAsync(int operationIndex = 0, System.Threading.CancellationToken cancellationToken = default(System.Threading.CancellationToken)); + + /// <summary> + /// + /// </summary> + /// <remarks> + /// + /// </remarks> + /// <exception cref="Org.OpenAPITools.Client.ApiException">Thrown when fails to make API call</exception> + /// <param name="operationIndex">Index associated with the operation.</param> + /// <param name="cancellationToken">Cancellation Token to cancel the request.</param> + /// <returns>Task of ApiResponse (ModelVersion)</returns> + System.Threading.Tasks.Task<ApiResponse<ModelVersion>> GetVersionWorkerWithHttpInfoAsync(int operationIndex = 0, System.Threading.CancellationToken cancellationToken = default(System.Threading.CancellationToken)); + + /// <summary> + /// + /// </summary> + /// <remarks> + /// + /// </remarks> + /// <exception cref="Org.OpenAPITools.Client.ApiException">Thrown when fails to make API call</exception> + /// <param name="file"></param> + /// <param name="identifier">File Identifier (optional)</param> + /// <param name="config">Object defining the utilized configuration (try \\\"/defaultConfig\\\" to get the structure) (optional)</param> + /// <param name="creationDate">Creation Date (Time) (e.g. \\\"2022-09-15T09:27:17.3550000+02:00\\\") (optional)</param> + /// <param name="modificationDate">Modification Date (Time) (e.g. \\\"2022-09-15T09:27:17.3550000+02:00\\\") (optional)</param> + /// <param name="operationIndex">Index associated with the operation.</param> + /// <param name="cancellationToken">Cancellation Token to cancel the request.</param> + /// <returns>Task of List<MetadataOutput></returns> + System.Threading.Tasks.Task<List<MetadataOutput>> PostMetadataExtractorWorkerAsync(System.IO.Stream file, string identifier = default(string), string config = default(string), string creationDate = default(string), string modificationDate = default(string), int operationIndex = 0, System.Threading.CancellationToken cancellationToken = default(System.Threading.CancellationToken)); + + /// <summary> + /// + /// </summary> + /// <remarks> + /// + /// </remarks> + /// <exception cref="Org.OpenAPITools.Client.ApiException">Thrown when fails to make API call</exception> + /// <param name="file"></param> + /// <param name="identifier">File Identifier (optional)</param> + /// <param name="config">Object defining the utilized configuration (try \\\"/defaultConfig\\\" to get the structure) (optional)</param> + /// <param name="creationDate">Creation Date (Time) (e.g. \\\"2022-09-15T09:27:17.3550000+02:00\\\") (optional)</param> + /// <param name="modificationDate">Modification Date (Time) (e.g. \\\"2022-09-15T09:27:17.3550000+02:00\\\") (optional)</param> + /// <param name="operationIndex">Index associated with the operation.</param> + /// <param name="cancellationToken">Cancellation Token to cancel the request.</param> + /// <returns>Task of ApiResponse (List<MetadataOutput>)</returns> + System.Threading.Tasks.Task<ApiResponse<List<MetadataOutput>>> PostMetadataExtractorWorkerWithHttpInfoAsync(System.IO.Stream file, string identifier = default(string), string config = default(string), string creationDate = default(string), string modificationDate = default(string), int operationIndex = 0, System.Threading.CancellationToken cancellationToken = default(System.Threading.CancellationToken)); + + #endregion Asynchronous Operations + } + + /// <summary> + /// Represents a collection of functions to interact with the API endpoints + /// </summary> + public interface IDefaultApi : IDefaultApiSync, IDefaultApiAsync + { + } + + /// <summary> + /// Represents a collection of functions to interact with the API endpoints + /// </summary> + public partial class DefaultApi : IDefaultApi + { + private Org.OpenAPITools.Client.ExceptionFactory _exceptionFactory = (name, response) => null; + + /// <summary> + /// Initializes a new instance of the <see cref="DefaultApi"/> class. + /// </summary> + /// <returns></returns> + public DefaultApi() : this((string)null) + { + } + + /// <summary> + /// Initializes a new instance of the <see cref="DefaultApi"/> class. + /// </summary> + /// <returns></returns> + public DefaultApi(string basePath) + { + this.Configuration = Org.OpenAPITools.Client.Configuration.MergeConfigurations( + Org.OpenAPITools.Client.GlobalConfiguration.Instance, + new Org.OpenAPITools.Client.Configuration { BasePath = basePath } + ); + this.Client = new Org.OpenAPITools.Client.ApiClient(this.Configuration.BasePath); + this.AsynchronousClient = new Org.OpenAPITools.Client.ApiClient(this.Configuration.BasePath); + this.ExceptionFactory = Org.OpenAPITools.Client.Configuration.DefaultExceptionFactory; + } + + /// <summary> + /// Initializes a new instance of the <see cref="DefaultApi"/> class + /// using Configuration object + /// </summary> + /// <param name="configuration">An instance of Configuration</param> + /// <returns></returns> + public DefaultApi(Org.OpenAPITools.Client.Configuration configuration) + { + if (configuration == null) throw new ArgumentNullException("configuration"); + + this.Configuration = Org.OpenAPITools.Client.Configuration.MergeConfigurations( + Org.OpenAPITools.Client.GlobalConfiguration.Instance, + configuration + ); + this.Client = new Org.OpenAPITools.Client.ApiClient(this.Configuration.BasePath); + this.AsynchronousClient = new Org.OpenAPITools.Client.ApiClient(this.Configuration.BasePath); + ExceptionFactory = Org.OpenAPITools.Client.Configuration.DefaultExceptionFactory; + } + + /// <summary> + /// Initializes a new instance of the <see cref="DefaultApi"/> class + /// using a Configuration object and client instance. + /// </summary> + /// <param name="client">The client interface for synchronous API access.</param> + /// <param name="asyncClient">The client interface for asynchronous API access.</param> + /// <param name="configuration">The configuration object.</param> + public DefaultApi(Org.OpenAPITools.Client.ISynchronousClient client, Org.OpenAPITools.Client.IAsynchronousClient asyncClient, Org.OpenAPITools.Client.IReadableConfiguration configuration) + { + if (client == null) throw new ArgumentNullException("client"); + if (asyncClient == null) throw new ArgumentNullException("asyncClient"); + if (configuration == null) throw new ArgumentNullException("configuration"); + + this.Client = client; + this.AsynchronousClient = asyncClient; + this.Configuration = configuration; + this.ExceptionFactory = Org.OpenAPITools.Client.Configuration.DefaultExceptionFactory; + } + + /// <summary> + /// The client for accessing this underlying API asynchronously. + /// </summary> + public Org.OpenAPITools.Client.IAsynchronousClient AsynchronousClient { get; set; } + + /// <summary> + /// The client for accessing this underlying API synchronously. + /// </summary> + public Org.OpenAPITools.Client.ISynchronousClient Client { get; set; } + + /// <summary> + /// Gets the base path of the API client. + /// </summary> + /// <value>The base path</value> + public string GetBasePath() + { + return this.Configuration.BasePath; + } + + /// <summary> + /// Gets or sets the configuration object + /// </summary> + /// <value>An instance of the Configuration</value> + public Org.OpenAPITools.Client.IReadableConfiguration Configuration { get; set; } + + /// <summary> + /// Provides a factory method hook for the creation of exceptions. + /// </summary> + public Org.OpenAPITools.Client.ExceptionFactory ExceptionFactory + { + get + { + if (_exceptionFactory != null && _exceptionFactory.GetInvocationList().Length > 1) + { + throw new InvalidOperationException("Multicast delegate for ExceptionFactory is unsupported."); + } + return _exceptionFactory; + } + set { _exceptionFactory = value; } + } + + /// <summary> + /// + /// </summary> + /// <exception cref="Org.OpenAPITools.Client.ApiException">Thrown when fails to make API call</exception> + /// <param name="operationIndex">Index associated with the operation.</param> + /// <returns></returns> + public void GetConfigWorker(int operationIndex = 0) + { + GetConfigWorkerWithHttpInfo(); + } + + /// <summary> + /// + /// </summary> + /// <exception cref="Org.OpenAPITools.Client.ApiException">Thrown when fails to make API call</exception> + /// <param name="operationIndex">Index associated with the operation.</param> + /// <returns>ApiResponse of Object(void)</returns> + public Org.OpenAPITools.Client.ApiResponse<Object> GetConfigWorkerWithHttpInfo(int operationIndex = 0) + { + Org.OpenAPITools.Client.RequestOptions localVarRequestOptions = new Org.OpenAPITools.Client.RequestOptions(); + + string[] _contentTypes = new string[] { + }; + + // to determine the Accept header + string[] _accepts = new string[] { + }; + + var localVarContentType = Org.OpenAPITools.Client.ClientUtils.SelectHeaderContentType(_contentTypes); + if (localVarContentType != null) + { + localVarRequestOptions.HeaderParameters.Add("Content-Type", localVarContentType); + } + + var localVarAccept = Org.OpenAPITools.Client.ClientUtils.SelectHeaderAccept(_accepts); + if (localVarAccept != null) + { + localVarRequestOptions.HeaderParameters.Add("Accept", localVarAccept); + } + + localVarRequestOptions.Operation = "DefaultApi.GetConfigWorker"; + localVarRequestOptions.OperationIndex = operationIndex; + + // make the HTTP request + var localVarResponse = this.Client.Get<Object>("/defaultConfig", localVarRequestOptions, this.Configuration); + if (this.ExceptionFactory != null) + { + Exception _exception = this.ExceptionFactory("GetConfigWorker", localVarResponse); + if (_exception != null) + { + throw _exception; + } + } + + return localVarResponse; + } + + /// <summary> + /// + /// </summary> + /// <exception cref="Org.OpenAPITools.Client.ApiException">Thrown when fails to make API call</exception> + /// <param name="operationIndex">Index associated with the operation.</param> + /// <param name="cancellationToken">Cancellation Token to cancel the request.</param> + /// <returns>Task of void</returns> + public async System.Threading.Tasks.Task GetConfigWorkerAsync(int operationIndex = 0, System.Threading.CancellationToken cancellationToken = default(System.Threading.CancellationToken)) + { + await GetConfigWorkerWithHttpInfoAsync(operationIndex, cancellationToken).ConfigureAwait(false); + } + + /// <summary> + /// + /// </summary> + /// <exception cref="Org.OpenAPITools.Client.ApiException">Thrown when fails to make API call</exception> + /// <param name="operationIndex">Index associated with the operation.</param> + /// <param name="cancellationToken">Cancellation Token to cancel the request.</param> + /// <returns>Task of ApiResponse</returns> + public async System.Threading.Tasks.Task<Org.OpenAPITools.Client.ApiResponse<Object>> GetConfigWorkerWithHttpInfoAsync(int operationIndex = 0, System.Threading.CancellationToken cancellationToken = default(System.Threading.CancellationToken)) + { + Org.OpenAPITools.Client.RequestOptions localVarRequestOptions = new Org.OpenAPITools.Client.RequestOptions(); + + string[] _contentTypes = new string[] { + }; + + // to determine the Accept header + string[] _accepts = new string[] { + }; + + var localVarContentType = Org.OpenAPITools.Client.ClientUtils.SelectHeaderContentType(_contentTypes); + if (localVarContentType != null) + { + localVarRequestOptions.HeaderParameters.Add("Content-Type", localVarContentType); + } + + var localVarAccept = Org.OpenAPITools.Client.ClientUtils.SelectHeaderAccept(_accepts); + if (localVarAccept != null) + { + localVarRequestOptions.HeaderParameters.Add("Accept", localVarAccept); + } + + localVarRequestOptions.Operation = "DefaultApi.GetConfigWorker"; + localVarRequestOptions.OperationIndex = operationIndex; + + // make the HTTP request + var localVarResponse = await this.AsynchronousClient.GetAsync<Object>("/defaultConfig", localVarRequestOptions, this.Configuration, cancellationToken).ConfigureAwait(false); + + if (this.ExceptionFactory != null) + { + Exception _exception = this.ExceptionFactory("GetConfigWorker", localVarResponse); + if (_exception != null) + { + throw _exception; + } + } + + return localVarResponse; + } + + /// <summary> + /// + /// </summary> + /// <exception cref="Org.OpenAPITools.Client.ApiException">Thrown when fails to make API call</exception> + /// <param name="operationIndex">Index associated with the operation.</param> + /// <returns>ModelVersion</returns> + public ModelVersion GetVersionWorker(int operationIndex = 0) + { + Org.OpenAPITools.Client.ApiResponse<ModelVersion> localVarResponse = GetVersionWorkerWithHttpInfo(); + return localVarResponse.Data; + } + + /// <summary> + /// + /// </summary> + /// <exception cref="Org.OpenAPITools.Client.ApiException">Thrown when fails to make API call</exception> + /// <param name="operationIndex">Index associated with the operation.</param> + /// <returns>ApiResponse of ModelVersion</returns> + public Org.OpenAPITools.Client.ApiResponse<ModelVersion> GetVersionWorkerWithHttpInfo(int operationIndex = 0) + { + Org.OpenAPITools.Client.RequestOptions localVarRequestOptions = new Org.OpenAPITools.Client.RequestOptions(); + + string[] _contentTypes = new string[] { + }; + + // to determine the Accept header + string[] _accepts = new string[] { + "application/json" + }; + + var localVarContentType = Org.OpenAPITools.Client.ClientUtils.SelectHeaderContentType(_contentTypes); + if (localVarContentType != null) + { + localVarRequestOptions.HeaderParameters.Add("Content-Type", localVarContentType); + } + + var localVarAccept = Org.OpenAPITools.Client.ClientUtils.SelectHeaderAccept(_accepts); + if (localVarAccept != null) + { + localVarRequestOptions.HeaderParameters.Add("Accept", localVarAccept); + } + + localVarRequestOptions.Operation = "DefaultApi.GetVersionWorker"; + localVarRequestOptions.OperationIndex = operationIndex; + + // make the HTTP request + var localVarResponse = this.Client.Get<ModelVersion>("/version", localVarRequestOptions, this.Configuration); + if (this.ExceptionFactory != null) + { + Exception _exception = this.ExceptionFactory("GetVersionWorker", localVarResponse); + if (_exception != null) + { + throw _exception; + } + } + + return localVarResponse; + } + + /// <summary> + /// + /// </summary> + /// <exception cref="Org.OpenAPITools.Client.ApiException">Thrown when fails to make API call</exception> + /// <param name="operationIndex">Index associated with the operation.</param> + /// <param name="cancellationToken">Cancellation Token to cancel the request.</param> + /// <returns>Task of ModelVersion</returns> + public async System.Threading.Tasks.Task<ModelVersion> GetVersionWorkerAsync(int operationIndex = 0, System.Threading.CancellationToken cancellationToken = default(System.Threading.CancellationToken)) + { + Org.OpenAPITools.Client.ApiResponse<ModelVersion> localVarResponse = await GetVersionWorkerWithHttpInfoAsync(operationIndex, cancellationToken).ConfigureAwait(false); + return localVarResponse.Data; + } + + /// <summary> + /// + /// </summary> + /// <exception cref="Org.OpenAPITools.Client.ApiException">Thrown when fails to make API call</exception> + /// <param name="operationIndex">Index associated with the operation.</param> + /// <param name="cancellationToken">Cancellation Token to cancel the request.</param> + /// <returns>Task of ApiResponse (ModelVersion)</returns> + public async System.Threading.Tasks.Task<Org.OpenAPITools.Client.ApiResponse<ModelVersion>> GetVersionWorkerWithHttpInfoAsync(int operationIndex = 0, System.Threading.CancellationToken cancellationToken = default(System.Threading.CancellationToken)) + { + Org.OpenAPITools.Client.RequestOptions localVarRequestOptions = new Org.OpenAPITools.Client.RequestOptions(); + + string[] _contentTypes = new string[] { + }; + + // to determine the Accept header + string[] _accepts = new string[] { + "application/json" + }; + + var localVarContentType = Org.OpenAPITools.Client.ClientUtils.SelectHeaderContentType(_contentTypes); + if (localVarContentType != null) + { + localVarRequestOptions.HeaderParameters.Add("Content-Type", localVarContentType); + } + + var localVarAccept = Org.OpenAPITools.Client.ClientUtils.SelectHeaderAccept(_accepts); + if (localVarAccept != null) + { + localVarRequestOptions.HeaderParameters.Add("Accept", localVarAccept); + } + + localVarRequestOptions.Operation = "DefaultApi.GetVersionWorker"; + localVarRequestOptions.OperationIndex = operationIndex; + + // make the HTTP request + var localVarResponse = await this.AsynchronousClient.GetAsync<ModelVersion>("/version", localVarRequestOptions, this.Configuration, cancellationToken).ConfigureAwait(false); + + if (this.ExceptionFactory != null) + { + Exception _exception = this.ExceptionFactory("GetVersionWorker", localVarResponse); + if (_exception != null) + { + throw _exception; + } + } + + return localVarResponse; + } + + /// <summary> + /// + /// </summary> + /// <exception cref="Org.OpenAPITools.Client.ApiException">Thrown when fails to make API call</exception> + /// <param name="file"></param> + /// <param name="identifier">File Identifier (optional)</param> + /// <param name="config">Object defining the utilized configuration (try \\\"/defaultConfig\\\" to get the structure) (optional)</param> + /// <param name="creationDate">Creation Date (Time) (e.g. \\\"2022-09-15T09:27:17.3550000+02:00\\\") (optional)</param> + /// <param name="modificationDate">Modification Date (Time) (e.g. \\\"2022-09-15T09:27:17.3550000+02:00\\\") (optional)</param> + /// <param name="operationIndex">Index associated with the operation.</param> + /// <returns>List<MetadataOutput></returns> + public List<MetadataOutput> PostMetadataExtractorWorker(System.IO.Stream file, string identifier = default(string), string config = default(string), string creationDate = default(string), string modificationDate = default(string), int operationIndex = 0) + { + Org.OpenAPITools.Client.ApiResponse<List<MetadataOutput>> localVarResponse = PostMetadataExtractorWorkerWithHttpInfo(file, identifier, config, creationDate, modificationDate); + return localVarResponse.Data; + } + + /// <summary> + /// + /// </summary> + /// <exception cref="Org.OpenAPITools.Client.ApiException">Thrown when fails to make API call</exception> + /// <param name="file"></param> + /// <param name="identifier">File Identifier (optional)</param> + /// <param name="config">Object defining the utilized configuration (try \\\"/defaultConfig\\\" to get the structure) (optional)</param> + /// <param name="creationDate">Creation Date (Time) (e.g. \\\"2022-09-15T09:27:17.3550000+02:00\\\") (optional)</param> + /// <param name="modificationDate">Modification Date (Time) (e.g. \\\"2022-09-15T09:27:17.3550000+02:00\\\") (optional)</param> + /// <param name="operationIndex">Index associated with the operation.</param> + /// <returns>ApiResponse of List<MetadataOutput></returns> + public Org.OpenAPITools.Client.ApiResponse<List<MetadataOutput>> PostMetadataExtractorWorkerWithHttpInfo(System.IO.Stream file, string identifier = default(string), string config = default(string), string creationDate = default(string), string modificationDate = default(string), int operationIndex = 0) + { + // verify the required parameter 'file' is set + if (file == null) + { + throw new Org.OpenAPITools.Client.ApiException(400, "Missing required parameter 'file' when calling DefaultApi->PostMetadataExtractorWorker"); + } + + Org.OpenAPITools.Client.RequestOptions localVarRequestOptions = new Org.OpenAPITools.Client.RequestOptions(); + + string[] _contentTypes = new string[] { + "multipart/form-data" + }; + + // to determine the Accept header + string[] _accepts = new string[] { + "application/json" + }; + + var localVarContentType = Org.OpenAPITools.Client.ClientUtils.SelectHeaderContentType(_contentTypes); + if (localVarContentType != null) + { + localVarRequestOptions.HeaderParameters.Add("Content-Type", localVarContentType); + } + + var localVarAccept = Org.OpenAPITools.Client.ClientUtils.SelectHeaderAccept(_accepts); + if (localVarAccept != null) + { + localVarRequestOptions.HeaderParameters.Add("Accept", localVarAccept); + } + + if (identifier != null) + { + localVarRequestOptions.FormParameters.Add("identifier", Org.OpenAPITools.Client.ClientUtils.ParameterToString(identifier)); // form parameter + } + if (config != null) + { + localVarRequestOptions.FormParameters.Add("config", Org.OpenAPITools.Client.ClientUtils.ParameterToString(config)); // form parameter + } + if (creationDate != null) + { + localVarRequestOptions.FormParameters.Add("creation_date", Org.OpenAPITools.Client.ClientUtils.ParameterToString(creationDate)); // form parameter + } + if (modificationDate != null) + { + localVarRequestOptions.FormParameters.Add("modification_date", Org.OpenAPITools.Client.ClientUtils.ParameterToString(modificationDate)); // form parameter + } + localVarRequestOptions.FileParameters.Add("file", file); + + localVarRequestOptions.Operation = "DefaultApi.PostMetadataExtractorWorker"; + localVarRequestOptions.OperationIndex = operationIndex; + + // make the HTTP request + var localVarResponse = this.Client.Post<List<MetadataOutput>>("/", localVarRequestOptions, this.Configuration); + if (this.ExceptionFactory != null) + { + Exception _exception = this.ExceptionFactory("PostMetadataExtractorWorker", localVarResponse); + if (_exception != null) + { + throw _exception; + } + } + + return localVarResponse; + } + + /// <summary> + /// + /// </summary> + /// <exception cref="Org.OpenAPITools.Client.ApiException">Thrown when fails to make API call</exception> + /// <param name="file"></param> + /// <param name="identifier">File Identifier (optional)</param> + /// <param name="config">Object defining the utilized configuration (try \\\"/defaultConfig\\\" to get the structure) (optional)</param> + /// <param name="creationDate">Creation Date (Time) (e.g. \\\"2022-09-15T09:27:17.3550000+02:00\\\") (optional)</param> + /// <param name="modificationDate">Modification Date (Time) (e.g. \\\"2022-09-15T09:27:17.3550000+02:00\\\") (optional)</param> + /// <param name="operationIndex">Index associated with the operation.</param> + /// <param name="cancellationToken">Cancellation Token to cancel the request.</param> + /// <returns>Task of List<MetadataOutput></returns> + public async System.Threading.Tasks.Task<List<MetadataOutput>> PostMetadataExtractorWorkerAsync(System.IO.Stream file, string identifier = default(string), string config = default(string), string creationDate = default(string), string modificationDate = default(string), int operationIndex = 0, System.Threading.CancellationToken cancellationToken = default(System.Threading.CancellationToken)) + { + Org.OpenAPITools.Client.ApiResponse<List<MetadataOutput>> localVarResponse = await PostMetadataExtractorWorkerWithHttpInfoAsync(file, identifier, config, creationDate, modificationDate, operationIndex, cancellationToken).ConfigureAwait(false); + return localVarResponse.Data; + } + + /// <summary> + /// + /// </summary> + /// <exception cref="Org.OpenAPITools.Client.ApiException">Thrown when fails to make API call</exception> + /// <param name="file"></param> + /// <param name="identifier">File Identifier (optional)</param> + /// <param name="config">Object defining the utilized configuration (try \\\"/defaultConfig\\\" to get the structure) (optional)</param> + /// <param name="creationDate">Creation Date (Time) (e.g. \\\"2022-09-15T09:27:17.3550000+02:00\\\") (optional)</param> + /// <param name="modificationDate">Modification Date (Time) (e.g. \\\"2022-09-15T09:27:17.3550000+02:00\\\") (optional)</param> + /// <param name="operationIndex">Index associated with the operation.</param> + /// <param name="cancellationToken">Cancellation Token to cancel the request.</param> + /// <returns>Task of ApiResponse (List<MetadataOutput>)</returns> + public async System.Threading.Tasks.Task<Org.OpenAPITools.Client.ApiResponse<List<MetadataOutput>>> PostMetadataExtractorWorkerWithHttpInfoAsync(System.IO.Stream file, string identifier = default(string), string config = default(string), string creationDate = default(string), string modificationDate = default(string), int operationIndex = 0, System.Threading.CancellationToken cancellationToken = default(System.Threading.CancellationToken)) + { + // verify the required parameter 'file' is set + if (file == null) + { + throw new Org.OpenAPITools.Client.ApiException(400, "Missing required parameter 'file' when calling DefaultApi->PostMetadataExtractorWorker"); + } + + Org.OpenAPITools.Client.RequestOptions localVarRequestOptions = new Org.OpenAPITools.Client.RequestOptions(); + + string[] _contentTypes = new string[] { + "multipart/form-data" + }; + + // to determine the Accept header + string[] _accepts = new string[] { + "application/json" + }; + + var localVarContentType = Org.OpenAPITools.Client.ClientUtils.SelectHeaderContentType(_contentTypes); + if (localVarContentType != null) + { + localVarRequestOptions.HeaderParameters.Add("Content-Type", localVarContentType); + } + + var localVarAccept = Org.OpenAPITools.Client.ClientUtils.SelectHeaderAccept(_accepts); + if (localVarAccept != null) + { + localVarRequestOptions.HeaderParameters.Add("Accept", localVarAccept); + } + + if (identifier != null) + { + localVarRequestOptions.FormParameters.Add("identifier", Org.OpenAPITools.Client.ClientUtils.ParameterToString(identifier)); // form parameter + } + if (config != null) + { + localVarRequestOptions.FormParameters.Add("config", Org.OpenAPITools.Client.ClientUtils.ParameterToString(config)); // form parameter + } + if (creationDate != null) + { + localVarRequestOptions.FormParameters.Add("creation_date", Org.OpenAPITools.Client.ClientUtils.ParameterToString(creationDate)); // form parameter + } + if (modificationDate != null) + { + localVarRequestOptions.FormParameters.Add("modification_date", Org.OpenAPITools.Client.ClientUtils.ParameterToString(modificationDate)); // form parameter + } + localVarRequestOptions.FileParameters.Add("file", file); + + localVarRequestOptions.Operation = "DefaultApi.PostMetadataExtractorWorker"; + localVarRequestOptions.OperationIndex = operationIndex; + + // make the HTTP request + var localVarResponse = await this.AsynchronousClient.PostAsync<List<MetadataOutput>>("/", localVarRequestOptions, this.Configuration, cancellationToken).ConfigureAwait(false); + + if (this.ExceptionFactory != null) + { + Exception _exception = this.ExceptionFactory("PostMetadataExtractorWorker", localVarResponse); + if (_exception != null) + { + throw _exception; + } + } + + return localVarResponse; + } + } +} \ No newline at end of file diff --git a/src/OpenApiGeneratedConnector/src/Org.OpenAPITools/Client/ApiClient.cs b/src/OpenApiGeneratedConnector/src/Org.OpenAPITools/Client/ApiClient.cs new file mode 100644 index 0000000000000000000000000000000000000000..fb7a6d931650b965202e39e2e03b8ed9dda59e64 --- /dev/null +++ b/src/OpenApiGeneratedConnector/src/Org.OpenAPITools/Client/ApiClient.cs @@ -0,0 +1,821 @@ +/* + * Metadata Extractor API + * + * This API extracts RDF triples from files + * + * The version of the OpenAPI document: 0.1.1 + * Generated by: https://github.com/openapitools/openapi-generator.git + */ + + +using System.Net; +using System.Text.RegularExpressions; +using Newtonsoft.Json; +using Newtonsoft.Json.Serialization; +using RestSharp; +using RestSharp.Serializers; +using RestSharpMethod = RestSharp.Method; +using Polly; + +namespace Org.OpenAPITools.Client +{ + /// <summary> + /// Allows RestSharp to Serialize/Deserialize JSON using our custom logic, but only when ContentType is JSON. + /// </summary> + internal class CustomJsonCodec : IRestSerializer, ISerializer, IDeserializer + { + private readonly IReadableConfiguration _configuration; + private static readonly string _contentType = "application/json"; + private readonly JsonSerializerSettings _serializerSettings = new JsonSerializerSettings + { + // OpenAPI generated types generally hide default constructors. + ConstructorHandling = ConstructorHandling.AllowNonPublicDefaultConstructor, + ContractResolver = new DefaultContractResolver + { + NamingStrategy = new CamelCaseNamingStrategy + { + OverrideSpecifiedNames = false + } + } + }; + + public CustomJsonCodec(IReadableConfiguration configuration) + { + _configuration = configuration; + } + + public CustomJsonCodec(JsonSerializerSettings serializerSettings, IReadableConfiguration configuration) + { + _serializerSettings = serializerSettings; + _configuration = configuration; + } + + /// <summary> + /// Serialize the object into a JSON string. + /// </summary> + /// <param name="obj">Object to be serialized.</param> + /// <returns>A JSON string.</returns> + public string Serialize(object obj) + { + if (obj != null && obj is Org.OpenAPITools.Model.AbstractOpenAPISchema) + { + // the object to be serialized is an oneOf/anyOf schema + return ((Org.OpenAPITools.Model.AbstractOpenAPISchema)obj).ToJson(); + } + else + { + return JsonConvert.SerializeObject(obj, _serializerSettings); + } + } + + public string Serialize(Parameter bodyParameter) => Serialize(bodyParameter.Value); + + public T Deserialize<T>(RestResponse response) + { + var result = (T)Deserialize(response, typeof(T)); + return result; + } + + /// <summary> + /// Deserialize the JSON string into a proper object. + /// </summary> + /// <param name="response">The HTTP response.</param> + /// <param name="type">Object type.</param> + /// <returns>Object representation of the JSON string.</returns> + internal object Deserialize(RestResponse response, Type type) + { + if (type == typeof(byte[])) // return byte array + { + return response.RawBytes; + } + + // TODO: ? if (type.IsAssignableFrom(typeof(Stream))) + if (type == typeof(Stream)) + { + var bytes = response.RawBytes; + if (response.Headers != null) + { + var filePath = string.IsNullOrEmpty(_configuration.TempFolderPath) + ? Path.GetTempPath() + : _configuration.TempFolderPath; + var regex = new Regex(@"Content-Disposition=.*filename=['""]?([^'""\s]+)['""]?$"); + foreach (var header in response.Headers) + { + var match = regex.Match(header.ToString()); + if (match.Success) + { + string fileName = filePath + ClientUtils.SanitizeFilename(match.Groups[1].Value.Replace("\"", "").Replace("'", "")); + File.WriteAllBytes(fileName, bytes); + return new FileStream(fileName, FileMode.Open); + } + } + } + var stream = new MemoryStream(bytes); + return stream; + } + + if (type.Name.StartsWith("System.Nullable`1[[System.DateTime")) // return a datetime object + { + return DateTime.Parse(response.Content, null, System.Globalization.DateTimeStyles.RoundtripKind); + } + + if (type == typeof(string) || type.Name.StartsWith("System.Nullable")) // return primitive type + { + return Convert.ChangeType(response.Content, type); + } + + // at this point, it must be a model (json) + try + { + return JsonConvert.DeserializeObject(response.Content, type, _serializerSettings); + } + catch (Exception e) + { + throw new ApiException(500, e.Message); + } + } + + public ISerializer Serializer => this; + public IDeserializer Deserializer => this; + + public string[] AcceptedContentTypes => RestSharp.Serializers.ContentType.JsonAccept; + + public SupportsContentType SupportsContentType => contentType => + contentType.EndsWith("json", StringComparison.InvariantCultureIgnoreCase) || + contentType.EndsWith("javascript", StringComparison.InvariantCultureIgnoreCase); + + public string ContentType + { + get { return _contentType; } + set { throw new InvalidOperationException("Not allowed to set content type."); } + } + + public DataFormat DataFormat => DataFormat.Json; + } + /// <summary> + /// Provides a default implementation of an Api client (both synchronous and asynchronous implementations), + /// encapsulating general REST accessor use cases. + /// </summary> + public partial class ApiClient : ISynchronousClient, IAsynchronousClient + { + private readonly string _baseUrl; + + /// <summary> + /// Specifies the settings on a <see cref="JsonSerializer" /> object. + /// These settings can be adjusted to accommodate custom serialization rules. + /// </summary> + public JsonSerializerSettings SerializerSettings { get; set; } = new JsonSerializerSettings + { + // OpenAPI generated types generally hide default constructors. + ConstructorHandling = ConstructorHandling.AllowNonPublicDefaultConstructor, + ContractResolver = new DefaultContractResolver + { + NamingStrategy = new CamelCaseNamingStrategy + { + OverrideSpecifiedNames = false + } + } + }; + + /// <summary> + /// Allows for extending request processing for <see cref="ApiClient"/> generated code. + /// </summary> + /// <param name="request">The RestSharp request object</param> + partial void InterceptRequest(RestRequest request); + + /// <summary> + /// Allows for extending response processing for <see cref="ApiClient"/> generated code. + /// </summary> + /// <param name="request">The RestSharp request object</param> + /// <param name="response">The RestSharp response object</param> + partial void InterceptResponse(RestRequest request, RestResponse response); + + /// <summary> + /// Initializes a new instance of the <see cref="ApiClient" />, defaulting to the global configurations' base url. + /// </summary> + public ApiClient() + { + _baseUrl = Org.OpenAPITools.Client.GlobalConfiguration.Instance.BasePath; + } + + /// <summary> + /// Initializes a new instance of the <see cref="ApiClient" /> + /// </summary> + /// <param name="basePath">The target service's base path in URL format.</param> + /// <exception cref="ArgumentException"></exception> + public ApiClient(string basePath) + { + if (string.IsNullOrEmpty(basePath)) + throw new ArgumentException("basePath cannot be empty"); + + _baseUrl = basePath; + } + + /// <summary> + /// Constructs the RestSharp version of an http method + /// </summary> + /// <param name="method">Swagger Client Custom HttpMethod</param> + /// <returns>RestSharp's HttpMethod instance.</returns> + /// <exception cref="ArgumentOutOfRangeException"></exception> + private RestSharpMethod Method(HttpMethod method) + { + RestSharpMethod other; + switch (method) + { + case HttpMethod.Get: + other = RestSharpMethod.Get; + break; + case HttpMethod.Post: + other = RestSharpMethod.Post; + break; + case HttpMethod.Put: + other = RestSharpMethod.Put; + break; + case HttpMethod.Delete: + other = RestSharpMethod.Delete; + break; + case HttpMethod.Head: + other = RestSharpMethod.Head; + break; + case HttpMethod.Options: + other = RestSharpMethod.Options; + break; + case HttpMethod.Patch: + other = RestSharpMethod.Patch; + break; + default: + throw new ArgumentOutOfRangeException("method", method, null); + } + + return other; + } + + /// <summary> + /// Provides all logic for constructing a new RestSharp <see cref="RestRequest"/>. + /// At this point, all information for querying the service is known. Here, it is simply + /// mapped into the RestSharp request. + /// </summary> + /// <param name="method">The http verb.</param> + /// <param name="path">The target path (or resource).</param> + /// <param name="options">The additional request options.</param> + /// <param name="configuration">A per-request configuration object. It is assumed that any merge with + /// GlobalConfiguration has been done before calling this method.</param> + /// <returns>[private] A new RestRequest instance.</returns> + /// <exception cref="ArgumentNullException"></exception> + private RestRequest NewRequest( + HttpMethod method, + string path, + RequestOptions options, + IReadableConfiguration configuration) + { + if (path == null) throw new ArgumentNullException("path"); + if (options == null) throw new ArgumentNullException("options"); + if (configuration == null) throw new ArgumentNullException("configuration"); + + RestRequest request = new RestRequest(path, Method(method)); + + if (options.PathParameters != null) + { + foreach (var pathParam in options.PathParameters) + { + request.AddParameter(pathParam.Key, pathParam.Value, ParameterType.UrlSegment); + } + } + + if (options.QueryParameters != null) + { + foreach (var queryParam in options.QueryParameters) + { + foreach (var value in queryParam.Value) + { + request.AddQueryParameter(queryParam.Key, value); + } + } + } + + if (configuration.DefaultHeaders != null) + { + foreach (var headerParam in configuration.DefaultHeaders) + { + request.AddHeader(headerParam.Key, headerParam.Value); + } + } + + if (options.HeaderParameters != null) + { + foreach (var headerParam in options.HeaderParameters) + { + foreach (var value in headerParam.Value) + { + request.AddHeader(headerParam.Key, value); + } + } + } + + if (options.FormParameters != null) + { + foreach (var formParam in options.FormParameters) + { + request.AddParameter(formParam.Key, formParam.Value); + } + } + + if (options.Data != null) + { + if (options.Data is Stream stream) + { + var contentType = "application/octet-stream"; + if (options.HeaderParameters != null) + { + var contentTypes = options.HeaderParameters["Content-Type"]; + contentType = contentTypes[0]; + } + + var bytes = ClientUtils.ReadAsBytes(stream); + request.AddParameter(contentType, bytes, ParameterType.RequestBody); + } + else + { + if (options.HeaderParameters != null) + { + var contentTypes = options.HeaderParameters["Content-Type"]; + if (contentTypes == null || contentTypes.Any(header => header.Contains("application/json"))) + { + request.RequestFormat = DataFormat.Json; + } + else + { + // TODO: Generated client user should add additional handlers. RestSharp only supports XML and JSON, with XML as default. + } + } + else + { + // Here, we'll assume JSON APIs are more common. XML can be forced by adding produces/consumes to openapi spec explicitly. + request.RequestFormat = DataFormat.Json; + } + + request.AddJsonBody(options.Data); + } + } + + if (options.FileParameters != null) + { + foreach (var fileParam in options.FileParameters) + { + foreach (var file in fileParam.Value) + { + var bytes = ClientUtils.ReadAsBytes(file); + var fileStream = file as FileStream; + if (fileStream != null) + request.AddFile(fileParam.Key, bytes, System.IO.Path.GetFileName(fileStream.Name)); + else + request.AddFile(fileParam.Key, bytes, "no_file_name_provided"); + } + } + } + + return request; + } + + private ApiResponse<T> ToApiResponse<T>(RestResponse<T> response) + { + T result = response.Data; + string rawContent = response.Content; + + var transformed = new ApiResponse<T>(response.StatusCode, new Multimap<string, string>(), result, rawContent) + { + ErrorText = response.ErrorMessage, + Cookies = new List<Cookie>() + }; + + if (response.Headers != null) + { + foreach (var responseHeader in response.Headers) + { + transformed.Headers.Add(responseHeader.Name, ClientUtils.ParameterToString(responseHeader.Value)); + } + } + + if (response.ContentHeaders != null) + { + foreach (var responseHeader in response.ContentHeaders) + { + transformed.Headers.Add(responseHeader.Name, ClientUtils.ParameterToString(responseHeader.Value)); + } + } + + if (response.Cookies != null) + { + foreach (var responseCookies in response.Cookies.Cast<Cookie>()) + { + transformed.Cookies.Add( + new Cookie( + responseCookies.Name, + responseCookies.Value, + responseCookies.Path, + responseCookies.Domain) + ); + } + } + + return transformed; + } + + private ApiResponse<T> Exec<T>(RestRequest req, RequestOptions options, IReadableConfiguration configuration) + { + var baseUrl = configuration.GetOperationServerUrl(options.Operation, options.OperationIndex) ?? _baseUrl; + + var cookies = new CookieContainer(); + + if (options.Cookies != null && options.Cookies.Count > 0) + { + foreach (var cookie in options.Cookies) + { + cookies.Add(new Cookie(cookie.Name, cookie.Value)); + } + } + + var clientOptions = new RestClientOptions(baseUrl) + { + ClientCertificates = configuration.ClientCertificates, + CookieContainer = cookies, + MaxTimeout = configuration.Timeout, + Proxy = configuration.Proxy, + UserAgent = configuration.UserAgent + }; + + RestClient client = new RestClient(clientOptions) + .UseSerializer(() => new CustomJsonCodec(SerializerSettings, configuration)); + + InterceptRequest(req); + + RestResponse<T> response; + if (RetryConfiguration.RetryPolicy != null) + { + var policy = RetryConfiguration.RetryPolicy; + var policyResult = policy.ExecuteAndCapture(() => client.Execute(req)); + response = (policyResult.Outcome == OutcomeType.Successful) ? client.Deserialize<T>(policyResult.Result) : new RestResponse<T> + { + Request = req, + ErrorException = policyResult.FinalException + }; + } + else + { + response = client.Execute<T>(req); + } + + // if the response type is oneOf/anyOf, call FromJSON to deserialize the data + if (typeof(Org.OpenAPITools.Model.AbstractOpenAPISchema).IsAssignableFrom(typeof(T))) + { + try + { + response.Data = (T) typeof(T).GetMethod("FromJson").Invoke(null, new object[] { response.Content }); + } + catch (Exception ex) + { + throw ex.InnerException != null ? ex.InnerException : ex; + } + } + else if (typeof(T).Name == "Stream") // for binary response + { + response.Data = (T)(object)new MemoryStream(response.RawBytes); + } + else if (typeof(T).Name == "Byte[]") // for byte response + { + response.Data = (T)(object)response.RawBytes; + } + else if (typeof(T).Name == "String") // for string response + { + response.Data = (T)(object)response.Content; + } + + InterceptResponse(req, response); + + var result = ToApiResponse(response); + if (response.ErrorMessage != null) + { + result.ErrorText = response.ErrorMessage; + } + + if (response.Cookies != null && response.Cookies.Count > 0) + { + if (result.Cookies == null) result.Cookies = new List<Cookie>(); + foreach (var restResponseCookie in response.Cookies.Cast<Cookie>()) + { + var cookie = new Cookie( + restResponseCookie.Name, + restResponseCookie.Value, + restResponseCookie.Path, + restResponseCookie.Domain + ) + { + Comment = restResponseCookie.Comment, + CommentUri = restResponseCookie.CommentUri, + Discard = restResponseCookie.Discard, + Expired = restResponseCookie.Expired, + Expires = restResponseCookie.Expires, + HttpOnly = restResponseCookie.HttpOnly, + Port = restResponseCookie.Port, + Secure = restResponseCookie.Secure, + Version = restResponseCookie.Version + }; + + result.Cookies.Add(cookie); + } + } + return result; + } + + private async Task<ApiResponse<T>> ExecAsync<T>(RestRequest req, RequestOptions options, IReadableConfiguration configuration, System.Threading.CancellationToken cancellationToken = default(System.Threading.CancellationToken)) + { + var baseUrl = configuration.GetOperationServerUrl(options.Operation, options.OperationIndex) ?? _baseUrl; + + var clientOptions = new RestClientOptions(baseUrl) + { + ClientCertificates = configuration.ClientCertificates, + MaxTimeout = configuration.Timeout, + Proxy = configuration.Proxy, + UserAgent = configuration.UserAgent + }; + + RestClient client = new RestClient(clientOptions) + .UseSerializer(() => new CustomJsonCodec(SerializerSettings, configuration)); + + InterceptRequest(req); + + RestResponse<T> response; + if (RetryConfiguration.AsyncRetryPolicy != null) + { + var policy = RetryConfiguration.AsyncRetryPolicy; + var policyResult = await policy.ExecuteAndCaptureAsync((ct) => client.ExecuteAsync(req, ct), cancellationToken).ConfigureAwait(false); + response = (policyResult.Outcome == OutcomeType.Successful) ? client.Deserialize<T>(policyResult.Result) : new RestResponse<T> + { + Request = req, + ErrorException = policyResult.FinalException + }; + } + else + { + response = await client.ExecuteAsync<T>(req, cancellationToken).ConfigureAwait(false); + } + + // if the response type is oneOf/anyOf, call FromJSON to deserialize the data + if (typeof(Org.OpenAPITools.Model.AbstractOpenAPISchema).IsAssignableFrom(typeof(T))) + { + response.Data = (T) typeof(T).GetMethod("FromJson").Invoke(null, new object[] { response.Content }); + } + else if (typeof(T).Name == "Stream") // for binary response + { + response.Data = (T)(object)new MemoryStream(response.RawBytes); + } + else if (typeof(T).Name == "Byte[]") // for byte response + { + response.Data = (T)(object)response.RawBytes; + } + + InterceptResponse(req, response); + + var result = ToApiResponse(response); + if (response.ErrorMessage != null) + { + result.ErrorText = response.ErrorMessage; + } + + if (response.Cookies != null && response.Cookies.Count > 0) + { + if (result.Cookies == null) result.Cookies = new List<Cookie>(); + foreach (var restResponseCookie in response.Cookies.Cast<Cookie>()) + { + var cookie = new Cookie( + restResponseCookie.Name, + restResponseCookie.Value, + restResponseCookie.Path, + restResponseCookie.Domain + ) + { + Comment = restResponseCookie.Comment, + CommentUri = restResponseCookie.CommentUri, + Discard = restResponseCookie.Discard, + Expired = restResponseCookie.Expired, + Expires = restResponseCookie.Expires, + HttpOnly = restResponseCookie.HttpOnly, + Port = restResponseCookie.Port, + Secure = restResponseCookie.Secure, + Version = restResponseCookie.Version + }; + + result.Cookies.Add(cookie); + } + } + return result; + } + + #region IAsynchronousClient + /// <summary> + /// Make a HTTP GET request (async). + /// </summary> + /// <param name="path">The target path (or resource).</param> + /// <param name="options">The additional request options.</param> + /// <param name="configuration">A per-request configuration object. It is assumed that any merge with + /// GlobalConfiguration has been done before calling this method.</param> + /// <param name="cancellationToken">Token that enables callers to cancel the request.</param> + /// <returns>A Task containing ApiResponse</returns> + public Task<ApiResponse<T>> GetAsync<T>(string path, RequestOptions options, IReadableConfiguration configuration = null, System.Threading.CancellationToken cancellationToken = default(System.Threading.CancellationToken)) + { + var config = configuration ?? GlobalConfiguration.Instance; + return ExecAsync<T>(NewRequest(HttpMethod.Get, path, options, config), options, config, cancellationToken); + } + + /// <summary> + /// Make a HTTP POST request (async). + /// </summary> + /// <param name="path">The target path (or resource).</param> + /// <param name="options">The additional request options.</param> + /// <param name="configuration">A per-request configuration object. It is assumed that any merge with + /// GlobalConfiguration has been done before calling this method.</param> + /// <param name="cancellationToken">Token that enables callers to cancel the request.</param> + /// <returns>A Task containing ApiResponse</returns> + public Task<ApiResponse<T>> PostAsync<T>(string path, RequestOptions options, IReadableConfiguration configuration = null, System.Threading.CancellationToken cancellationToken = default(System.Threading.CancellationToken)) + { + var config = configuration ?? GlobalConfiguration.Instance; + return ExecAsync<T>(NewRequest(HttpMethod.Post, path, options, config), options, config, cancellationToken); + } + + /// <summary> + /// Make a HTTP PUT request (async). + /// </summary> + /// <param name="path">The target path (or resource).</param> + /// <param name="options">The additional request options.</param> + /// <param name="configuration">A per-request configuration object. It is assumed that any merge with + /// GlobalConfiguration has been done before calling this method.</param> + /// <param name="cancellationToken">Token that enables callers to cancel the request.</param> + /// <returns>A Task containing ApiResponse</returns> + public Task<ApiResponse<T>> PutAsync<T>(string path, RequestOptions options, IReadableConfiguration configuration = null, System.Threading.CancellationToken cancellationToken = default(System.Threading.CancellationToken)) + { + var config = configuration ?? GlobalConfiguration.Instance; + return ExecAsync<T>(NewRequest(HttpMethod.Put, path, options, config), options, config, cancellationToken); + } + + /// <summary> + /// Make a HTTP DELETE request (async). + /// </summary> + /// <param name="path">The target path (or resource).</param> + /// <param name="options">The additional request options.</param> + /// <param name="configuration">A per-request configuration object. It is assumed that any merge with + /// GlobalConfiguration has been done before calling this method.</param> + /// <param name="cancellationToken">Token that enables callers to cancel the request.</param> + /// <returns>A Task containing ApiResponse</returns> + public Task<ApiResponse<T>> DeleteAsync<T>(string path, RequestOptions options, IReadableConfiguration configuration = null, System.Threading.CancellationToken cancellationToken = default(System.Threading.CancellationToken)) + { + var config = configuration ?? GlobalConfiguration.Instance; + return ExecAsync<T>(NewRequest(HttpMethod.Delete, path, options, config), options, config, cancellationToken); + } + + /// <summary> + /// Make a HTTP HEAD request (async). + /// </summary> + /// <param name="path">The target path (or resource).</param> + /// <param name="options">The additional request options.</param> + /// <param name="configuration">A per-request configuration object. It is assumed that any merge with + /// GlobalConfiguration has been done before calling this method.</param> + /// <param name="cancellationToken">Token that enables callers to cancel the request.</param> + /// <returns>A Task containing ApiResponse</returns> + public Task<ApiResponse<T>> HeadAsync<T>(string path, RequestOptions options, IReadableConfiguration configuration = null, System.Threading.CancellationToken cancellationToken = default(System.Threading.CancellationToken)) + { + var config = configuration ?? GlobalConfiguration.Instance; + return ExecAsync<T>(NewRequest(HttpMethod.Head, path, options, config), options, config, cancellationToken); + } + + /// <summary> + /// Make a HTTP OPTION request (async). + /// </summary> + /// <param name="path">The target path (or resource).</param> + /// <param name="options">The additional request options.</param> + /// <param name="configuration">A per-request configuration object. It is assumed that any merge with + /// GlobalConfiguration has been done before calling this method.</param> + /// <param name="cancellationToken">Token that enables callers to cancel the request.</param> + /// <returns>A Task containing ApiResponse</returns> + public Task<ApiResponse<T>> OptionsAsync<T>(string path, RequestOptions options, IReadableConfiguration configuration = null, System.Threading.CancellationToken cancellationToken = default(System.Threading.CancellationToken)) + { + var config = configuration ?? GlobalConfiguration.Instance; + return ExecAsync<T>(NewRequest(HttpMethod.Options, path, options, config), options, config, cancellationToken); + } + + /// <summary> + /// Make a HTTP PATCH request (async). + /// </summary> + /// <param name="path">The target path (or resource).</param> + /// <param name="options">The additional request options.</param> + /// <param name="configuration">A per-request configuration object. It is assumed that any merge with + /// GlobalConfiguration has been done before calling this method.</param> + /// <param name="cancellationToken">Token that enables callers to cancel the request.</param> + /// <returns>A Task containing ApiResponse</returns> + public Task<ApiResponse<T>> PatchAsync<T>(string path, RequestOptions options, IReadableConfiguration configuration = null, System.Threading.CancellationToken cancellationToken = default(System.Threading.CancellationToken)) + { + var config = configuration ?? GlobalConfiguration.Instance; + return ExecAsync<T>(NewRequest(HttpMethod.Patch, path, options, config), options, config, cancellationToken); + } + #endregion IAsynchronousClient + + #region ISynchronousClient + /// <summary> + /// Make a HTTP GET request (synchronous). + /// </summary> + /// <param name="path">The target path (or resource).</param> + /// <param name="options">The additional request options.</param> + /// <param name="configuration">A per-request configuration object. It is assumed that any merge with + /// GlobalConfiguration has been done before calling this method.</param> + /// <returns>A Task containing ApiResponse</returns> + public ApiResponse<T> Get<T>(string path, RequestOptions options, IReadableConfiguration configuration = null) + { + var config = configuration ?? GlobalConfiguration.Instance; + return Exec<T>(NewRequest(HttpMethod.Get, path, options, config), options, config); + } + + /// <summary> + /// Make a HTTP POST request (synchronous). + /// </summary> + /// <param name="path">The target path (or resource).</param> + /// <param name="options">The additional request options.</param> + /// <param name="configuration">A per-request configuration object. It is assumed that any merge with + /// GlobalConfiguration has been done before calling this method.</param> + /// <returns>A Task containing ApiResponse</returns> + public ApiResponse<T> Post<T>(string path, RequestOptions options, IReadableConfiguration configuration = null) + { + var config = configuration ?? GlobalConfiguration.Instance; + return Exec<T>(NewRequest(HttpMethod.Post, path, options, config), options, config); + } + + /// <summary> + /// Make a HTTP PUT request (synchronous). + /// </summary> + /// <param name="path">The target path (or resource).</param> + /// <param name="options">The additional request options.</param> + /// <param name="configuration">A per-request configuration object. It is assumed that any merge with + /// GlobalConfiguration has been done before calling this method.</param> + /// <returns>A Task containing ApiResponse</returns> + public ApiResponse<T> Put<T>(string path, RequestOptions options, IReadableConfiguration configuration = null) + { + var config = configuration ?? GlobalConfiguration.Instance; + return Exec<T>(NewRequest(HttpMethod.Put, path, options, config), options, config); + } + + /// <summary> + /// Make a HTTP DELETE request (synchronous). + /// </summary> + /// <param name="path">The target path (or resource).</param> + /// <param name="options">The additional request options.</param> + /// <param name="configuration">A per-request configuration object. It is assumed that any merge with + /// GlobalConfiguration has been done before calling this method.</param> + /// <returns>A Task containing ApiResponse</returns> + public ApiResponse<T> Delete<T>(string path, RequestOptions options, IReadableConfiguration configuration = null) + { + var config = configuration ?? GlobalConfiguration.Instance; + return Exec<T>(NewRequest(HttpMethod.Delete, path, options, config), options, config); + } + + /// <summary> + /// Make a HTTP HEAD request (synchronous). + /// </summary> + /// <param name="path">The target path (or resource).</param> + /// <param name="options">The additional request options.</param> + /// <param name="configuration">A per-request configuration object. It is assumed that any merge with + /// GlobalConfiguration has been done before calling this method.</param> + /// <returns>A Task containing ApiResponse</returns> + public ApiResponse<T> Head<T>(string path, RequestOptions options, IReadableConfiguration configuration = null) + { + var config = configuration ?? GlobalConfiguration.Instance; + return Exec<T>(NewRequest(HttpMethod.Head, path, options, config), options, config); + } + + /// <summary> + /// Make a HTTP OPTION request (synchronous). + /// </summary> + /// <param name="path">The target path (or resource).</param> + /// <param name="options">The additional request options.</param> + /// <param name="configuration">A per-request configuration object. It is assumed that any merge with + /// GlobalConfiguration has been done before calling this method.</param> + /// <returns>A Task containing ApiResponse</returns> + public ApiResponse<T> Options<T>(string path, RequestOptions options, IReadableConfiguration configuration = null) + { + var config = configuration ?? GlobalConfiguration.Instance; + return Exec<T>(NewRequest(HttpMethod.Options, path, options, config), options, config); + } + + /// <summary> + /// Make a HTTP PATCH request (synchronous). + /// </summary> + /// <param name="path">The target path (or resource).</param> + /// <param name="options">The additional request options.</param> + /// <param name="configuration">A per-request configuration object. It is assumed that any merge with + /// GlobalConfiguration has been done before calling this method.</param> + /// <returns>A Task containing ApiResponse</returns> + public ApiResponse<T> Patch<T>(string path, RequestOptions options, IReadableConfiguration configuration = null) + { + var config = configuration ?? GlobalConfiguration.Instance; + return Exec<T>(NewRequest(HttpMethod.Patch, path, options, config), options, config); + } + #endregion ISynchronousClient + } +} diff --git a/src/OpenApiGeneratedConnector/src/Org.OpenAPITools/Client/ApiException.cs b/src/OpenApiGeneratedConnector/src/Org.OpenAPITools/Client/ApiException.cs new file mode 100644 index 0000000000000000000000000000000000000000..7044ec96e8efba560fa3726d12fe984f927b59d7 --- /dev/null +++ b/src/OpenApiGeneratedConnector/src/Org.OpenAPITools/Client/ApiException.cs @@ -0,0 +1,65 @@ +/* + * Metadata Extractor API + * + * This API extracts RDF triples from files + * + * The version of the OpenAPI document: 0.1.1 + * Generated by: https://github.com/openapitools/openapi-generator.git + */ + +namespace Org.OpenAPITools.Client +{ + /// <summary> + /// API Exception + /// </summary> + public class ApiException : Exception + { + /// <summary> + /// Gets or sets the error code (HTTP status code) + /// </summary> + /// <value>The error code (HTTP status code).</value> + public int ErrorCode { get; set; } + + /// <summary> + /// Gets or sets the error content (body json object) + /// </summary> + /// <value>The error content (Http response body).</value> + public object ErrorContent { get; private set; } + + /// <summary> + /// Gets or sets the HTTP headers + /// </summary> + /// <value>HTTP headers</value> + public Multimap<string, string> Headers { get; private set; } + + /// <summary> + /// Initializes a new instance of the <see cref="ApiException"/> class. + /// </summary> + public ApiException() { } + + /// <summary> + /// Initializes a new instance of the <see cref="ApiException"/> class. + /// </summary> + /// <param name="errorCode">HTTP status code.</param> + /// <param name="message">Error message.</param> + public ApiException(int errorCode, string message) : base(message) + { + this.ErrorCode = errorCode; + } + + /// <summary> + /// Initializes a new instance of the <see cref="ApiException"/> class. + /// </summary> + /// <param name="errorCode">HTTP status code.</param> + /// <param name="message">Error message.</param> + /// <param name="errorContent">Error content.</param> + /// <param name="headers">HTTP Headers.</param> + public ApiException(int errorCode, string message, object errorContent = null, Multimap<string, string> headers = null) : base(message) + { + this.ErrorCode = errorCode; + this.ErrorContent = errorContent; + this.Headers = headers; + } + } + +} diff --git a/src/OpenApiGeneratedConnector/src/Org.OpenAPITools/Client/ApiResponse.cs b/src/OpenApiGeneratedConnector/src/Org.OpenAPITools/Client/ApiResponse.cs new file mode 100644 index 0000000000000000000000000000000000000000..e94761bc7c2c4698dfa95cf5be37f958f088de49 --- /dev/null +++ b/src/OpenApiGeneratedConnector/src/Org.OpenAPITools/Client/ApiResponse.cs @@ -0,0 +1,164 @@ +/* + * Metadata Extractor API + * + * This API extracts RDF triples from files + * + * The version of the OpenAPI document: 0.1.1 + * Generated by: https://github.com/openapitools/openapi-generator.git + */ + + +using System.Net; + +namespace Org.OpenAPITools.Client +{ + /// <summary> + /// Provides a non-generic contract for the ApiResponse wrapper. + /// </summary> + public interface IApiResponse + { + /// <summary> + /// The data type of <see cref="Content"/> + /// </summary> + Type ResponseType { get; } + + /// <summary> + /// The content of this response + /// </summary> + Object Content { get; } + + /// <summary> + /// Gets or sets the status code (HTTP status code) + /// </summary> + /// <value>The status code.</value> + HttpStatusCode StatusCode { get; } + + /// <summary> + /// Gets or sets the HTTP headers + /// </summary> + /// <value>HTTP headers</value> + Multimap<string, string> Headers { get; } + + /// <summary> + /// Gets or sets any error text defined by the calling client. + /// </summary> + string ErrorText { get; set; } + + /// <summary> + /// Gets or sets any cookies passed along on the response. + /// </summary> + List<Cookie> Cookies { get; set; } + + /// <summary> + /// The raw content of this response + /// </summary> + string RawContent { get; } + } + + /// <summary> + /// API Response + /// </summary> + public class ApiResponse<T> : IApiResponse + { + #region Properties + + /// <summary> + /// Gets or sets the status code (HTTP status code) + /// </summary> + /// <value>The status code.</value> + public HttpStatusCode StatusCode { get; } + + /// <summary> + /// Gets or sets the HTTP headers + /// </summary> + /// <value>HTTP headers</value> + public Multimap<string, string> Headers { get; } + + /// <summary> + /// Gets or sets the data (parsed HTTP body) + /// </summary> + /// <value>The data.</value> + public T Data { get; } + + /// <summary> + /// Gets or sets any error text defined by the calling client. + /// </summary> + public string ErrorText { get; set; } + + /// <summary> + /// Gets or sets any cookies passed along on the response. + /// </summary> + public List<Cookie> Cookies { get; set; } + + /// <summary> + /// The content of this response + /// </summary> + public Type ResponseType + { + get { return typeof(T); } + } + + /// <summary> + /// The data type of <see cref="Content"/> + /// </summary> + public object Content + { + get { return Data; } + } + + /// <summary> + /// The raw content + /// </summary> + public string RawContent { get; } + + #endregion Properties + + #region Constructors + + /// <summary> + /// Initializes a new instance of the <see cref="ApiResponse{T}" /> class. + /// </summary> + /// <param name="statusCode">HTTP status code.</param> + /// <param name="headers">HTTP headers.</param> + /// <param name="data">Data (parsed HTTP body)</param> + /// <param name="rawContent">Raw content.</param> + public ApiResponse(HttpStatusCode statusCode, Multimap<string, string> headers, T data, string rawContent) + { + StatusCode = statusCode; + Headers = headers; + Data = data; + RawContent = rawContent; + } + + /// <summary> + /// Initializes a new instance of the <see cref="ApiResponse{T}" /> class. + /// </summary> + /// <param name="statusCode">HTTP status code.</param> + /// <param name="headers">HTTP headers.</param> + /// <param name="data">Data (parsed HTTP body)</param> + public ApiResponse(HttpStatusCode statusCode, Multimap<string, string> headers, T data) : this(statusCode, headers, data, null) + { + } + + /// <summary> + /// Initializes a new instance of the <see cref="ApiResponse{T}" /> class. + /// </summary> + /// <param name="statusCode">HTTP status code.</param> + /// <param name="data">Data (parsed HTTP body)</param> + /// <param name="rawContent">Raw content.</param> + public ApiResponse(HttpStatusCode statusCode, T data, string rawContent) : this(statusCode, null, data, rawContent) + { + } + + /// <summary> + /// Initializes a new instance of the <see cref="ApiResponse{T}" /> class. + /// </summary> + /// <param name="statusCode">HTTP status code.</param> + /// <param name="data">Data (parsed HTTP body)</param> + public ApiResponse(HttpStatusCode statusCode, T data) : this(statusCode, data, null) + { + } + + #endregion Constructors + } +} diff --git a/src/OpenApiGeneratedConnector/src/Org.OpenAPITools/Client/ClientUtils.cs b/src/OpenApiGeneratedConnector/src/Org.OpenAPITools/Client/ClientUtils.cs new file mode 100644 index 0000000000000000000000000000000000000000..f18d4d0f263180f05c6d46e84d02b61821d06728 --- /dev/null +++ b/src/OpenApiGeneratedConnector/src/Org.OpenAPITools/Client/ClientUtils.cs @@ -0,0 +1,201 @@ +/* + * Metadata Extractor API + * + * This API extracts RDF triples from files + * + * The version of the OpenAPI document: 0.1.1 + * Generated by: https://github.com/openapitools/openapi-generator.git + */ + +using System.Collections; +using System.Globalization; +using System.Text.RegularExpressions; + +namespace Org.OpenAPITools.Client +{ + /// <summary> + /// Utility functions providing some benefit to API client consumers. + /// </summary> + public static class ClientUtils + { + /// <summary> + /// Sanitize filename by removing the path + /// </summary> + /// <param name="filename">Filename</param> + /// <returns>Filename</returns> + public static string SanitizeFilename(string filename) + { + Match match = Regex.Match(filename, @".*[/\\](.*)$"); + return match.Success ? match.Groups[1].Value : filename; + } + + /// <summary> + /// Convert params to key/value pairs. + /// Use collectionFormat to properly format lists and collections. + /// </summary> + /// <param name="collectionFormat">The swagger-supported collection format, one of: csv, tsv, ssv, pipes, multi</param> + /// <param name="name">Key name.</param> + /// <param name="value">Value object.</param> + /// <returns>A multimap of keys with 1..n associated values.</returns> + public static Multimap<string, string> ParameterToMultiMap(string collectionFormat, string name, object value) + { + var parameters = new Multimap<string, string>(); + + if (value is ICollection collection && collectionFormat == "multi") + { + foreach (var item in collection) + { + parameters.Add(name, ParameterToString(item)); + } + } + else if (value is IDictionary dictionary) + { + if (collectionFormat == "deepObject") + { + foreach (DictionaryEntry entry in dictionary) + { + parameters.Add(name + "[" + entry.Key + "]", ParameterToString(entry.Value)); + } + } + else + { + foreach (DictionaryEntry entry in dictionary) + { + parameters.Add(entry.Key.ToString(), ParameterToString(entry.Value)); + } + } + } + else + { + parameters.Add(name, ParameterToString(value)); + } + + return parameters; + } + + /// <summary> + /// If parameter is DateTime, output in a formatted string (default ISO 8601), customizable with Configuration.DateTime. + /// If parameter is a list, join the list with ",". + /// Otherwise just return the string. + /// </summary> + /// <param name="obj">The parameter (header, path, query, form).</param> + /// <param name="configuration">An optional configuration instance, providing formatting options used in processing.</param> + /// <returns>Formatted string.</returns> + public static string ParameterToString(object obj, IReadableConfiguration configuration = null) + { + if (obj is DateTime dateTime) + // Return a formatted date string - Can be customized with Configuration.DateTimeFormat + // Defaults to an ISO 8601, using the known as a Round-trip date/time pattern ("o") + // https://msdn.microsoft.com/en-us/library/az4se3k1(v=vs.110).aspx#Anchor_8 + // For example: 2009-06-15T13:45:30.0000000 + return dateTime.ToString((configuration ?? GlobalConfiguration.Instance).DateTimeFormat); + if (obj is DateTimeOffset dateTimeOffset) + // Return a formatted date string - Can be customized with Configuration.DateTimeFormat + // Defaults to an ISO 8601, using the known as a Round-trip date/time pattern ("o") + // https://msdn.microsoft.com/en-us/library/az4se3k1(v=vs.110).aspx#Anchor_8 + // For example: 2009-06-15T13:45:30.0000000 + return dateTimeOffset.ToString((configuration ?? GlobalConfiguration.Instance).DateTimeFormat); + if (obj is bool boolean) + return boolean ? "true" : "false"; + if (obj is ICollection collection) + return string.Join(",", collection.Cast<object>()); + + return Convert.ToString(obj, CultureInfo.InvariantCulture); + } + + /// <summary> + /// Serializes the given object when not null. Otherwise return null. + /// </summary> + /// <param name="obj">The object to serialize.</param> + /// <returns>Serialized string.</returns> + public static string Serialize(object obj) + { + return obj != null ? Newtonsoft.Json.JsonConvert.SerializeObject(obj) : null; + } + + /// <summary> + /// Encode string in base64 format. + /// </summary> + /// <param name="text">string to be encoded.</param> + /// <returns>Encoded string.</returns> + public static string Base64Encode(string text) + { + return Convert.ToBase64String(System.Text.Encoding.UTF8.GetBytes(text)); + } + + /// <summary> + /// Convert stream to byte array + /// </summary> + /// <param name="inputStream">Input stream to be converted</param> + /// <returns>Byte array</returns> + public static byte[] ReadAsBytes(Stream inputStream) + { + using (var ms = new MemoryStream()) + { + inputStream.CopyTo(ms); + return ms.ToArray(); + } + } + + /// <summary> + /// Select the Content-Type header's value from the given content-type array: + /// if JSON type exists in the given array, use it; + /// otherwise use the first one defined in 'consumes' + /// </summary> + /// <param name="contentTypes">The Content-Type array to select from.</param> + /// <returns>The Content-Type header to use.</returns> + public static string SelectHeaderContentType(string[] contentTypes) + { + if (contentTypes.Length == 0) + return null; + + foreach (var contentType in contentTypes) + { + if (IsJsonMime(contentType)) + return contentType; + } + + return contentTypes[0]; // use the first content type specified in 'consumes' + } + + /// <summary> + /// Select the Accept header's value from the given accepts array: + /// if JSON exists in the given array, use it; + /// otherwise use all of them (joining into a string) + /// </summary> + /// <param name="accepts">The accepts array to select from.</param> + /// <returns>The Accept header to use.</returns> + public static string SelectHeaderAccept(string[] accepts) + { + if (accepts.Length == 0) + return null; + + if (accepts.Contains("application/json", StringComparer.OrdinalIgnoreCase)) + return "application/json"; + + return string.Join(",", accepts); + } + + /// <summary> + /// Provides a case-insensitive check that a provided content type is a known JSON-like content type. + /// </summary> + public static readonly Regex JsonRegex = new Regex("(?i)^(application/json|[^;/ \t]+/[^;/ \t]+[+]json)[ \t]*(;.*)?$"); + + /// <summary> + /// Check if the given MIME is a JSON MIME. + /// JSON MIME examples: + /// application/json + /// application/json; charset=UTF8 + /// APPLICATION/JSON + /// application/vnd.company+json + /// </summary> + /// <param name="mime">MIME</param> + /// <returns>Returns True if MIME type is json.</returns> + public static bool IsJsonMime(string mime) + { + if (string.IsNullOrWhiteSpace(mime)) return false; + + return JsonRegex.IsMatch(mime) || mime.Equals("application/json-patch+json"); + } + } +} \ No newline at end of file diff --git a/src/OpenApiGeneratedConnector/src/Org.OpenAPITools/Client/Configuration.cs b/src/OpenApiGeneratedConnector/src/Org.OpenAPITools/Client/Configuration.cs new file mode 100644 index 0000000000000000000000000000000000000000..5a8b348500da24ef95772f88c030019117e864c7 --- /dev/null +++ b/src/OpenApiGeneratedConnector/src/Org.OpenAPITools/Client/Configuration.cs @@ -0,0 +1,580 @@ +/* + * Metadata Extractor API + * + * This API extracts RDF triples from files + * + * The version of the OpenAPI document: 0.1.1 + * Generated by: https://github.com/openapitools/openapi-generator.git + */ + + +using System.Collections.Concurrent; +using System.Net; +using System.Security.Cryptography.X509Certificates; + +namespace Org.OpenAPITools.Client +{ + /// <summary> + /// Represents a set of configuration settings + /// </summary> + public class Configuration : IReadableConfiguration + { + #region Constants + + /// <summary> + /// Version of the package. + /// </summary> + /// <value>Version of the package.</value> + public const string Version = "1.0.0"; + + /// <summary> + /// Identifier for ISO 8601 DateTime Format + /// </summary> + /// <remarks>See https://msdn.microsoft.com/en-us/library/az4se3k1(v=vs.110).aspx#Anchor_8 for more information.</remarks> + // ReSharper disable once InconsistentNaming + public const string ISO8601_DATETIME_FORMAT = "o"; + + #endregion Constants + + #region Static Members + + /// <summary> + /// Default creation of exceptions for a given method name and response object + /// </summary> + public static readonly ExceptionFactory DefaultExceptionFactory = (methodName, response) => + { + var status = (int)response.StatusCode; + if (status >= 400) + { + return new ApiException(status, + string.Format("Error calling {0}: {1}", methodName, response.RawContent), + response.RawContent, response.Headers); + } + return null; + }; + + #endregion Static Members + + #region Private Members + + /// <summary> + /// Defines the base path of the target API server. + /// Example: http://localhost:3000/v1/ + /// </summary> + private string _basePath; + + /// <summary> + /// Gets or sets the API key based on the authentication name. + /// This is the key and value comprising the "secret" for accessing an API. + /// </summary> + /// <value>The API key.</value> + private IDictionary<string, string> _apiKey; + + /// <summary> + /// Gets or sets the prefix (e.g. Token) of the API key based on the authentication name. + /// </summary> + /// <value>The prefix of the API key.</value> + private IDictionary<string, string> _apiKeyPrefix; + + private string _dateTimeFormat = ISO8601_DATETIME_FORMAT; + private string _tempFolderPath = Path.GetTempPath(); + + /// <summary> + /// Gets or sets the servers defined in the OpenAPI spec. + /// </summary> + /// <value>The servers</value> + private IList<IReadOnlyDictionary<string, object>> _servers; + + /// <summary> + /// Gets or sets the operation servers defined in the OpenAPI spec. + /// </summary> + /// <value>The operation servers</value> + private IReadOnlyDictionary<string, List<IReadOnlyDictionary<string, object>>> _operationServers; + + #endregion Private Members + + #region Constructors + + /// <summary> + /// Initializes a new instance of the <see cref="Configuration" /> class + /// </summary> + [System.Diagnostics.CodeAnalysis.SuppressMessage("ReSharper", "VirtualMemberCallInConstructor")] + public Configuration() + { + Proxy = null; + UserAgent = WebUtility.UrlEncode("OpenAPI-Generator/1.0.0/csharp"); + BasePath = "http://localhost"; + DefaultHeaders = new ConcurrentDictionary<string, string>(); + ApiKey = new ConcurrentDictionary<string, string>(); + ApiKeyPrefix = new ConcurrentDictionary<string, string>(); + Servers = new List<IReadOnlyDictionary<string, object>>() + { + { + new Dictionary<string, object> { + {"url", ""}, + {"description", "No description provided"}, + } + } + }; + OperationServers = new Dictionary<string, List<IReadOnlyDictionary<string, object>>>() + { + }; + + // Setting Timeout has side effects (forces ApiClient creation). + Timeout = 100000; + } + + /// <summary> + /// Initializes a new instance of the <see cref="Configuration" /> class + /// </summary> + [System.Diagnostics.CodeAnalysis.SuppressMessage("ReSharper", "VirtualMemberCallInConstructor")] + public Configuration( + IDictionary<string, string> defaultHeaders, + IDictionary<string, string> apiKey, + IDictionary<string, string> apiKeyPrefix, + string basePath = "http://localhost") : this() + { + if (string.IsNullOrWhiteSpace(basePath)) + throw new ArgumentException("The provided basePath is invalid.", "basePath"); + if (defaultHeaders == null) + throw new ArgumentNullException("defaultHeaders"); + if (apiKey == null) + throw new ArgumentNullException("apiKey"); + if (apiKeyPrefix == null) + throw new ArgumentNullException("apiKeyPrefix"); + + BasePath = basePath; + + foreach (var keyValuePair in defaultHeaders) + { + DefaultHeaders.Add(keyValuePair); + } + + foreach (var keyValuePair in apiKey) + { + ApiKey.Add(keyValuePair); + } + + foreach (var keyValuePair in apiKeyPrefix) + { + ApiKeyPrefix.Add(keyValuePair); + } + } + + #endregion Constructors + + #region Properties + + /// <summary> + /// Gets or sets the base path for API access. + /// </summary> + public virtual string BasePath { + get { return _basePath; } + set { _basePath = value; } + } + + /// <summary> + /// Gets or sets the default header. + /// </summary> + [Obsolete("Use DefaultHeaders instead.")] + public virtual IDictionary<string, string> DefaultHeader + { + get + { + return DefaultHeaders; + } + set + { + DefaultHeaders = value; + } + } + + /// <summary> + /// Gets or sets the default headers. + /// </summary> + public virtual IDictionary<string, string> DefaultHeaders { get; set; } + + /// <summary> + /// Gets or sets the HTTP timeout (milliseconds) of ApiClient. Default to 100000 milliseconds. + /// </summary> + public virtual int Timeout { get; set; } + + /// <summary> + /// Gets or sets the proxy + /// </summary> + /// <value>Proxy.</value> + public virtual WebProxy Proxy { get; set; } + + /// <summary> + /// Gets or sets the HTTP user agent. + /// </summary> + /// <value>Http user agent.</value> + public virtual string UserAgent { get; set; } + + /// <summary> + /// Gets or sets the username (HTTP basic authentication). + /// </summary> + /// <value>The username.</value> + public virtual string Username { get; set; } + + /// <summary> + /// Gets or sets the password (HTTP basic authentication). + /// </summary> + /// <value>The password.</value> + public virtual string Password { get; set; } + + /// <summary> + /// Gets the API key with prefix. + /// </summary> + /// <param name="apiKeyIdentifier">API key identifier (authentication scheme).</param> + /// <returns>API key with prefix.</returns> + public string GetApiKeyWithPrefix(string apiKeyIdentifier) + { + string apiKeyValue; + ApiKey.TryGetValue(apiKeyIdentifier, out apiKeyValue); + string apiKeyPrefix; + if (ApiKeyPrefix.TryGetValue(apiKeyIdentifier, out apiKeyPrefix)) + { + return apiKeyPrefix + " " + apiKeyValue; + } + + return apiKeyValue; + } + + /// <summary> + /// Gets or sets certificate collection to be sent with requests. + /// </summary> + /// <value>X509 Certificate collection.</value> + public X509CertificateCollection ClientCertificates { get; set; } + + /// <summary> + /// Gets or sets the access token for OAuth2 authentication. + /// + /// This helper property simplifies code generation. + /// </summary> + /// <value>The access token.</value> + public virtual string AccessToken { get; set; } + + /// <summary> + /// Gets or sets the temporary folder path to store the files downloaded from the server. + /// </summary> + /// <value>Folder path.</value> + public virtual string TempFolderPath + { + get { return _tempFolderPath; } + + set + { + if (string.IsNullOrEmpty(value)) + { + _tempFolderPath = Path.GetTempPath(); + return; + } + + // create the directory if it does not exist + if (!Directory.Exists(value)) + { + Directory.CreateDirectory(value); + } + + // check if the path contains directory separator at the end + if (value[value.Length - 1] == Path.DirectorySeparatorChar) + { + _tempFolderPath = value; + } + else + { + _tempFolderPath = value + Path.DirectorySeparatorChar; + } + } + } + + /// <summary> + /// Gets or sets the date time format used when serializing in the ApiClient + /// By default, it's set to ISO 8601 - "o", for others see: + /// https://msdn.microsoft.com/en-us/library/az4se3k1(v=vs.110).aspx + /// and https://msdn.microsoft.com/en-us/library/8kb3ddd4(v=vs.110).aspx + /// No validation is done to ensure that the string you're providing is valid + /// </summary> + /// <value>The DateTimeFormat string</value> + public virtual string DateTimeFormat + { + get { return _dateTimeFormat; } + set + { + if (string.IsNullOrEmpty(value)) + { + // Never allow a blank or null string, go back to the default + _dateTimeFormat = ISO8601_DATETIME_FORMAT; + return; + } + + // Caution, no validation when you choose date time format other than ISO 8601 + // Take a look at the above links + _dateTimeFormat = value; + } + } + + /// <summary> + /// Gets or sets the prefix (e.g. Token) of the API key based on the authentication name. + /// + /// Whatever you set here will be prepended to the value defined in AddApiKey. + /// + /// An example invocation here might be: + /// <example> + /// ApiKeyPrefix["Authorization"] = "Bearer"; + /// </example> + /// … where ApiKey["Authorization"] would then be used to set the value of your bearer token. + /// + /// <remarks> + /// OAuth2 workflows should set tokens via AccessToken. + /// </remarks> + /// </summary> + /// <value>The prefix of the API key.</value> + public virtual IDictionary<string, string> ApiKeyPrefix + { + get { return _apiKeyPrefix; } + set + { + if (value == null) + { + throw new InvalidOperationException("ApiKeyPrefix collection may not be null."); + } + _apiKeyPrefix = value; + } + } + + /// <summary> + /// Gets or sets the API key based on the authentication name. + /// </summary> + /// <value>The API key.</value> + public virtual IDictionary<string, string> ApiKey + { + get { return _apiKey; } + set + { + if (value == null) + { + throw new InvalidOperationException("ApiKey collection may not be null."); + } + _apiKey = value; + } + } + + /// <summary> + /// Gets or sets the servers. + /// </summary> + /// <value>The servers.</value> + public virtual IList<IReadOnlyDictionary<string, object>> Servers + { + get { return _servers; } + set + { + if (value == null) + { + throw new InvalidOperationException("Servers may not be null."); + } + _servers = value; + } + } + + /// <summary> + /// Gets or sets the operation servers. + /// </summary> + /// <value>The operation servers.</value> + public virtual IReadOnlyDictionary<string, List<IReadOnlyDictionary<string, object>>> OperationServers + { + get { return _operationServers; } + set + { + if (value == null) + { + throw new InvalidOperationException("Operation servers may not be null."); + } + _operationServers = value; + } + } + + /// <summary> + /// Returns URL based on server settings without providing values + /// for the variables + /// </summary> + /// <param name="index">Array index of the server settings.</param> + /// <return>The server URL.</return> + public string GetServerUrl(int index) + { + return GetServerUrl(Servers, index, null); + } + + /// <summary> + /// Returns URL based on server settings. + /// </summary> + /// <param name="index">Array index of the server settings.</param> + /// <param name="inputVariables">Dictionary of the variables and the corresponding values.</param> + /// <return>The server URL.</return> + public string GetServerUrl(int index, Dictionary<string, string> inputVariables) + { + return GetServerUrl(Servers, index, inputVariables); + } + + /// <summary> + /// Returns URL based on operation server settings. + /// </summary> + /// <param name="operation">Operation associated with the request path.</param> + /// <param name="index">Array index of the server settings.</param> + /// <return>The operation server URL.</return> + public string GetOperationServerUrl(string operation, int index) + { + return GetOperationServerUrl(operation, index, null); + } + + /// <summary> + /// Returns URL based on operation server settings. + /// </summary> + /// <param name="operation">Operation associated with the request path.</param> + /// <param name="index">Array index of the server settings.</param> + /// <param name="inputVariables">Dictionary of the variables and the corresponding values.</param> + /// <return>The operation server URL.</return> + public string GetOperationServerUrl(string operation, int index, Dictionary<string, string> inputVariables) + { + if (OperationServers.TryGetValue(operation, out var operationServer)) + { + return GetServerUrl(operationServer, index, inputVariables); + } + + return null; + } + + /// <summary> + /// Returns URL based on server settings. + /// </summary> + /// <param name="servers">Dictionary of server settings.</param> + /// <param name="index">Array index of the server settings.</param> + /// <param name="inputVariables">Dictionary of the variables and the corresponding values.</param> + /// <return>The server URL.</return> + private string GetServerUrl(IList<IReadOnlyDictionary<string, object>> servers, int index, Dictionary<string, string> inputVariables) + { + if (index < 0 || index >= servers.Count) + { + throw new InvalidOperationException($"Invalid index {index} when selecting the server. Must be less than {servers.Count}."); + } + + if (inputVariables == null) + { + inputVariables = new Dictionary<string, string>(); + } + + IReadOnlyDictionary<string, object> server = servers[index]; + string url = (string)server["url"]; + + if (server.ContainsKey("variables")) + { + // go through each variable and assign a value + foreach (KeyValuePair<string, object> variable in (IReadOnlyDictionary<string, object>)server["variables"]) + { + + IReadOnlyDictionary<string, object> serverVariables = (IReadOnlyDictionary<string, object>)(variable.Value); + + if (inputVariables.ContainsKey(variable.Key)) + { + if (((List<string>)serverVariables["enum_values"]).Contains(inputVariables[variable.Key])) + { + url = url.Replace("{" + variable.Key + "}", inputVariables[variable.Key]); + } + else + { + throw new InvalidOperationException($"The variable `{variable.Key}` in the server URL has invalid value #{inputVariables[variable.Key]}. Must be {(List<string>)serverVariables["enum_values"]}"); + } + } + else + { + // use default value + url = url.Replace("{" + variable.Key + "}", (string)serverVariables["default_value"]); + } + } + } + + return url; + } + + #endregion Properties + + #region Methods + + /// <summary> + /// Returns a string with essential information for debugging. + /// </summary> + public static string ToDebugReport() + { + string report = "C# SDK (Org.OpenAPITools) Debug Report:\n"; + report += " OS: " + System.Environment.OSVersion + "\n"; + report += " .NET Framework Version: " + System.Environment.Version + "\n"; + report += " Version of the API: 0.1.1\n"; + report += " SDK Package Version: 1.0.0\n"; + + return report; + } + + /// <summary> + /// Add Api Key Header. + /// </summary> + /// <param name="key">Api Key name.</param> + /// <param name="value">Api Key value.</param> + /// <returns></returns> + public void AddApiKey(string key, string value) + { + ApiKey[key] = value; + } + + /// <summary> + /// Sets the API key prefix. + /// </summary> + /// <param name="key">Api Key name.</param> + /// <param name="value">Api Key value.</param> + public void AddApiKeyPrefix(string key, string value) + { + ApiKeyPrefix[key] = value; + } + + #endregion Methods + + #region Static Members + /// <summary> + /// Merge configurations. + /// </summary> + /// <param name="first">First configuration.</param> + /// <param name="second">Second configuration.</param> + /// <return>Merged configuration.</return> + public static IReadableConfiguration MergeConfigurations(IReadableConfiguration first, IReadableConfiguration second) + { + if (second == null) return first ?? GlobalConfiguration.Instance; + + Dictionary<string, string> apiKey = first.ApiKey.ToDictionary(kvp => kvp.Key, kvp => kvp.Value); + Dictionary<string, string> apiKeyPrefix = first.ApiKeyPrefix.ToDictionary(kvp => kvp.Key, kvp => kvp.Value); + Dictionary<string, string> defaultHeaders = first.DefaultHeaders.ToDictionary(kvp => kvp.Key, kvp => kvp.Value); + + foreach (var kvp in second.ApiKey) apiKey[kvp.Key] = kvp.Value; + foreach (var kvp in second.ApiKeyPrefix) apiKeyPrefix[kvp.Key] = kvp.Value; + foreach (var kvp in second.DefaultHeaders) defaultHeaders[kvp.Key] = kvp.Value; + + var config = new Configuration + { + ApiKey = apiKey, + ApiKeyPrefix = apiKeyPrefix, + DefaultHeaders = defaultHeaders, + BasePath = second.BasePath ?? first.BasePath, + Timeout = second.Timeout, + Proxy = second.Proxy ?? first.Proxy, + UserAgent = second.UserAgent ?? first.UserAgent, + Username = second.Username ?? first.Username, + Password = second.Password ?? first.Password, + AccessToken = second.AccessToken ?? first.AccessToken, + TempFolderPath = second.TempFolderPath ?? first.TempFolderPath, + DateTimeFormat = second.DateTimeFormat ?? first.DateTimeFormat, + ClientCertificates = second.ClientCertificates ?? first.ClientCertificates, + }; + return config; + } + #endregion Static Members + } +} diff --git a/src/OpenApiGeneratedConnector/src/Org.OpenAPITools/Client/ExceptionFactory.cs b/src/OpenApiGeneratedConnector/src/Org.OpenAPITools/Client/ExceptionFactory.cs new file mode 100644 index 0000000000000000000000000000000000000000..0d5fda82167a736d9261c94647262e1725710af4 --- /dev/null +++ b/src/OpenApiGeneratedConnector/src/Org.OpenAPITools/Client/ExceptionFactory.cs @@ -0,0 +1,19 @@ +/* + * Metadata Extractor API + * + * This API extracts RDF triples from files + * + * The version of the OpenAPI document: 0.1.1 + * Generated by: https://github.com/openapitools/openapi-generator.git + */ + +namespace Org.OpenAPITools.Client +{ + /// <summary> + /// A delegate to ExceptionFactory method + /// </summary> + /// <param name="methodName">Method name</param> + /// <param name="response">Response</param> + /// <returns>Exceptions</returns> + public delegate Exception ExceptionFactory(string methodName, IApiResponse response); +} diff --git a/src/OpenApiGeneratedConnector/src/Org.OpenAPITools/Client/GlobalConfiguration.cs b/src/OpenApiGeneratedConnector/src/Org.OpenAPITools/Client/GlobalConfiguration.cs new file mode 100644 index 0000000000000000000000000000000000000000..605aee5e073445cb2e1f7eadeafc54d2322c7cf5 --- /dev/null +++ b/src/OpenApiGeneratedConnector/src/Org.OpenAPITools/Client/GlobalConfiguration.cs @@ -0,0 +1,64 @@ +/* + * Metadata Extractor API + * + * This API extracts RDF triples from files + * + * The version of the OpenAPI document: 0.1.1 + * Generated by: https://github.com/openapitools/openapi-generator.git + */ + +namespace Org.OpenAPITools.Client +{ + /// <summary> + /// <see cref="GlobalConfiguration"/> provides a compile-time extension point for globally configuring + /// API Clients. + /// </summary> + /// <remarks> + /// A customized implementation via partial class may reside in another file and may + /// be excluded from automatic generation via a .openapi-generator-ignore file. + /// </remarks> + public partial class GlobalConfiguration : Configuration + { + #region Private Members + + private static readonly object GlobalConfigSync = new { }; + private static IReadableConfiguration _globalConfiguration; + + #endregion Private Members + + #region Constructors + + /// <inheritdoc /> + private GlobalConfiguration() + { + } + + /// <inheritdoc /> + public GlobalConfiguration(IDictionary<string, string> defaultHeader, IDictionary<string, string> apiKey, IDictionary<string, string> apiKeyPrefix, string basePath = "http://localhost:3000/api") : base(defaultHeader, apiKey, apiKeyPrefix, basePath) + { + } + + static GlobalConfiguration() + { + Instance = new GlobalConfiguration(); + } + + #endregion Constructors + + /// <summary> + /// Gets or sets the default Configuration. + /// </summary> + /// <value>Configuration.</value> + public static IReadableConfiguration Instance + { + get { return _globalConfiguration; } + set + { + lock (GlobalConfigSync) + { + _globalConfiguration = value; + } + } + } + } +} diff --git a/src/OpenApiGeneratedConnector/src/Org.OpenAPITools/Client/HttpMethod.cs b/src/OpenApiGeneratedConnector/src/Org.OpenAPITools/Client/HttpMethod.cs new file mode 100644 index 0000000000000000000000000000000000000000..fc1a07fd952bc8bc54e8d5e27fbd171ea1333093 --- /dev/null +++ b/src/OpenApiGeneratedConnector/src/Org.OpenAPITools/Client/HttpMethod.cs @@ -0,0 +1,33 @@ +/* + * Metadata Extractor API + * + * This API extracts RDF triples from files + * + * The version of the OpenAPI document: 0.1.1 + * Generated by: https://github.com/openapitools/openapi-generator.git + */ + + +namespace Org.OpenAPITools.Client +{ + /// <summary> + /// Http methods supported by swagger + /// </summary> + public enum HttpMethod + { + /// <summary>HTTP GET request.</summary> + Get, + /// <summary>HTTP POST request.</summary> + Post, + /// <summary>HTTP PUT request.</summary> + Put, + /// <summary>HTTP DELETE request.</summary> + Delete, + /// <summary>HTTP HEAD request.</summary> + Head, + /// <summary>HTTP OPTIONS request.</summary> + Options, + /// <summary>HTTP PATCH request.</summary> + Patch + } +} diff --git a/src/OpenApiGeneratedConnector/src/Org.OpenAPITools/Client/IApiAccessor.cs b/src/OpenApiGeneratedConnector/src/Org.OpenAPITools/Client/IApiAccessor.cs new file mode 100644 index 0000000000000000000000000000000000000000..927831c5c5a951ecbe29972562f419e59c4f152f --- /dev/null +++ b/src/OpenApiGeneratedConnector/src/Org.OpenAPITools/Client/IApiAccessor.cs @@ -0,0 +1,34 @@ +/* + * Metadata Extractor API + * + * This API extracts RDF triples from files + * + * The version of the OpenAPI document: 0.1.1 + * Generated by: https://github.com/openapitools/openapi-generator.git + */ + +namespace Org.OpenAPITools.Client +{ + /// <summary> + /// Represents configuration aspects required to interact with the API endpoints. + /// </summary> + public interface IApiAccessor + { + /// <summary> + /// Gets or sets the configuration object + /// </summary> + /// <value>An instance of the Configuration</value> + IReadableConfiguration Configuration { get; set; } + + /// <summary> + /// Gets the base path of the API client. + /// </summary> + /// <value>The base path</value> + string GetBasePath(); + + /// <summary> + /// Provides a factory method hook for the creation of exceptions. + /// </summary> + ExceptionFactory ExceptionFactory { get; set; } + } +} diff --git a/src/OpenApiGeneratedConnector/src/Org.OpenAPITools/Client/IAsynchronousClient.cs b/src/OpenApiGeneratedConnector/src/Org.OpenAPITools/Client/IAsynchronousClient.cs new file mode 100644 index 0000000000000000000000000000000000000000..19cdcf1c5ec29f2919a3eb60d9f7255e1192a300 --- /dev/null +++ b/src/OpenApiGeneratedConnector/src/Org.OpenAPITools/Client/IAsynchronousClient.cs @@ -0,0 +1,96 @@ +/* + * Metadata Extractor API + * + * This API extracts RDF triples from files + * + * The version of the OpenAPI document: 0.1.1 + * Generated by: https://github.com/openapitools/openapi-generator.git + */ + +namespace Org.OpenAPITools.Client +{ + /// <summary> + /// Contract for Asynchronous RESTful API interactions. + /// + /// This interface allows consumers to provide a custom API accessor client. + /// </summary> + public interface IAsynchronousClient + { + /// <summary> + /// Executes a non-blocking call to some <paramref name="path"/> using the GET http verb. + /// </summary> + /// <param name="path">The relative path to invoke.</param> + /// <param name="options">The request parameters to pass along to the client.</param> + /// <param name="configuration">Per-request configurable settings.</param> + /// <param name="cancellationToken">Cancellation Token to cancel the request.</param> + /// <typeparam name="T">The return type.</typeparam> + /// <returns>A task eventually representing the response data, decorated with <see cref="ApiResponse{T}"/></returns> + Task<ApiResponse<T>> GetAsync<T>(string path, RequestOptions options, IReadableConfiguration configuration = null, System.Threading.CancellationToken cancellationToken = default(System.Threading.CancellationToken)); + + /// <summary> + /// Executes a non-blocking call to some <paramref name="path"/> using the POST http verb. + /// </summary> + /// <param name="path">The relative path to invoke.</param> + /// <param name="options">The request parameters to pass along to the client.</param> + /// <param name="configuration">Per-request configurable settings.</param> + /// <param name="cancellationToken">Cancellation Token to cancel the request.</param> + /// <typeparam name="T">The return type.</typeparam> + /// <returns>A task eventually representing the response data, decorated with <see cref="ApiResponse{T}"/></returns> + Task<ApiResponse<T>> PostAsync<T>(string path, RequestOptions options, IReadableConfiguration configuration = null, System.Threading.CancellationToken cancellationToken = default(System.Threading.CancellationToken)); + + /// <summary> + /// Executes a non-blocking call to some <paramref name="path"/> using the PUT http verb. + /// </summary> + /// <param name="path">The relative path to invoke.</param> + /// <param name="options">The request parameters to pass along to the client.</param> + /// <param name="configuration">Per-request configurable settings.</param> + /// <param name="cancellationToken">Cancellation Token to cancel the request.</param> + /// <typeparam name="T">The return type.</typeparam> + /// <returns>A task eventually representing the response data, decorated with <see cref="ApiResponse{T}"/></returns> + Task<ApiResponse<T>> PutAsync<T>(string path, RequestOptions options, IReadableConfiguration configuration = null, System.Threading.CancellationToken cancellationToken = default(System.Threading.CancellationToken)); + + /// <summary> + /// Executes a non-blocking call to some <paramref name="path"/> using the DELETE http verb. + /// </summary> + /// <param name="path">The relative path to invoke.</param> + /// <param name="options">The request parameters to pass along to the client.</param> + /// <param name="configuration">Per-request configurable settings.</param> + /// <param name="cancellationToken">Cancellation Token to cancel the request.</param> + /// <typeparam name="T">The return type.</typeparam> + /// <returns>A task eventually representing the response data, decorated with <see cref="ApiResponse{T}"/></returns> + Task<ApiResponse<T>> DeleteAsync<T>(string path, RequestOptions options, IReadableConfiguration configuration = null, System.Threading.CancellationToken cancellationToken = default(System.Threading.CancellationToken)); + + /// <summary> + /// Executes a non-blocking call to some <paramref name="path"/> using the HEAD http verb. + /// </summary> + /// <param name="path">The relative path to invoke.</param> + /// <param name="options">The request parameters to pass along to the client.</param> + /// <param name="configuration">Per-request configurable settings.</param> + /// <param name="cancellationToken">Cancellation Token to cancel the request.</param> + /// <typeparam name="T">The return type.</typeparam> + /// <returns>A task eventually representing the response data, decorated with <see cref="ApiResponse{T}"/></returns> + Task<ApiResponse<T>> HeadAsync<T>(string path, RequestOptions options, IReadableConfiguration configuration = null, System.Threading.CancellationToken cancellationToken = default(System.Threading.CancellationToken)); + + /// <summary> + /// Executes a non-blocking call to some <paramref name="path"/> using the OPTIONS http verb. + /// </summary> + /// <param name="path">The relative path to invoke.</param> + /// <param name="options">The request parameters to pass along to the client.</param> + /// <param name="configuration">Per-request configurable settings.</param> + /// <param name="cancellationToken">Cancellation Token to cancel the request.</param> + /// <typeparam name="T">The return type.</typeparam> + /// <returns>A task eventually representing the response data, decorated with <see cref="ApiResponse{T}"/></returns> + Task<ApiResponse<T>> OptionsAsync<T>(string path, RequestOptions options, IReadableConfiguration configuration = null, System.Threading.CancellationToken cancellationToken = default(System.Threading.CancellationToken)); + + /// <summary> + /// Executes a non-blocking call to some <paramref name="path"/> using the PATCH http verb. + /// </summary> + /// <param name="path">The relative path to invoke.</param> + /// <param name="options">The request parameters to pass along to the client.</param> + /// <param name="configuration">Per-request configurable settings.</param> + /// <param name="cancellationToken">Cancellation Token to cancel the request.</param> + /// <typeparam name="T">The return type.</typeparam> + /// <returns>A task eventually representing the response data, decorated with <see cref="ApiResponse{T}"/></returns> + Task<ApiResponse<T>> PatchAsync<T>(string path, RequestOptions options, IReadableConfiguration configuration = null, System.Threading.CancellationToken cancellationToken = default(System.Threading.CancellationToken)); + } +} diff --git a/src/OpenApiGeneratedConnector/src/Org.OpenAPITools/Client/IReadableConfiguration.cs b/src/OpenApiGeneratedConnector/src/Org.OpenAPITools/Client/IReadableConfiguration.cs new file mode 100644 index 0000000000000000000000000000000000000000..99167b0135007010e69417eb4d7ff497287e915e --- /dev/null +++ b/src/OpenApiGeneratedConnector/src/Org.OpenAPITools/Client/IReadableConfiguration.cs @@ -0,0 +1,127 @@ +/* + * Metadata Extractor API + * + * This API extracts RDF triples from files + * + * The version of the OpenAPI document: 0.1.1 + * Generated by: https://github.com/openapitools/openapi-generator.git + */ + + +using System.Net; +using System.Security.Cryptography.X509Certificates; + +namespace Org.OpenAPITools.Client +{ + /// <summary> + /// Represents a readable-only configuration contract. + /// </summary> + public interface IReadableConfiguration + { + /// <summary> + /// Gets the access token. + /// </summary> + /// <value>Access token.</value> + string AccessToken { get; } + + /// <summary> + /// Gets the API key. + /// </summary> + /// <value>API key.</value> + IDictionary<string, string> ApiKey { get; } + + /// <summary> + /// Gets the API key prefix. + /// </summary> + /// <value>API key prefix.</value> + IDictionary<string, string> ApiKeyPrefix { get; } + + /// <summary> + /// Gets the base path. + /// </summary> + /// <value>Base path.</value> + string BasePath { get; } + + /// <summary> + /// Gets the date time format. + /// </summary> + /// <value>Date time format.</value> + string DateTimeFormat { get; } + + /// <summary> + /// Gets the default header. + /// </summary> + /// <value>Default header.</value> + [Obsolete("Use DefaultHeaders instead.")] + IDictionary<string, string> DefaultHeader { get; } + + /// <summary> + /// Gets the default headers. + /// </summary> + /// <value>Default headers.</value> + IDictionary<string, string> DefaultHeaders { get; } + + /// <summary> + /// Gets the temp folder path. + /// </summary> + /// <value>Temp folder path.</value> + string TempFolderPath { get; } + + /// <summary> + /// Gets the HTTP connection timeout (in milliseconds) + /// </summary> + /// <value>HTTP connection timeout.</value> + int Timeout { get; } + + /// <summary> + /// Gets the proxy. + /// </summary> + /// <value>Proxy.</value> + WebProxy Proxy { get; } + + /// <summary> + /// Gets the user agent. + /// </summary> + /// <value>User agent.</value> + string UserAgent { get; } + + /// <summary> + /// Gets the username. + /// </summary> + /// <value>Username.</value> + string Username { get; } + + /// <summary> + /// Gets the password. + /// </summary> + /// <value>Password.</value> + string Password { get; } + + /// <summary> + /// Get the servers associated with the operation. + /// </summary> + /// <value>Operation servers.</value> + IReadOnlyDictionary<string, List<IReadOnlyDictionary<string, object>>> OperationServers { get; } + + /// <summary> + /// Gets the API key with prefix. + /// </summary> + /// <param name="apiKeyIdentifier">API key identifier (authentication scheme).</param> + /// <returns>API key with prefix.</returns> + string GetApiKeyWithPrefix(string apiKeyIdentifier); + + /// <summary> + /// Gets the Operation server url at the provided index. + /// </summary> + /// <param name="operation">Operation server name.</param> + /// <param name="index">Index of the operation server settings.</param> + /// <returns></returns> + string GetOperationServerUrl(string operation, int index); + + /// <summary> + /// Gets certificate collection to be sent with requests. + /// </summary> + /// <value>X509 Certificate collection.</value> + X509CertificateCollection ClientCertificates { get; } + } +} diff --git a/src/OpenApiGeneratedConnector/src/Org.OpenAPITools/Client/ISynchronousClient.cs b/src/OpenApiGeneratedConnector/src/Org.OpenAPITools/Client/ISynchronousClient.cs new file mode 100644 index 0000000000000000000000000000000000000000..faa8a6cef607d0ab7c27f70e5c76e55b7c7ef33f --- /dev/null +++ b/src/OpenApiGeneratedConnector/src/Org.OpenAPITools/Client/ISynchronousClient.cs @@ -0,0 +1,89 @@ +/* + * Metadata Extractor API + * + * This API extracts RDF triples from files + * + * The version of the OpenAPI document: 0.1.1 + * Generated by: https://github.com/openapitools/openapi-generator.git + */ + +namespace Org.OpenAPITools.Client +{ + /// <summary> + /// Contract for Synchronous RESTful API interactions. + /// + /// This interface allows consumers to provide a custom API accessor client. + /// </summary> + public interface ISynchronousClient + { + /// <summary> + /// Executes a blocking call to some <paramref name="path"/> using the GET http verb. + /// </summary> + /// <param name="path">The relative path to invoke.</param> + /// <param name="options">The request parameters to pass along to the client.</param> + /// <param name="configuration">Per-request configurable settings.</param> + /// <typeparam name="T">The return type.</typeparam> + /// <returns>The response data, decorated with <see cref="ApiResponse{T}"/></returns> + ApiResponse<T> Get<T>(string path, RequestOptions options, IReadableConfiguration configuration = null); + + /// <summary> + /// Executes a blocking call to some <paramref name="path"/> using the POST http verb. + /// </summary> + /// <param name="path">The relative path to invoke.</param> + /// <param name="options">The request parameters to pass along to the client.</param> + /// <param name="configuration">Per-request configurable settings.</param> + /// <typeparam name="T">The return type.</typeparam> + /// <returns>The response data, decorated with <see cref="ApiResponse{T}"/></returns> + ApiResponse<T> Post<T>(string path, RequestOptions options, IReadableConfiguration configuration = null); + + /// <summary> + /// Executes a blocking call to some <paramref name="path"/> using the PUT http verb. + /// </summary> + /// <param name="path">The relative path to invoke.</param> + /// <param name="options">The request parameters to pass along to the client.</param> + /// <param name="configuration">Per-request configurable settings.</param> + /// <typeparam name="T">The return type.</typeparam> + /// <returns>The response data, decorated with <see cref="ApiResponse{T}"/></returns> + ApiResponse<T> Put<T>(string path, RequestOptions options, IReadableConfiguration configuration = null); + + /// <summary> + /// Executes a blocking call to some <paramref name="path"/> using the DELETE http verb. + /// </summary> + /// <param name="path">The relative path to invoke.</param> + /// <param name="options">The request parameters to pass along to the client.</param> + /// <param name="configuration">Per-request configurable settings.</param> + /// <typeparam name="T">The return type.</typeparam> + /// <returns>The response data, decorated with <see cref="ApiResponse{T}"/></returns> + ApiResponse<T> Delete<T>(string path, RequestOptions options, IReadableConfiguration configuration = null); + + /// <summary> + /// Executes a blocking call to some <paramref name="path"/> using the HEAD http verb. + /// </summary> + /// <param name="path">The relative path to invoke.</param> + /// <param name="options">The request parameters to pass along to the client.</param> + /// <param name="configuration">Per-request configurable settings.</param> + /// <typeparam name="T">The return type.</typeparam> + /// <returns>The response data, decorated with <see cref="ApiResponse{T}"/></returns> + ApiResponse<T> Head<T>(string path, RequestOptions options, IReadableConfiguration configuration = null); + + /// <summary> + /// Executes a blocking call to some <paramref name="path"/> using the OPTIONS http verb. + /// </summary> + /// <param name="path">The relative path to invoke.</param> + /// <param name="options">The request parameters to pass along to the client.</param> + /// <param name="configuration">Per-request configurable settings.</param> + /// <typeparam name="T">The return type.</typeparam> + /// <returns>The response data, decorated with <see cref="ApiResponse{T}"/></returns> + ApiResponse<T> Options<T>(string path, RequestOptions options, IReadableConfiguration configuration = null); + + /// <summary> + /// Executes a blocking call to some <paramref name="path"/> using the PATCH http verb. + /// </summary> + /// <param name="path">The relative path to invoke.</param> + /// <param name="options">The request parameters to pass along to the client.</param> + /// <param name="configuration">Per-request configurable settings.</param> + /// <typeparam name="T">The return type.</typeparam> + /// <returns>The response data, decorated with <see cref="ApiResponse{T}"/></returns> + ApiResponse<T> Patch<T>(string path, RequestOptions options, IReadableConfiguration configuration = null); + } +} diff --git a/src/OpenApiGeneratedConnector/src/Org.OpenAPITools/Client/Multimap.cs b/src/OpenApiGeneratedConnector/src/Org.OpenAPITools/Client/Multimap.cs new file mode 100644 index 0000000000000000000000000000000000000000..2c25243d9537df5db9b3675b4e2f96fa958ca7ee --- /dev/null +++ b/src/OpenApiGeneratedConnector/src/Org.OpenAPITools/Client/Multimap.cs @@ -0,0 +1,293 @@ +/* + * Metadata Extractor API + * + * This API extracts RDF triples from files + * + * The version of the OpenAPI document: 0.1.1 + * Generated by: https://github.com/openapitools/openapi-generator.git + */ + + +using System.Collections; + +namespace Org.OpenAPITools.Client +{ + /// <summary> + /// A dictionary in which one key has many associated values. + /// </summary> + /// <typeparam name="TKey">The type of the key</typeparam> + /// <typeparam name="TValue">The type of the value associated with the key.</typeparam> + public class Multimap<TKey, TValue> : IDictionary<TKey, IList<TValue>> + { + #region Private Fields + + private readonly Dictionary<TKey, IList<TValue>> _dictionary; + + #endregion Private Fields + + #region Constructors + + /// <summary> + /// Empty Constructor. + /// </summary> + public Multimap() + { + _dictionary = new Dictionary<TKey, IList<TValue>>(); + } + + /// <summary> + /// Constructor with comparer. + /// </summary> + /// <param name="comparer"></param> + public Multimap(IEqualityComparer<TKey> comparer) + { + _dictionary = new Dictionary<TKey, IList<TValue>>(comparer); + } + + #endregion Constructors + + #region Enumerators + + /// <summary> + /// To get the enumerator. + /// </summary> + /// <returns>Enumerator</returns> + public IEnumerator<KeyValuePair<TKey, IList<TValue>>> GetEnumerator() + { + return _dictionary.GetEnumerator(); + } + + /// <summary> + /// To get the enumerator. + /// </summary> + /// <returns>Enumerator</returns> + IEnumerator IEnumerable.GetEnumerator() + { + return _dictionary.GetEnumerator(); + } + + #endregion Enumerators + + #region Public Members + /// <summary> + /// Add values to Multimap + /// </summary> + /// <param name="item">Key value pair</param> + public void Add(KeyValuePair<TKey, IList<TValue>> item) + { + if (!TryAdd(item.Key, item.Value)) + throw new InvalidOperationException("Could not add values to Multimap."); + } + + /// <summary> + /// Add Multimap to Multimap + /// </summary> + /// <param name="multimap">Multimap</param> + public void Add(Multimap<TKey, TValue> multimap) + { + foreach (var item in multimap) + { + if (!TryAdd(item.Key, item.Value)) + throw new InvalidOperationException("Could not add values to Multimap."); + } + } + + /// <summary> + /// Clear Multimap + /// </summary> + public void Clear() + { + _dictionary.Clear(); + } + + /// <summary> + /// Determines whether Multimap contains the specified item. + /// </summary> + /// <param name="item">Key value pair</param> + /// <exception cref="NotImplementedException">Method needs to be implemented</exception> + /// <returns>true if the Multimap contains the item; otherwise, false.</returns> + public bool Contains(KeyValuePair<TKey, IList<TValue>> item) + { + throw new NotImplementedException(); + } + + /// <summary> + /// Copy items of the Multimap to an array, + /// starting at a particular array index. + /// </summary> + /// <param name="array">The array that is the destination of the items copied + /// from Multimap. The array must have zero-based indexing.</param> + /// <param name="arrayIndex">The zero-based index in array at which copying begins.</param> + /// <exception cref="NotImplementedException">Method needs to be implemented</exception> + public void CopyTo(KeyValuePair<TKey, IList<TValue>>[] array, int arrayIndex) + { + throw new NotImplementedException(); + } + + /// <summary> + /// Removes the specified item from the Multimap. + /// </summary> + /// <param name="item">Key value pair</param> + /// <returns>true if the item is successfully removed; otherwise, false.</returns> + /// <exception cref="NotImplementedException">Method needs to be implemented</exception> + public bool Remove(KeyValuePair<TKey, IList<TValue>> item) + { + throw new NotImplementedException(); + } + + /// <summary> + /// Gets the number of items contained in the Multimap. + /// </summary> + public int Count => _dictionary.Count; + + /// <summary> + /// Gets a value indicating whether the Multimap is read-only. + /// </summary> + public bool IsReadOnly => false; + + /// <summary> + /// Adds an item with the provided key and value to the Multimap. + /// </summary> + /// <param name="key">The object to use as the key of the item to add.</param> + /// <param name="value">The object to use as the value of the item to add.</param> + /// <exception cref="InvalidOperationException">Thrown when couldn't add the value to Multimap.</exception> + public void Add(TKey key, IList<TValue> value) + { + if (value != null && value.Count > 0) + { + if (_dictionary.TryGetValue(key, out var list)) + { + foreach (var k in value) list.Add(k); + } + else + { + list = new List<TValue>(value); + if (!TryAdd(key, list)) + throw new InvalidOperationException("Could not add values to Multimap."); + } + } + } + + /// <summary> + /// Determines whether the Multimap contains an item with the specified key. + /// </summary> + /// <param name="key">The key to locate in the Multimap.</param> + /// <returns>true if the Multimap contains an item with + /// the key; otherwise, false.</returns> + public bool ContainsKey(TKey key) + { + return _dictionary.ContainsKey(key); + } + + /// <summary> + /// Removes item with the specified key from the Multimap. + /// </summary> + /// <param name="key">The key to locate in the Multimap.</param> + /// <returns>true if the item is successfully removed; otherwise, false.</returns> + public bool Remove(TKey key) + { + return TryRemove(key, out var _); + } + + /// <summary> + /// Gets the value associated with the specified key. + /// </summary> + /// <param name="key">The key whose value to get.</param> + /// <param name="value">When this method returns, the value associated with the specified key, if the + /// key is found; otherwise, the default value for the type of the value parameter. + /// This parameter is passed uninitialized.</param> + /// <returns> true if the object that implements Multimap contains + /// an item with the specified key; otherwise, false.</returns> + public bool TryGetValue(TKey key, out IList<TValue> value) + { + return _dictionary.TryGetValue(key, out value); + } + + /// <summary> + /// Gets or sets the item with the specified key. + /// </summary> + /// <param name="key">The key of the item to get or set.</param> + /// <returns>The value of the specified key.</returns> + public IList<TValue> this[TKey key] + { + get => _dictionary[key]; + set => _dictionary[key] = value; + } + + /// <summary> + /// Gets a System.Collections.Generic.ICollection containing the keys of the Multimap. + /// </summary> + public ICollection<TKey> Keys => _dictionary.Keys; + + /// <summary> + /// Gets a System.Collections.Generic.ICollection containing the values of the Multimap. + /// </summary> + public ICollection<IList<TValue>> Values => _dictionary.Values; + + /// <summary> + /// Copy the items of the Multimap to an System.Array, + /// starting at a particular System.Array index. + /// </summary> + /// <param name="array">The one-dimensional System.Array that is the destination of the items copied + /// from Multimap. The System.Array must have zero-based indexing.</param> + /// <param name="index">The zero-based index in array at which copying begins.</param> + public void CopyTo(Array array, int index) + { + ((ICollection)_dictionary).CopyTo(array, index); + } + + /// <summary> + /// Adds an item with the provided key and value to the Multimap. + /// </summary> + /// <param name="key">The object to use as the key of the item to add.</param> + /// <param name="value">The object to use as the value of the item to add.</param> + /// <exception cref="InvalidOperationException">Thrown when couldn't add value to Multimap.</exception> + public void Add(TKey key, TValue value) + { + if (value != null) + { + if (_dictionary.TryGetValue(key, out var list)) + { + list.Add(value); + } + else + { + list = new List<TValue> { value }; + if (!TryAdd(key, list)) + throw new InvalidOperationException("Could not add value to Multimap."); + } + } + } + + #endregion Public Members + + #region Private Members + + /** + * Helper method to encapsulate generator differences between dictionary types. + */ + private bool TryRemove(TKey key, out IList<TValue> value) + { + _dictionary.TryGetValue(key, out value); + return _dictionary.Remove(key); + } + + /** + * Helper method to encapsulate generator differences between dictionary types. + */ + private bool TryAdd(TKey key, IList<TValue> value) + { + try + { + _dictionary.Add(key, value); + } + catch (ArgumentException) + { + return false; + } + + return true; + } + #endregion Private Members + } +} diff --git a/src/OpenApiGeneratedConnector/src/Org.OpenAPITools/Client/OpenAPIDateConverter.cs b/src/OpenApiGeneratedConnector/src/Org.OpenAPITools/Client/OpenAPIDateConverter.cs new file mode 100644 index 0000000000000000000000000000000000000000..bc559a6e692b9449bba56f7449cf2cad37214614 --- /dev/null +++ b/src/OpenApiGeneratedConnector/src/Org.OpenAPITools/Client/OpenAPIDateConverter.cs @@ -0,0 +1,29 @@ +/* + * Metadata Extractor API + * + * This API extracts RDF triples from files + * + * The version of the OpenAPI document: 0.1.1 + * Generated by: https://github.com/openapitools/openapi-generator.git + */ + +using Newtonsoft.Json.Converters; + +namespace Org.OpenAPITools.Client +{ + /// <summary> + /// Formatter for 'date' openapi formats ss defined by full-date - RFC3339 + /// see https://github.com/OAI/OpenAPI-Specification/blob/master/versions/3.0.0.md#data-types + /// </summary> + public class OpenAPIDateConverter : IsoDateTimeConverter + { + /// <summary> + /// Initializes a new instance of the <see cref="OpenAPIDateConverter" /> class. + /// </summary> + public OpenAPIDateConverter() + { + // full-date = date-fullyear "-" date-month "-" date-mday + DateTimeFormat = "yyyy-MM-dd"; + } + } +} diff --git a/src/OpenApiGeneratedConnector/src/Org.OpenAPITools/Client/RequestOptions.cs b/src/OpenApiGeneratedConnector/src/Org.OpenAPITools/Client/RequestOptions.cs new file mode 100644 index 0000000000000000000000000000000000000000..e4cdc9ac057acd8004a2c0330feca418953a6df5 --- /dev/null +++ b/src/OpenApiGeneratedConnector/src/Org.OpenAPITools/Client/RequestOptions.cs @@ -0,0 +1,81 @@ +/* + * Metadata Extractor API + * + * This API extracts RDF triples from files + * + * The version of the OpenAPI document: 0.1.1 + * Generated by: https://github.com/openapitools/openapi-generator.git + */ + + +using System.Net; + +namespace Org.OpenAPITools.Client +{ + /// <summary> + /// A container for generalized request inputs. This type allows consumers to extend the request functionality + /// by abstracting away from the default (built-in) request framework (e.g. RestSharp). + /// </summary> + public class RequestOptions + { + /// <summary> + /// Parameters to be bound to path parts of the Request's URL + /// </summary> + public Dictionary<string, string> PathParameters { get; set; } + + /// <summary> + /// Query parameters to be applied to the request. + /// Keys may have 1 or more values associated. + /// </summary> + public Multimap<string, string> QueryParameters { get; set; } + + /// <summary> + /// Header parameters to be applied to to the request. + /// Keys may have 1 or more values associated. + /// </summary> + public Multimap<string, string> HeaderParameters { get; set; } + + /// <summary> + /// Form parameters to be sent along with the request. + /// </summary> + public Dictionary<string, string> FormParameters { get; set; } + + /// <summary> + /// File parameters to be sent along with the request. + /// </summary> + public Multimap<string, Stream> FileParameters { get; set; } + + /// <summary> + /// Cookies to be sent along with the request. + /// </summary> + public List<Cookie> Cookies { get; set; } + + /// <summary> + /// Operation associated with the request path. + /// </summary> + public string Operation { get; set; } + + /// <summary> + /// Index associated with the operation. + /// </summary> + public int OperationIndex { get; set; } + + /// <summary> + /// Any data associated with a request body. + /// </summary> + public Object Data { get; set; } + + /// <summary> + /// Constructs a new instance of <see cref="RequestOptions"/> + /// </summary> + public RequestOptions() + { + PathParameters = new Dictionary<string, string>(); + QueryParameters = new Multimap<string, string>(); + HeaderParameters = new Multimap<string, string>(); + FormParameters = new Dictionary<string, string>(); + FileParameters = new Multimap<string, Stream>(); + Cookies = new List<Cookie>(); + } + } +} diff --git a/src/OpenApiGeneratedConnector/src/Org.OpenAPITools/Client/RetryConfiguration.cs b/src/OpenApiGeneratedConnector/src/Org.OpenAPITools/Client/RetryConfiguration.cs new file mode 100644 index 0000000000000000000000000000000000000000..a13875c9c7756b5f63349503eb04b6e6b0e484da --- /dev/null +++ b/src/OpenApiGeneratedConnector/src/Org.OpenAPITools/Client/RetryConfiguration.cs @@ -0,0 +1,31 @@ +/* + * Metadata Extractor API + * + * This API extracts RDF triples from files + * + * The version of the OpenAPI document: 0.1.1 + * Generated by: https://github.com/openapitools/openapi-generator.git + */ + + +using Polly; +using RestSharp; + +namespace Org.OpenAPITools.Client +{ + /// <summary> + /// Configuration class to set the polly retry policies to be applied to the requests. + /// </summary> + public static class RetryConfiguration + { + /// <summary> + /// Retry policy + /// </summary> + public static Policy<RestResponse> RetryPolicy { get; set; } + + /// <summary> + /// Async retry policy + /// </summary> + public static AsyncPolicy<RestResponse> AsyncRetryPolicy { get; set; } + } +} diff --git a/src/OpenApiGeneratedConnector/src/Org.OpenAPITools/Model/AbstractOpenAPISchema.cs b/src/OpenApiGeneratedConnector/src/Org.OpenAPITools/Model/AbstractOpenAPISchema.cs new file mode 100644 index 0000000000000000000000000000000000000000..3fe1ad38c50fe6dff4338d88d356d3a5dd3306f5 --- /dev/null +++ b/src/OpenApiGeneratedConnector/src/Org.OpenAPITools/Model/AbstractOpenAPISchema.cs @@ -0,0 +1,75 @@ +/* + * Metadata Extractor API + * + * This API extracts RDF triples from files + * + * The version of the OpenAPI document: 0.1.1 + * Generated by: https://github.com/openapitools/openapi-generator.git + */ + + +using Newtonsoft.Json; +using Newtonsoft.Json.Serialization; + +namespace Org.OpenAPITools.Model +{ + /// <summary> + /// Abstract base class for oneOf, anyOf schemas in the OpenAPI specification + /// </summary> + public abstract partial class AbstractOpenAPISchema + { + /// <summary> + /// Custom JSON serializer + /// </summary> + static public readonly JsonSerializerSettings SerializerSettings = new JsonSerializerSettings + { + // OpenAPI generated types generally hide default constructors. + ConstructorHandling = ConstructorHandling.AllowNonPublicDefaultConstructor, + MissingMemberHandling = MissingMemberHandling.Error, + ContractResolver = new DefaultContractResolver + { + NamingStrategy = new CamelCaseNamingStrategy + { + OverrideSpecifiedNames = false + } + } + }; + + /// <summary> + /// Custom JSON serializer for objects with additional properties + /// </summary> + static public readonly JsonSerializerSettings AdditionalPropertiesSerializerSettings = new JsonSerializerSettings + { + // OpenAPI generated types generally hide default constructors. + ConstructorHandling = ConstructorHandling.AllowNonPublicDefaultConstructor, + MissingMemberHandling = MissingMemberHandling.Ignore, + ContractResolver = new DefaultContractResolver + { + NamingStrategy = new CamelCaseNamingStrategy + { + OverrideSpecifiedNames = false + } + } + }; + + /// <summary> + /// Gets or Sets the actual instance + /// </summary> + public abstract Object ActualInstance { get; set; } + + /// <summary> + /// Gets or Sets IsNullable to indicate whether the instance is nullable + /// </summary> + public bool IsNullable { get; protected set; } + + /// <summary> + /// Gets or Sets the schema type, which can be either `oneOf` or `anyOf` + /// </summary> + public string SchemaType { get; protected set; } + + /// <summary> + /// Converts the instance into JSON string. + /// </summary> + public abstract string ToJson(); + } +} diff --git a/src/OpenApiGeneratedConnector/src/Org.OpenAPITools/Model/MetadataOutput.cs b/src/OpenApiGeneratedConnector/src/Org.OpenAPITools/Model/MetadataOutput.cs new file mode 100644 index 0000000000000000000000000000000000000000..88e64127018216dc768684db4454287d747a8a28 --- /dev/null +++ b/src/OpenApiGeneratedConnector/src/Org.OpenAPITools/Model/MetadataOutput.cs @@ -0,0 +1,153 @@ +/* + * Metadata Extractor API + * + * This API extracts RDF triples from files + * + * The version of the OpenAPI document: 0.1.1 + * Generated by: https://github.com/openapitools/openapi-generator.git + */ + + +using System.Runtime.Serialization; +using System.Text; +using System.ComponentModel.DataAnnotations; + +namespace Org.OpenAPITools.Model +{ + /// <summary> + /// MetadataOutput + /// </summary> + [DataContract(Name = "MetadataOutput")] + public partial class MetadataOutput : IEquatable<MetadataOutput>, IValidatableObject + { + /// <summary> + /// Initializes a new instance of the <see cref="MetadataOutput" /> class. + /// </summary> + /// <param name="identifier">identifier.</param> + /// <param name="metadata">metadata.</param> + /// <param name="text">text.</param> + public MetadataOutput(string identifier = default(string), string metadata = default(string), string text = default(string)) + { + this.Identifier = identifier; + this.Metadata = metadata; + this.Text = text; + } + + /// <summary> + /// Gets or Sets Identifier + /// </summary> + [DataMember(Name = "identifier", EmitDefaultValue = false)] + public string Identifier { get; set; } + + /// <summary> + /// Gets or Sets Metadata + /// </summary> + [DataMember(Name = "metadata", EmitDefaultValue = false)] + public string Metadata { get; set; } + + /// <summary> + /// Gets or Sets Text + /// </summary> + [DataMember(Name = "text", EmitDefaultValue = false)] + public string Text { get; set; } + + /// <summary> + /// Returns the string presentation of the object + /// </summary> + /// <returns>String presentation of the object</returns> + public override string ToString() + { + StringBuilder sb = new StringBuilder(); + sb.Append("class MetadataOutput {\n"); + sb.Append(" Identifier: ").Append(Identifier).Append("\n"); + sb.Append(" Metadata: ").Append(Metadata).Append("\n"); + sb.Append(" Text: ").Append(Text).Append("\n"); + sb.Append("}\n"); + return sb.ToString(); + } + + /// <summary> + /// Returns the JSON string presentation of the object + /// </summary> + /// <returns>JSON string presentation of the object</returns> + public virtual string ToJson() + { + return Newtonsoft.Json.JsonConvert.SerializeObject(this, Newtonsoft.Json.Formatting.Indented); + } + + /// <summary> + /// Returns true if objects are equal + /// </summary> + /// <param name="input">Object to be compared</param> + /// <returns>Boolean</returns> + public override bool Equals(object input) + { + return this.Equals(input as MetadataOutput); + } + + /// <summary> + /// Returns true if MetadataOutput instances are equal + /// </summary> + /// <param name="input">Instance of MetadataOutput to be compared</param> + /// <returns>Boolean</returns> + public bool Equals(MetadataOutput input) + { + if (input == null) + { + return false; + } + return + ( + this.Identifier == input.Identifier || + (this.Identifier != null && + this.Identifier.Equals(input.Identifier)) + ) && + ( + this.Metadata == input.Metadata || + (this.Metadata != null && + this.Metadata.Equals(input.Metadata)) + ) && + ( + this.Text == input.Text || + (this.Text != null && + this.Text.Equals(input.Text)) + ); + } + + /// <summary> + /// Gets the hash code + /// </summary> + /// <returns>Hash code</returns> + public override int GetHashCode() + { + unchecked // Overflow is fine, just wrap + { + int hashCode = 41; + if (this.Identifier != null) + { + hashCode = (hashCode * 59) + this.Identifier.GetHashCode(); + } + if (this.Metadata != null) + { + hashCode = (hashCode * 59) + this.Metadata.GetHashCode(); + } + if (this.Text != null) + { + hashCode = (hashCode * 59) + this.Text.GetHashCode(); + } + return hashCode; + } + } + + /// <summary> + /// To validate all properties of the instance + /// </summary> + /// <param name="validationContext">Validation context</param> + /// <returns>Validation Result</returns> + public IEnumerable<System.ComponentModel.DataAnnotations.ValidationResult> Validate(ValidationContext validationContext) + { + yield break; + } + } + +} diff --git a/src/OpenApiGeneratedConnector/src/Org.OpenAPITools/Model/ModelVersion.cs b/src/OpenApiGeneratedConnector/src/Org.OpenAPITools/Model/ModelVersion.cs new file mode 100644 index 0000000000000000000000000000000000000000..9af8aa741dfbd60bfdd3d3788939f3a2218a6f20 --- /dev/null +++ b/src/OpenApiGeneratedConnector/src/Org.OpenAPITools/Model/ModelVersion.cs @@ -0,0 +1,117 @@ +/* + * Metadata Extractor API + * + * This API extracts RDF triples from files + * + * The version of the OpenAPI document: 0.1.1 + * Generated by: https://github.com/openapitools/openapi-generator.git + */ + + +using System.Runtime.Serialization; +using System.Text; +using System.ComponentModel.DataAnnotations; + +namespace Org.OpenAPITools.Model +{ + /// <summary> + /// ModelVersion + /// </summary> + [DataContract(Name = "_Version")] + public partial class ModelVersion : IEquatable<ModelVersion>, IValidatableObject + { + /// <summary> + /// Initializes a new instance of the <see cref="ModelVersion" /> class. + /// </summary> + /// <param name="version">version.</param> + public ModelVersion(string version = default(string)) + { + this._Version = version; + } + + /// <summary> + /// Gets or Sets _Version + /// </summary> + [DataMember(Name = "version", EmitDefaultValue = false)] + public string _Version { get; set; } + + /// <summary> + /// Returns the string presentation of the object + /// </summary> + /// <returns>String presentation of the object</returns> + public override string ToString() + { + StringBuilder sb = new StringBuilder(); + sb.Append("class ModelVersion {\n"); + sb.Append(" _Version: ").Append(_Version).Append("\n"); + sb.Append("}\n"); + return sb.ToString(); + } + + /// <summary> + /// Returns the JSON string presentation of the object + /// </summary> + /// <returns>JSON string presentation of the object</returns> + public virtual string ToJson() + { + return Newtonsoft.Json.JsonConvert.SerializeObject(this, Newtonsoft.Json.Formatting.Indented); + } + + /// <summary> + /// Returns true if objects are equal + /// </summary> + /// <param name="input">Object to be compared</param> + /// <returns>Boolean</returns> + public override bool Equals(object input) + { + return this.Equals(input as ModelVersion); + } + + /// <summary> + /// Returns true if ModelVersion instances are equal + /// </summary> + /// <param name="input">Instance of ModelVersion to be compared</param> + /// <returns>Boolean</returns> + public bool Equals(ModelVersion input) + { + if (input == null) + { + return false; + } + return + ( + this._Version == input._Version || + (this._Version != null && + this._Version.Equals(input._Version)) + ); + } + + /// <summary> + /// Gets the hash code + /// </summary> + /// <returns>Hash code</returns> + public override int GetHashCode() + { + unchecked // Overflow is fine, just wrap + { + int hashCode = 41; + if (this._Version != null) + { + hashCode = (hashCode * 59) + this._Version.GetHashCode(); + } + return hashCode; + } + } + + /// <summary> + /// To validate all properties of the instance + /// </summary> + /// <param name="validationContext">Validation context</param> + /// <returns>Validation Result</returns> + public IEnumerable<System.ComponentModel.DataAnnotations.ValidationResult> Validate(ValidationContext validationContext) + { + yield break; + } + } + +} diff --git a/src/OpenApiGeneratedConnector/src/Org.OpenAPITools/Org.OpenAPITools.csproj b/src/OpenApiGeneratedConnector/src/Org.OpenAPITools/Org.OpenAPITools.csproj new file mode 100644 index 0000000000000000000000000000000000000000..f29fbacc232b7d78d1b73e00dd1c09183d69b14a --- /dev/null +++ b/src/OpenApiGeneratedConnector/src/Org.OpenAPITools/Org.OpenAPITools.csproj @@ -0,0 +1,36 @@ +<Project Sdk="Microsoft.NET.Sdk"> + + <PropertyGroup> + <GenerateAssemblyInfo>false</GenerateAssemblyInfo><!-- setting GenerateAssemblyInfo to false causes this bug https://github.com/dotnet/project-system/issues/3934 --> + <TargetFramework>netstandard2.0</TargetFramework> + <AssemblyName>Org.OpenAPITools</AssemblyName> + <PackageId>Org.OpenAPITools</PackageId> + <OutputType>Library</OutputType> + <Authors>OpenAPI</Authors> + <Company>OpenAPI</Company> + <AssemblyTitle>OpenAPI Library</AssemblyTitle> + <Description>A library generated from a OpenAPI doc</Description> + <Copyright>No Copyright</Copyright> + <RootNamespace>Org.OpenAPITools</RootNamespace> + <Version>1.0.0</Version> + <DocumentationFile>bin\$(Configuration)\$(TargetFramework)\Org.OpenAPITools.xml</DocumentationFile> + <RepositoryUrl>https://github.com/GIT_USER_ID/GIT_REPO_ID.git</RepositoryUrl> + <RepositoryType>git</RepositoryType> + <PackageReleaseNotes>Minor update</PackageReleaseNotes> + </PropertyGroup> + + <ItemGroup> + <PackageReference Include="JsonSubTypes" Version="1.9.0" /> + <PackageReference Include="Newtonsoft.Json" Version="13.0.1" /> + <PackageReference Include="RestSharp" Version="108.0.1" /> + <PackageReference Include="Polly" Version="7.2.3" /> + <PackageReference Include="System.ComponentModel.Annotations" Version="5.0.0" /> + </ItemGroup> + + <ItemGroup> + <None Remove="System.Web" /> + </ItemGroup> + <ItemGroup> + <Reference Include="System.Web" /> + </ItemGroup> +</Project>