Added UI for Multi AAS Support
Fixed Import/Export of AASX Packages according to Spec 2.0
MimeTypes.cs added
diff --git a/sdks/dotnet/basyx-components/BaSyx.AAS.Server.Http/MultiStartup.cs b/sdks/dotnet/basyx-components/BaSyx.AAS.Server.Http/MultiStartup.cs
index fd474a3..de80d66 100644
--- a/sdks/dotnet/basyx-components/BaSyx.AAS.Server.Http/MultiStartup.cs
+++ b/sdks/dotnet/basyx-components/BaSyx.AAS.Server.Http/MultiStartup.cs
@@ -59,7 +59,8 @@
services.UseStandardImplementation();
services.ConfigureStandardDI();
-
+
+
//Check whether Asset Administration Shell Service Provider exists and bind it to the AssetAdministrationShell-Services-Controller
services.AddTransient(ctx =>
{
@@ -150,16 +151,23 @@
});
app.UseCors(
- options => options.WithOrigins("*").AllowAnyMethod()
- );
+ options => options.WithOrigins("*")
+ .AllowAnyHeader()
+ .AllowAnyMethod()
+ .AllowAnyOrigin()
+ );
app.Use((context, next) =>
{
string[] pathElements = context.Request.Path.ToUriComponent()?.Split(new char[] { '/' }, StringSplitOptions.RemoveEmptyEntries);
- if (pathElements == null || pathElements.Length == 0 || pathElements[0] != "shells")
- return next();
+ if (pathElements == null || pathElements.Length == 0)
+ {
+ string defaultRoute = ServerSettings.ServerConfig.DefaultRoute ?? "/MultiIndex";
+ context.Request.Path = new PathString(defaultRoute);
+ return next();
+ }
if (pathElements.Length >= 2)
{
aasId = pathElements[1];
diff --git a/sdks/dotnet/basyx-components/BaSyx.AAS.Server.Http/Pages/Index.cshtml b/sdks/dotnet/basyx-components/BaSyx.AAS.Server.Http/Pages/Index.cshtml
index 2ab17a4..84ca895 100644
--- a/sdks/dotnet/basyx-components/BaSyx.AAS.Server.Http/Pages/Index.cshtml
+++ b/sdks/dotnet/basyx-components/BaSyx.AAS.Server.Http/Pages/Index.cshtml
@@ -1,5 +1,5 @@
@page "ui"
-@model BaSyx.Component.REST.Pages.IndexModel
+@model BaSyx.AAS.Server.Http.Pages.IndexModel
@using BaSyx.API.Components;
@using BaSyx.Models.Core.AssetAdministrationShell.Generics;
@using BaSyx.Models.Core.AssetAdministrationShell.Generics.SubmodelElementTypes;
diff --git a/sdks/dotnet/basyx-components/BaSyx.AAS.Server.Http/Pages/Index.cshtml.cs b/sdks/dotnet/basyx-components/BaSyx.AAS.Server.Http/Pages/Index.cshtml.cs
index d58f4c1..42ba81a 100644
--- a/sdks/dotnet/basyx-components/BaSyx.AAS.Server.Http/Pages/Index.cshtml.cs
+++ b/sdks/dotnet/basyx-components/BaSyx.AAS.Server.Http/Pages/Index.cshtml.cs
@@ -12,7 +12,7 @@
using BaSyx.Utils.Settings.Types;
using Microsoft.AspNetCore.Mvc.RazorPages;
-namespace BaSyx.Component.REST.Pages
+namespace BaSyx.AAS.Server.Http.Pages
{
public class IndexModel : PageModel
{
diff --git a/sdks/dotnet/basyx-components/BaSyx.AAS.Server.Http/Pages/MultiIndex.cshtml b/sdks/dotnet/basyx-components/BaSyx.AAS.Server.Http/Pages/MultiIndex.cshtml
new file mode 100644
index 0000000..7a067af
--- /dev/null
+++ b/sdks/dotnet/basyx-components/BaSyx.AAS.Server.Http/Pages/MultiIndex.cshtml
@@ -0,0 +1,598 @@
+@page
+@model BaSyx.AAS.Server.Http.Pages.MultiIndexModel
+@using BaSyx.API.Components;
+@using BaSyx.Models.Core.AssetAdministrationShell.Generics;
+@using BaSyx.Models.Core.AssetAdministrationShell.Generics.SubmodelElementTypes;
+@using BaSyx.Models.Core.AssetAdministrationShell.Identification;
+@using BaSyx.Models.Core.AssetAdministrationShell.References;
+@using BaSyx.Models.Core.Common;
+@using BaSyx.Models.Extensions;
+@using BaSyx.Models.Core.AssetAdministrationShell.Semantics;
+@using Microsoft.AspNetCore.Html;
+
+@{
+ ViewData["Title"] = "MultiIndex";
+ IAssetAdministrationShellAggregatorServiceProvider sp = Model.ServiceProvider;
+
+ string eClassLink = "https://www.eclasscontent.com/index.php?action=cc2prdet&language=en&version=10.1&id=&pridatt=";
+
+ Func<Identifier, IHtmlContent> ShowIdentification = @<text>@{
+ var identifier = item;
+ @if (identifier != null)
+ {
+
+ <div class="panel-body">
+ <div class="row">
+ <div class="col-sm-2"><b>Identifier (@identifier.IdType.ToString())</b></div>
+ <div class="col-sm-10">@identifier.Id</div>
+ </div>
+ </div>
+ }
+}</text>;
+
+Func<string, IHtmlContent> ShowIdShort = @<text>@{
+var idShort = item;
+@if (!string.IsNullOrEmpty(idShort))
+{
+
+ <div class="panel-body">
+ <div class="row">
+ <div class="col-sm-2"><b>IdShort</b></div>
+ <div class="col-sm-10">@idShort</div>
+ </div>
+ </div>
+}
+}</text>;
+
+Func<IReference, IHtmlContent> ShowSemanticId = @<text>@{
+var reference = item;
+@if (reference?.First?.Value != null)
+{
+
+ <div class="panel-body">
+ <div class="row">
+ <div class="col-sm-2"><b>SemanticId</b></div>
+ @if (reference.First.IdType == KeyType.IRDI)
+ {
+ {
+ string link = eClassLink + Uri.EscapeDataString(reference.First.Value);
+ <div class="col-sm-10"><a target="_blank" href="@link">@reference.First.Value (eCl@ss)</a></div>
+ }
+ }
+ else
+ {
+ <div class="col-sm-10">@reference.First.Value</div>
+ }
+ </div>
+ </div>
+}
+}</text>;
+
+
+Func<LangStringSet, IHtmlContent> ShowDescription = @<text>@{
+var langStringCollection = item;
+@if (langStringCollection?.Count > 0)
+{
+ string description = string.Empty;
+ for (int i = 0; i < langStringCollection.Count; i++)
+ {
+ description = langStringCollection[i].Language + ":" + langStringCollection[i].Text + (i != langStringCollection.Count - 1 ? ";" : "");
+ }
+
+ <div class="panel-body">
+ <div class="row">
+ <div class="col-sm-2"><b>Description</b></div>
+ <div class="col-sm-10">@description</div>
+ </div>
+ </div>
+}
+}</text>;
+
+Func<IValue, IHtmlContent> ShowValue = @<text>@{
+var value = item;
+if (value.ValueType == null)
+{
+ var serialized = Json.Serialize(value.Value).ToString();
+ @serialized
+}
+else
+{
+ @value.Value?.ToString()
+}
+}</text>;
+
+Func<string, IHtmlContent> ShowSubmodelElementHeader = @<text>@{
+var idShort = item;
+if (string.IsNullOrEmpty(idShort))
+{
+ return;
+}
+else
+{
+ <div class="panel-heading">
+ <h4 class="panel-title">
+ <a data-toggle="collapse" href="#@idShort">@idShort</a>
+ </h4>
+ </div>
+}
+}</text>;
+
+Func<string, IProperty, IHtmlContent> ShowPropertyFooter = (submodelIdShort, property) => new Func<object, Microsoft.AspNetCore.Mvc.Razor.HelperResult>(@<text>@{
+
+if (string.IsNullOrEmpty(submodelIdShort) || property == null)
+{
+ return;
+}
+else
+{
+ <div class="panel-footer">
+ <div class="row">
+ <div class="col-sm-8">
+
+ <div class="input-group">
+ <span class="input-group-addon"><i class="glyphicon glyphicon-pencil"></i></span>
+ <input id="Input_@submodelIdShort@property.IdShort" type="text" class="form-control" placeholder="Value" value="@ShowValue(property)" />
+ </div>
+
+ </div>
+ <div class="col-sm-1"><button onclick="@("GetPropertyValue('" + submodelIdShort + "', '" + property.IdShort + "')")" id="@property.IdShort;Retrieve" type="button" class="btn btn-primary">Retrieve</button></div>
+ <div class="col-sm-1"><button onclick="@("SetPropertyValue('" + submodelIdShort + "', '" + property.IdShort + "', '" + property.ValueType?.ToString() + "', $('#Input_" + submodelIdShort + property.IdShort + "').val() )")" id="@property.IdShort;Update" type="button" class="btn btn-success">Update</button></div>
+
+ </div>
+ </div>
+}
+}</text>)(null);
+
+Func<ISubmodelElement, IHtmlContent> ShowModelElementSpecificAttributes = @<text>@{
+var submodelElement = item;
+
+if (!Enum.TryParse<KeyElements>(submodelElement.ModelType.Name, out KeyElements keyElements))
+{
+ return;
+}
+
+switch (keyElements)
+{
+ case KeyElements.GlobalReference:
+ break;
+ case KeyElements.FragmentReference:
+ break;
+ case KeyElements.AccessPermissionRule:
+ break;
+ case KeyElements.AnnotatedRelationshipElement:
+ break;
+ case KeyElements.BasicEvent:
+ break;
+ case KeyElements.Blob:
+ break;
+ case KeyElements.Capability:
+ break;
+ case KeyElements.ConceptDictionary:
+ break;
+ case KeyElements.DataElement:
+ break;
+ case KeyElements.File:
+ {
+ IFile file = submodelElement?.ToModelElement<IFile>();
+ if (file == null)
+ {
+ return;
+ }
+
+ string path = GetPath(file);
+
+ <div class="panel-body">
+ <div class="row">
+ <div class="col-sm-2"><b>MimeType</b></div>
+ <div class="col-sm-10">@file.MimeType</div>
+ </div>
+ </div>
+ <div class="panel-body">
+ <div class="row">
+ <div class="col-sm-2"><b>Path</b></div>
+ <div class="col-sm-10">@path</div>
+ </div>
+ </div>
+ string contentRoot = System.IO.Path.Combine(AppContext.BaseDirectory, Model.Settings.ServerConfig.Hosting.ContentPath);
+ var contentFileProvider = new Microsoft.Extensions.FileProviders.PhysicalFileProvider(contentRoot);
+ @if (contentFileProvider.GetFileInfo(path).Exists)
+ {
+ <embed src="@path#navpanes=0&scrollbar=0" width="100%" />
+ }
+ }
+ return;
+ case KeyElements.Entity:
+ break;
+ case KeyElements.Event:
+ {
+ IEvent eventable = submodelElement?.ToModelElement<IEvent>();
+ if (eventable == null)
+ {
+ return;
+ }
+
+ @foreach (var element in eventable.DataElements)
+ {
+ <div class="row">
+ @{ string valueTypeName = element.ToModelElement<IProperty>()?.ValueType?.ToString() ?? "ANY"; }
+ <div class="col-sm-10"><b>@element.IdShort (@valueTypeName)</b></div>
+ </div>
+ }
+ }
+ return;
+ case KeyElements.MultiLanguageProperty:
+ break;
+ case KeyElements.Operation:
+ break;
+ case KeyElements.Property:
+ IProperty property = submodelElement?.ToModelElement<IProperty>();
+ if (property == null)
+ {
+ return;
+ }
+
+ string dataTypeName = property.ValueType?.ToString()?.ToUpper();
+ if (string.IsNullOrEmpty(dataTypeName))
+ {
+ dataTypeName = property?.ModelType?.Name;
+ }
+
+ <div class="panel-body">
+ <div class="row">
+ <div class="col-sm-2"><b>ValueType</b></div>
+ <div class="col-sm-10">@dataTypeName</div>
+ </div>
+ </div>
+ return;
+ case KeyElements.Range:
+ break;
+ case KeyElements.ReferenceElement:
+ break;
+ case KeyElements.RelationshipElement:
+ break;
+ case KeyElements.SubmodelElement:
+ break;
+ case KeyElements.SubmodelElementCollection:
+ break;
+ case KeyElements.View:
+ break;
+ case KeyElements.AssetAdministrationShell:
+ break;
+ case KeyElements.ConceptDescription:
+ break;
+ default:
+ break;
+}
+
+}</text>;
+
+Func<ISubmodelElement, IHtmlContent> ShowValueType = @<text>@{
+var submodelElement = item;
+if (submodelElement.GetType().GetInterfaces().Where(i => i.Name == "ISubmodelElement") == null)
+{
+ return;
+}
+else
+{
+ var property = (IProperty)submodelElement;
+ var dataTypeName = property.ValueType?.DataObjectType?.Name?.ToUpper();
+ if (string.IsNullOrEmpty(dataTypeName))
+ {
+ dataTypeName = property.ModelType?.Name;
+ }
+ <div class="panel-body">
+ <div class="row">
+ <div class="col-sm-2"><b>ValueType</b></div>
+ <div class="col-sm-10">@dataTypeName</div>
+ </div>
+ </div>
+}
+}</text>;
+
+Func<IEnumerable<IEmbeddedDataSpecification>, IHtmlContent> ShowDataSpecifications = @<text>@{
+var embeddedDataSpecifications = item;
+if (embeddedDataSpecifications?.Count() > 0)
+{
+ @foreach (var dataSpecification in embeddedDataSpecifications)
+ {
+ <div class="list-group-item" style="background:#88b8d9; color:white">
+ <div class="row">
+ <div class="col-sm-2"><b>Data-Specification</b></div>
+ <div class="col-sm-10">@dataSpecification.HasDataSpecification.First.Value</div>
+ </div>
+ </div>
+
+ @foreach (var property in dataSpecification.DataSpecificationContent.GetType().GetProperties())
+ {
+
+ @if (property.PropertyType.IsGenericType && (property.PropertyType.GetGenericTypeDefinition() == typeof(List<>)))
+ {
+ var values = property.GetValue(dataSpecification.DataSpecificationContent) as IEnumerable<object>;
+ if (values?.Count() > 0)
+ {
+ foreach (var element in values)
+ {
+ foreach (var subProperty in property.PropertyType.GenericTypeArguments[0].GetProperties())
+ {
+ var value = subProperty.GetValue(element)?.ToString();
+ if (value != null)
+ {
+ <div class="list-group-item" style="background:#88b8d9; color:white">
+ <div class="row">
+ <div class="col-sm-2"><b>@subProperty.Name</b></div>
+ <div class="col-sm-10">@value</div>
+ </div>
+ </div>
+ }
+ }
+ }
+ }
+ }
+ else
+ {
+ var value = property.GetValue(dataSpecification.DataSpecificationContent);
+ if (value != null)
+ {
+ if (value is IReference reference)
+ {
+ value = reference.First.Value;
+ }
+ else
+ {
+ value = value.ToString();
+ }
+
+ <div class="list-group-item" style="background:#88b8d9; color:white">
+ <div class="row">
+ <div class="col-sm-2"><b>@property.Name</b></div>
+ <div class="col-sm-10">@value</div>
+ </div>
+ </div>
+ }
+ }
+
+ }
+ }
+}
+}</text>;
+
+Func<List<object>, IHtmlContent> ShowSubmodelElement = null;
+
+ShowSubmodelElement = @<text>@{
+var submodelwithElement = item;
+if (submodelwithElement?.Count < 2)
+{
+ return;
+}
+else
+{
+ ISubmodel submodel = submodelwithElement[0] as ISubmodel;
+ ISubmodelElement submodelElement = submodelwithElement[1] as ISubmodelElement;
+
+ <div class="panel panel-warning">
+ <div class="panel-heading">
+ <h4 class="panel-title">
+ <a data-toggle="collapse" href="#@submodelElement.IdShort">@submodelElement.IdShort</a>
+ </h4>
+ </div>
+ <div id="@submodelElement.IdShort" class="panel-collapse collapse">
+ @ShowDataSpecifications(submodelElement.EmbeddedDataSpecifications)
+ @ShowDescription(submodelElement.Description)
+ @ShowSemanticId(submodelElement.SemanticId)
+ @ShowModelElementSpecificAttributes(submodelElement)
+
+ @if (submodelElement is IProperty property)
+ {
+ @ShowPropertyFooter(submodel.IdShort, property)
+ }
+ else if (submodelElement is IOperation operation)
+ {
+ if (operation.InputVariables?.Count > 0)
+ {
+ foreach (var argument in operation.InputVariables.ToElementContainer())
+ {
+ <div class="panel-body" style="background:#88b8d9">
+ <div class="row">
+ <div class="col-sm-2 argInName @submodel.IdShort @operation.IdShort"><b>@argument.IdShort</b></div>
+ <div class="col-sm-2 argInType @submodel.IdShort @operation.IdShort">@GetValueOrModelType(argument)</div>
+ <div class="col-sm-8">
+ <div class="input-group">
+ <span class="input-group-addon"><i class="glyphicon glyphicon-pencil"></i></span>
+ <input id="msg" type="text" class="form-control argInValue @submodel.IdShort @operation.IdShort" name="msg" placeholder="Argument Value">
+ </div>
+ </div>
+ </div>
+ </div>
+ }
+ }
+ if (operation.OutputVariables?.Count > 0)
+ {
+ foreach (var argument in operation.OutputVariables.ToElementContainer())
+ {
+ <div class="panel-body" style="background:#d68dbc">
+ <div class="row">
+ <div class="col-sm-2 argOutName @submodel.IdShort @operation.IdShort"><b>@argument.IdShort</b></div>
+ <div class="col-sm-2 argOutType @submodel.IdShort @operation.IdShort">@GetValueOrModelType(argument)</div>
+ <div class="col-sm-8">
+ <div class="input-group">
+ <span class="input-group-addon"><i class="glyphicon glyphicon-pencil"></i></span>
+ <input id="argOutValue_@submodel.IdShort@operation.IdShort@argument.IdShort" type="text" class="form-control argOutValue @submodel.IdShort @operation.IdShort" name="msg" placeholder="Return Value">
+ </div>
+ </div>
+ </div>
+ </div>
+ }
+ }
+ <div class="panel-footer"><button onclick="@("ExecuteOperation('" + submodel.IdShort + "', '" + operation.IdShort + "')")" type="button" class="btn btn-success">Execute</button></div>
+ }
+ else if (submodelElement is ISubmodelElementCollection collection)
+ {
+ @foreach (var value in collection.Value)
+ {
+ <div class="panel-body">
+ @ShowSubmodelElement(new List<object>() { submodel, value })
+ </div>
+ }
+ }
+ </div>
+ </div>
+}
+}</text>;
+}
+
+@functions
+{
+ public string GetPath(IFile file)
+ {
+ string content = file.Value;
+ if (string.IsNullOrEmpty(content))
+ return string.Empty;
+
+ content = content.Replace('\\', '/');
+ return content;
+ }
+
+ public string GetValueOrModelType(ISubmodelElement submodelElement)
+ {
+ if (submodelElement is IProperty property)
+ {
+ return property.ValueType?.ToString();
+ }
+ else
+ {
+ return submodelElement.ModelType.Name;
+ }
+ }
+}
+
+<!doctype html>
+<html>
+<head>
+ <meta name="viewport" content="width=device-width, initial-scale=1">
+ <link rel="stylesheet" href="~/scripts/bootstrap.min.css">
+ <title>BaSys Multi Asset Administration Shell UI</title>
+ <script src="~/scripts/jquery-3.3.1.min.js"></script>
+ <script src="~/scripts/popper.min.js"></script>
+ <script src="~/scripts/bootstrap.min.js"></script>
+
+ <style>
+ .bd-placeholder-img {
+ font-size: 1.125rem;
+ text-anchor: middle;
+ }
+
+ @@media (min-width: 768px) {
+ .bd-placeholder-img-lg {
+ font-size: 3.5rem;
+ }
+ }
+ </style>
+
+</head>
+<body>
+
+ <nav class="navbar navbar-inverse">
+ <div class="container-fluid">
+ <div class="navbar-header">
+ <img src="~/images/basyxlogo.png" width="160" height="64" />
+ </div>
+ <ul class="nav navbar-nav">
+ <li><a href="#" style="margin-top:15px">Main</a></li>
+ </ul>
+ <div class="navbar-right"><img src="~/images/Bosch.gif" width="103" height="30" style="margin-top:25px; margin-right:15px" /></div>
+ </div>
+ </nav>
+
+ <main role="main" class="container">
+
+ <div class="starter-template">
+ <h1>Multi Asset Administration Shell UI</h1>
+ <p class="lead">Generic UI to display many Asset Administration Shells</p>
+ </div>
+ </main>
+
+
+ @if (sp.AssetAdministrationShells?.Count() > 0)
+ {
+ foreach (var aas in sp.AssetAdministrationShells)
+ {
+ <div class="container">
+ <div class="panel panel-default">
+ <div class="panel-heading" style="background:#7ca1ce">
+ <h4>
+ <a style="color:white" data-toggle="collapse" href="#@aas.IdShort">@aas.IdShort</a>
+ </h4>
+ </div>
+ <div id="@aas.IdShort" class="panel-collapse collapse">
+ <div class="panel-body">
+ <div class="panel panel-default">
+ <div class="panel-heading" style="background:#7ca1ce"><h4 style="color:white">Asset Administration Shell</h4></div>
+ @ShowIdShort(aas.IdShort)
+ @ShowIdentification(aas.Identification)
+ @ShowDescription(aas.Description)
+ </div>
+ @{
+ var asset = aas.Asset;
+ if (asset != null)
+ {
+
+ <div class="panel panel-default">
+ <div class="panel-heading" style="background:#b90276"><h4 style="color:white">Asset</h4></div>
+ @ShowIdShort(asset.IdShort)
+ @ShowIdentification(asset.Identification)
+ @ShowDescription(asset.Description)
+ </div>
+
+ }
+ }
+ @if (aas.Submodels?.Count > 0)
+ {
+ foreach (var submodel in aas.Submodels)
+ {
+ <div class="panel panel-default">
+ <div class="panel-heading" style="background:darkgreen">
+ <h4>
+ <a style="color:white" data-toggle="collapse" href="#@submodel.IdShort">@submodel.IdShort</a>
+ </h4>
+ </div>
+ <div id="@submodel.IdShort" class="panel-collapse collapse">
+ @ShowIdShort(submodel.IdShort)
+ @ShowIdentification(submodel.Identification)
+ @ShowDescription(submodel.Description)
+ @ShowSemanticId(submodel.SemanticId)
+ <div class="panel-body">
+ <div class="panel-group">
+ @if (submodel.SubmodelElements?.Count > 0)
+ {
+ <div class="panel panel-default">
+ <div class="panel-heading" style="background:#005691"><h4 style="color:white">Submodel-Elements</h4></div>
+ <div class="panel-body">
+ <div class="panel-group">
+ @for (int i = 0; i < submodel.SubmodelElements.Count; i++)
+ {
+ var submodelElement = submodel.SubmodelElements[i];
+ if (submodelElement == null)
+ { continue; }
+
+ @ShowSubmodelElement(new List<object>() { submodel, submodelElement });
+
+ }
+ </div>
+ </div>
+ </div>
+ }
+ </div>
+ </div>
+ </div>
+ </div>
+ }
+ }
+ </div>
+ </div>
+ </div>
+ </div>
+ }
+ }
+
+</body>
+</html>
diff --git a/sdks/dotnet/basyx-components/BaSyx.AAS.Server.Http/Pages/MultiIndex.cshtml.cs b/sdks/dotnet/basyx-components/BaSyx.AAS.Server.Http/Pages/MultiIndex.cshtml.cs
new file mode 100644
index 0000000..9b00960
--- /dev/null
+++ b/sdks/dotnet/basyx-components/BaSyx.AAS.Server.Http/Pages/MultiIndex.cshtml.cs
@@ -0,0 +1,33 @@
+/*******************************************************************************
+* Copyright (c) 2020 Robert Bosch GmbH
+* Author: Constantin Ziesche (constantin.ziesche@bosch.com)
+*
+* This program and the accompanying materials are made available under the
+* terms of the Eclipse Public License 2.0 which is available at
+* http://www.eclipse.org/legal/epl-2.0
+*
+* SPDX-License-Identifier: EPL-2.0
+*******************************************************************************/
+using BaSyx.API.Components;
+using BaSyx.Utils.Settings.Types;
+using Microsoft.AspNetCore.Mvc.RazorPages;
+
+namespace BaSyx.AAS.Server.Http.Pages
+{
+ public class MultiIndexModel : PageModel
+ {
+ public IAssetAdministrationShellAggregatorServiceProvider ServiceProvider { get; }
+ public ServerSettings Settings { get; }
+
+ public MultiIndexModel(IAssetAdministrationShellAggregatorServiceProvider provider, ServerSettings serverSettings)
+ {
+ ServiceProvider = provider;
+ Settings = serverSettings;
+ }
+
+ public void OnGet()
+ {
+
+ }
+ }
+}
diff --git a/sdks/dotnet/basyx-components/BaSyx.AAS.Server.Http/Properties/launchSettings.json b/sdks/dotnet/basyx-components/BaSyx.AAS.Server.Http/Properties/launchSettings.json
deleted file mode 100644
index 34865e6..0000000
--- a/sdks/dotnet/basyx-components/BaSyx.AAS.Server.Http/Properties/launchSettings.json
+++ /dev/null
@@ -1,27 +0,0 @@
-{
- "iisSettings": {
- "windowsAuthentication": false,
- "anonymousAuthentication": true,
- "iisExpress": {
- "applicationUrl": "http://localhost:51863/",
- "sslPort": 44363
- }
- },
- "profiles": {
- "IIS Express": {
- "commandName": "IISExpress",
- "launchBrowser": true,
- "environmentVariables": {
- "ASPNETCORE_ENVIRONMENT": "Development"
- }
- },
- "BaSyx.AAS.Server.Http": {
- "commandName": "Project",
- "launchBrowser": true,
- "environmentVariables": {
- "ASPNETCORE_ENVIRONMENT": "Development"
- },
- "applicationUrl": "https://localhost:5001;http://localhost:5000"
- }
- }
-}
\ No newline at end of file
diff --git a/sdks/dotnet/basyx-core/BaSyx.Models.Export/AASX.cs b/sdks/dotnet/basyx-core/BaSyx.Models.Export/AASX.cs
index 56b2521..341d285 100644
--- a/sdks/dotnet/basyx-core/BaSyx.Models.Export/AASX.cs
+++ b/sdks/dotnet/basyx-core/BaSyx.Models.Export/AASX.cs
@@ -17,6 +17,9 @@
using BaSyx.Models.Core.AssetAdministrationShell.Generics.SubmodelElementTypes;
using NLog;
using Microsoft.AspNetCore.StaticFiles;
+using BaSyx.Utils.FileHandling;
+using System.Runtime.Serialization;
+using System.Runtime.Serialization.Formatters.Binary;
namespace BaSyx.Models.Export
{
@@ -181,6 +184,33 @@
CopyFileToPackagePart(specPart, aasEnvPath);
}
+ public void AddEnvironment(Identifier aasId, AssetAdministrationShellEnvironment_V2_0 environment, ExportType exportType)
+ {
+ if (aasId == null)
+ throw new ArgumentNullException(nameof(aasId));
+ if (environment == null)
+ throw new ArgumentNullException(nameof(environment));
+
+ string aasIdName = aasId.Id;
+ foreach (char invalidChar in Path.GetInvalidFileNameChars())
+ aasIdName = aasIdName.Replace(invalidChar, '_');
+
+ string aasFilePath = "/aasx/" + aasIdName + "/" + aasIdName + ".aas." + exportType.ToString().ToLower();
+
+ Uri partUri = PackUriHelper.CreatePartUri(new Uri(aasFilePath, UriKind.RelativeOrAbsolute));
+ ClearRelationshipAndPartFromPackagePart(originPart, SPEC_RELATIONSHIP_TYPE, partUri);
+
+ specPart = aasxPackage.CreatePart(partUri, GetContentType(aasFilePath), CompressionOption.Maximum);
+ originPart.CreateRelationship(specPart.Uri, TargetMode.Internal, SPEC_RELATIONSHIP_TYPE);
+
+ string environmentTemp = Path.GetRandomFileName() + "." + exportType.ToString().ToLower();
+ environment.WriteEnvironment_V2_0(exportType, environmentTemp);
+
+ CopyFileToPackagePart(specPart, environmentTemp);
+
+ File.Delete(environmentTemp);
+ }
+
public AssetAdministrationShellEnvironment_V1_0 GetEnvironment_V1_0()
{
if(specPart?.Uri != null)
@@ -273,6 +303,37 @@
}
}
+ public void AddFileToAASX(string targetUri, string filePath, CompressionOption compressionOption = CompressionOption.Maximum)
+ {
+ string relativeDestination;
+ if (!targetUri.StartsWith(AASX_FOLDER))
+ relativeDestination = AASX_FOLDER + targetUri;
+ else
+ relativeDestination = targetUri;
+
+ Uri uri = PackUriHelper.CreatePartUri(new Uri(relativeDestination, UriKind.Relative));
+
+ ClearRelationshipAndPartFromPackagePart(specPart, SUPPLEMENTAL_RELATIONSHIP_TYPE, uri);
+
+ string contentType = GetContentType(filePath);
+
+ PackagePart packagePart = aasxPackage.CreatePart(uri, contentType, compressionOption);
+ specPart.CreateRelationship(packagePart.Uri, TargetMode.Internal, SUPPLEMENTAL_RELATIONSHIP_TYPE);
+
+ CopyFileToPackagePart(packagePart, filePath);
+ }
+
+ private void CopyStreamToPackagePart(PackagePart packagePart, Stream stream)
+ {
+ using (stream)
+ {
+ using (Stream destination = packagePart.GetStream())
+ {
+ stream.CopyTo(destination);
+ }
+ }
+ }
+
private void CopyFileToPackagePart(PackagePart packagePart, string filePath)
{
using (FileStream fileStream = new FileStream(filePath, FileMode.Open, FileAccess.Read))
@@ -287,7 +348,8 @@
private static string GetContentType(string filePath)
{
if (!new FileExtensionContentTypeProvider().TryGetContentType(filePath, out string contentType))
- contentType = null;
+ if (!MimeTypes.TryGetContentType(filePath, out contentType))
+ return null;
return contentType;
}
diff --git a/sdks/dotnet/basyx-core/BaSyx.Models.Export/aas-spec-v1.0/AssetAdministrationShellEnvironment_V1_0.cs b/sdks/dotnet/basyx-core/BaSyx.Models.Export/aas-spec-v1.0/AssetAdministrationShellEnvironment_V1_0.cs
index 8da69d1..b32506e 100644
--- a/sdks/dotnet/basyx-core/BaSyx.Models.Export/aas-spec-v1.0/AssetAdministrationShellEnvironment_V1_0.cs
+++ b/sdks/dotnet/basyx-core/BaSyx.Models.Export/aas-spec-v1.0/AssetAdministrationShellEnvironment_V1_0.cs
@@ -157,6 +157,7 @@
ExtractAndClearConceptDescriptions(submodel.SubmodelElements);
ExtractSupplementalFiles(submodel.SubmodelElements);
ResetConstraints(submodel.SubmodelElements);
+ DeleteEvents(submodel.SubmodelElements);
}
}
}
@@ -204,8 +205,9 @@
IsCaseOf = conceptDescription.IsCaseOf?.ToList()?.ConvertAll(c => c.ToEnvironmentReference_V1_0()),
EmbeddedDataSpecification = embeddedDataSpecification
};
-
- EnvironmentConceptDescriptions.Add(environmentConceptDescription);
+
+ if (EnvironmentConceptDescriptions.Find(m => m.Identification.Id == conceptDescription.Identification.Id) == null)
+ EnvironmentConceptDescriptions.Add(environmentConceptDescription);
}
foreach (var assetAdministrationShell in AssetAdministrationShells)
{
@@ -276,7 +278,7 @@
(smElement as SubmodelElement).ConceptDescription = null;
(smElement as SubmodelElement).EmbeddedDataSpecifications = null;
}
- else if (smElement.ModelType == ModelType.SubmodelElementCollection)
+ if (smElement.ModelType == ModelType.SubmodelElementCollection)
ExtractAndClearConceptDescriptions((smElement as SubmodelElementCollection).Value);
}
}
@@ -301,6 +303,13 @@
}
}
+ private void DeleteEvents(IElementContainer<ISubmodelElement> submodelElements)
+ {
+ var eventsToDelete = submodelElements.Where(s => s.ModelType == ModelType.Event || s.ModelType == ModelType.BasicEvent).ToList();
+ foreach (var eventable in eventsToDelete)
+ submodelElements.Remove(eventable);
+ }
+
public void WriteEnvironment_V1_0(ExportType exportType, string filePath) => WriteEnvironment_V1_0(this, exportType, filePath);
public static void WriteEnvironment_V1_0(AssetAdministrationShellEnvironment_V1_0 environment, ExportType exportType, string filePath)
diff --git a/sdks/dotnet/basyx-core/BaSyx.Models.Export/aas-spec-v2.0/AssetAdministrationShellEnvironment_V2_0.cs b/sdks/dotnet/basyx-core/BaSyx.Models.Export/aas-spec-v2.0/AssetAdministrationShellEnvironment_V2_0.cs
index 0847b0e..a14dbc0 100644
--- a/sdks/dotnet/basyx-core/BaSyx.Models.Export/aas-spec-v2.0/AssetAdministrationShellEnvironment_V2_0.cs
+++ b/sdks/dotnet/basyx-core/BaSyx.Models.Export/aas-spec-v2.0/AssetAdministrationShellEnvironment_V2_0.cs
@@ -159,6 +159,7 @@
ExtractAndClearConceptDescriptions(submodel.SubmodelElements);
ExtractSupplementalFiles(submodel.SubmodelElements);
ResetConstraints(submodel.SubmodelElements);
+ DeleteEvents(submodel.SubmodelElements);
}
}
}
@@ -208,7 +209,8 @@
EmbeddedDataSpecification = embeddedDataSpecification
};
- EnvironmentConceptDescriptions.Add(environmentConceptDescription);
+ if(EnvironmentConceptDescriptions.Find(m => m.Identification.Id == conceptDescription.Identification.Id) == null)
+ EnvironmentConceptDescriptions.Add(environmentConceptDescription);
}
foreach (var assetAdministrationShell in AssetAdministrationShells)
{
@@ -255,6 +257,14 @@
}
+ private void DeleteEvents(IElementContainer<ISubmodelElement> submodelElements)
+ {
+ var eventsToDelete = submodelElements.Where(s => s.ModelType == ModelType.Event || s.ModelType == ModelType.BasicEvent).ToList();
+ foreach (var eventable in eventsToDelete)
+ submodelElements.Remove(eventable);
+ }
+
+
private void ExtractSupplementalFiles(IEnumerable<ISubmodelElement> submodelElements)
{
foreach (var smElement in submodelElements)
@@ -288,7 +298,7 @@
(smElement as SubmodelElement).ConceptDescription = null;
(smElement as SubmodelElement).EmbeddedDataSpecifications = null;
}
- else if (smElement.ModelType == ModelType.SubmodelElementCollection)
+ if (smElement.ModelType == ModelType.SubmodelElementCollection)
ExtractAndClearConceptDescriptions((smElement as Core.AssetAdministrationShell.Implementations.SubmodelElementTypes.SubmodelElementCollection).Value);
}
}
diff --git a/sdks/dotnet/basyx-core/BaSyx.Models.Export/aas-spec-v2.0/Converter/ConceptDescriptionConverter_V2_0.cs b/sdks/dotnet/basyx-core/BaSyx.Models.Export/aas-spec-v2.0/Converter/ConceptDescriptionConverter_V2_0.cs
index 9970961..970d008 100644
--- a/sdks/dotnet/basyx-core/BaSyx.Models.Export/aas-spec-v2.0/Converter/ConceptDescriptionConverter_V2_0.cs
+++ b/sdks/dotnet/basyx-core/BaSyx.Models.Export/aas-spec-v2.0/Converter/ConceptDescriptionConverter_V2_0.cs
@@ -50,9 +50,12 @@
if (dataSpecificationContent == null)
return null;
+ if(!Enum.TryParse<EnvironmentDataTypeIEC61360>(dataSpecificationContent.DataType.ToString(), out EnvironmentDataTypeIEC61360 dataType))
+ dataType = EnvironmentDataTypeIEC61360.UNDEFINED;
+
EnvironmentDataSpecificationIEC61360_V2_0 environmentDataSpecification = new EnvironmentDataSpecificationIEC61360_V2_0()
{
- DataType = (EnvironmentDataTypeIEC61360)Enum.Parse(typeof(EnvironmentDataTypeIEC61360), dataSpecificationContent.DataType.ToString()),
+ DataType = dataType,
Definition = dataSpecificationContent.Definition,
PreferredName = dataSpecificationContent.PreferredName,
ShortName = dataSpecificationContent.ShortName,
@@ -63,12 +66,12 @@
Value = dataSpecificationContent.Value,
ValueFormat = dataSpecificationContent.ValueFormat,
ValueId = dataSpecificationContent.ValueId?.ToEnvironmentReference_V2_0(),
- ValueList = dataSpecificationContent.ValueList.ConvertAll(c => new EnvironmentDataSpecifications.ValueReferencePair()
+ ValueList = dataSpecificationContent.ValueList?.ConvertAll(c => new EnvironmentDataSpecifications.ValueReferencePair()
{
Value = c.Value,
- ValueId = c.ValueId.ToEnvironmentReference_V2_0()
+ ValueId = c.ValueId?.ToEnvironmentReference_V2_0()
}),
- LevelTypes = dataSpecificationContent.LevelTypes.ConvertAll(c => (EnvironmentLevelType)Enum.Parse(typeof(EnvironmentLevelType), c.ToString()))
+ LevelTypes = dataSpecificationContent.LevelTypes?.ConvertAll(c => (EnvironmentLevelType)Enum.Parse(typeof(EnvironmentLevelType), c.ToString()))
};
return environmentDataSpecification;
diff --git a/sdks/dotnet/basyx-core/BaSyx.Models.Export/aas-spec-v2.0/Converter/TypeConverterExtensions_V2_0.cs b/sdks/dotnet/basyx-core/BaSyx.Models.Export/aas-spec-v2.0/Converter/TypeConverterExtensions_V2_0.cs
index a062eda..59c5f61 100644
--- a/sdks/dotnet/basyx-core/BaSyx.Models.Export/aas-spec-v2.0/Converter/TypeConverterExtensions_V2_0.cs
+++ b/sdks/dotnet/basyx-core/BaSyx.Models.Export/aas-spec-v2.0/Converter/TypeConverterExtensions_V2_0.cs
@@ -58,9 +58,15 @@
if (environmentKey == null)
return null;
+ if (!Enum.TryParse<KeyElements>(environmentKey.Type.ToString(), out KeyElements type))
+ type = KeyElements.Undefined;
+
+ if (!Enum.TryParse<KeyType>(environmentKey.IdType.ToString(), out KeyType idType))
+ idType = KeyType.Undefined;
+
Key key = new Key(
- (KeyElements)Enum.Parse(typeof(KeyElements), environmentKey.Type.ToString()),
- (KeyType)Enum.Parse(typeof(KeyType), environmentKey.IdType.ToString()),
+ type,
+ idType,
environmentKey.Value,
environmentKey.Local);
@@ -73,8 +79,19 @@
return null;
EnvironmentKey_V2_0 environmentKey = new EnvironmentKey_V2_0();
- environmentKey.IdType = (KeyType_V2_0)Enum.Parse(typeof(KeyType_V2_0), key.IdType.ToString());
- environmentKey.Type = (KeyElements_V2_0)Enum.Parse(typeof(KeyElements_V2_0), key.Type.ToString());
+ if(!Enum.TryParse<KeyType_V2_0>(key.IdType.ToString(), out KeyType_V2_0 keyType))
+ {
+ if (key.IdType == KeyType.URI)
+ keyType = KeyType_V2_0.IRI;
+ }
+ if (!Enum.TryParse<KeyElements_V2_0>(key.Type.ToString(), out KeyElements_V2_0 type))
+ {
+ type = KeyElements_V2_0.Undefined;
+ }
+
+
+ environmentKey.IdType = keyType;
+ environmentKey.Type = type;
environmentKey.Local = key.Local;
environmentKey.Value = key.Value;
@@ -99,13 +116,19 @@
else
return null;
+ if(!Enum.TryParse<KeyType_V2_0>(identifiable.Identification.IdType.ToString(), out KeyType_V2_0 idType))
+ {
+ if (identifiable.Identification.IdType == KeyType.URI)
+ idType = KeyType_V2_0.IRI;
+ }
+
EnvironmentReference_V2_0 reference = new EnvironmentReference_V2_0()
{
Keys = new List<EnvironmentKey_V2_0>()
{
new EnvironmentKey_V2_0()
{
- IdType = (KeyType_V2_0)Enum.Parse(typeof(KeyType_V2_0), identifiable.Identification.IdType.ToString()),
+ IdType = idType,
Local = true,
Value = identifiable.Identification.Id,
Type = type
diff --git a/sdks/dotnet/basyx-core/BaSyx.Models.Export/aas-spec-v2.0/EnvironmentDataSpecifications/EnvironmentDataSpecificationIEC61360_V2_0.cs b/sdks/dotnet/basyx-core/BaSyx.Models.Export/aas-spec-v2.0/EnvironmentDataSpecifications/EnvironmentDataSpecificationIEC61360_V2_0.cs
index 4b17411..dad2f5c 100644
--- a/sdks/dotnet/basyx-core/BaSyx.Models.Export/aas-spec-v2.0/EnvironmentDataSpecifications/EnvironmentDataSpecificationIEC61360_V2_0.cs
+++ b/sdks/dotnet/basyx-core/BaSyx.Models.Export/aas-spec-v2.0/EnvironmentDataSpecifications/EnvironmentDataSpecificationIEC61360_V2_0.cs
@@ -101,6 +101,8 @@
public enum EnvironmentDataTypeIEC61360
{
+ [EnumMember(Value = "UNDEFINED")]
+ UNDEFINED,
[EnumMember(Value = "DATE")]
DATE,
[EnumMember(Value = "STRING")]
diff --git a/sdks/dotnet/basyx-core/BaSyx.Models.Export/aas-spec-v2.0/EnvironmentIdentifiable_V2_0.cs b/sdks/dotnet/basyx-core/BaSyx.Models.Export/aas-spec-v2.0/EnvironmentIdentifiable_V2_0.cs
index 22e6649..688fc6c 100644
--- a/sdks/dotnet/basyx-core/BaSyx.Models.Export/aas-spec-v2.0/EnvironmentIdentifiable_V2_0.cs
+++ b/sdks/dotnet/basyx-core/BaSyx.Models.Export/aas-spec-v2.0/EnvironmentIdentifiable_V2_0.cs
@@ -9,6 +9,7 @@
* SPDX-License-Identifier: EPL-2.0
*******************************************************************************/
using BaSyx.Models.Core.AssetAdministrationShell.Identification;
+using BaSyx.Models.Core.AssetAdministrationShell.References;
using Newtonsoft.Json;
using System.Xml.Serialization;
@@ -16,10 +17,20 @@
{
public class EnvironmentIdentifiable_V2_0 : EnvironmentReferable_V2_0
{
+ private Identifier _identifier;
[JsonProperty("identification", Order = -2)]
[XmlElement("identification")]
- public Identifier Identification { get; set; }
-
+ public Identifier Identification
+ {
+ get { return _identifier; }
+ set
+ {
+ if (value.IdType == KeyType.URI)
+ _identifier = new Identifier(value.Id, KeyType.IRI);
+ else
+ _identifier = new Identifier(value.Id, value.IdType);
+ }
+ }
[JsonProperty("administration", Order = -1)]
[XmlElement("administration")]
public AdministrativeInformation Administration { get; set; }
diff --git a/sdks/dotnet/basyx-core/BaSyx.Models.Export/aas-spec-v2.0/EnvironmentKey_V2_0.cs b/sdks/dotnet/basyx-core/BaSyx.Models.Export/aas-spec-v2.0/EnvironmentKey_V2_0.cs
index 5081aa0..502f1cc 100644
--- a/sdks/dotnet/basyx-core/BaSyx.Models.Export/aas-spec-v2.0/EnvironmentKey_V2_0.cs
+++ b/sdks/dotnet/basyx-core/BaSyx.Models.Export/aas-spec-v2.0/EnvironmentKey_V2_0.cs
@@ -26,6 +26,8 @@
public enum KeyType_V2_0
{
+ [EnumMember(Value = "Undefined")]
+ Undefined,
[EnumMember(Value = "Custom")]
Custom,
[EnumMember(Value = "IRI")]
@@ -40,6 +42,8 @@
public enum KeyElements_V2_0
{
+ Undefined,
+
GlobalReference,
FragmentReference,
diff --git a/sdks/dotnet/basyx-core/BaSyx.Models.Export/aas-spec-v2.0/EnvironmentSubmodelElements/Operation_V2_0.cs b/sdks/dotnet/basyx-core/BaSyx.Models.Export/aas-spec-v2.0/EnvironmentSubmodelElements/Operation_V2_0.cs
index 500b0b5..ed3f57e 100644
--- a/sdks/dotnet/basyx-core/BaSyx.Models.Export/aas-spec-v2.0/EnvironmentSubmodelElements/Operation_V2_0.cs
+++ b/sdks/dotnet/basyx-core/BaSyx.Models.Export/aas-spec-v2.0/EnvironmentSubmodelElements/Operation_V2_0.cs
@@ -23,7 +23,7 @@
public List<OperationVariable_V2_0> InputVariables { get; set; }
[JsonProperty("outputVariables")]
- [XmlElement(ElementName = "inputVariable"), JsonConverter(typeof(JsonOperationVariableConverter_V2_0))]
+ [XmlElement(ElementName = "outputVariable"), JsonConverter(typeof(JsonOperationVariableConverter_V2_0))]
public List<OperationVariable_V2_0> OutputVariables { get; set; }
[JsonProperty("inoutputVariables")]
diff --git a/sdks/dotnet/basyx-core/BaSyx.Models/Core/AssetAdministrationShell/References/KeyElements.cs b/sdks/dotnet/basyx-core/BaSyx.Models/Core/AssetAdministrationShell/References/KeyElements.cs
index 1c5de2c..64108d9 100644
--- a/sdks/dotnet/basyx-core/BaSyx.Models/Core/AssetAdministrationShell/References/KeyElements.cs
+++ b/sdks/dotnet/basyx-core/BaSyx.Models/Core/AssetAdministrationShell/References/KeyElements.cs
@@ -15,6 +15,8 @@
[DataContract]
public enum KeyElements : int
{
+ Undefined,
+
GlobalReference,
FragmentReference,
diff --git a/sdks/dotnet/basyx-core/BaSyx.Models/Core/AssetAdministrationShell/References/KeyType.cs b/sdks/dotnet/basyx-core/BaSyx.Models/Core/AssetAdministrationShell/References/KeyType.cs
index 95e58ea..c6c0f4c 100644
--- a/sdks/dotnet/basyx-core/BaSyx.Models/Core/AssetAdministrationShell/References/KeyType.cs
+++ b/sdks/dotnet/basyx-core/BaSyx.Models/Core/AssetAdministrationShell/References/KeyType.cs
@@ -15,6 +15,8 @@
[DataContract]
public enum KeyType
{
+ [EnumMember(Value = "Undefined")]
+ Undefined,
[EnumMember(Value = "Custom")]
Custom,
[EnumMember(Value = "IRI")]
diff --git a/sdks/dotnet/basyx-core/BaSyx.Utils/FileHandling/MimeTypes.cs b/sdks/dotnet/basyx-core/BaSyx.Utils/FileHandling/MimeTypes.cs
new file mode 100644
index 0000000..f018584
--- /dev/null
+++ b/sdks/dotnet/basyx-core/BaSyx.Utils/FileHandling/MimeTypes.cs
@@ -0,0 +1,26 @@
+using System.Collections.Generic;
+using System.IO;
+
+namespace BaSyx.Utils.FileHandling
+{
+ public static class MimeTypes
+ {
+ public static Dictionary<string, string> Mappings = new Dictionary<string, string>()
+ {
+ { ".stp", "application/step" },
+ { ".3dxml", "application/3dxml" }
+ };
+
+ public static bool TryGetContentType(string filePath, out string contentType)
+ {
+ string extension = Path.GetExtension(filePath);
+ if(Mappings.ContainsKey(extension))
+ {
+ contentType = Mappings[extension];
+ return true;
+ }
+ contentType = null;
+ return false;
+ }
+ }
+}
diff --git a/sdks/dotnet/basyx-examples/BaSyx.Examples.sln b/sdks/dotnet/basyx-examples/BaSyx.Examples.sln
index f9fbd20..d149b1d 100644
--- a/sdks/dotnet/basyx-examples/BaSyx.Examples.sln
+++ b/sdks/dotnet/basyx-examples/BaSyx.Examples.sln
@@ -7,7 +7,9 @@
EndProject
Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "SimpleAssetAdministrationShell", "SimpleAssetAdministrationShell\SimpleAssetAdministrationShell.csproj", "{070E0AC2-9D6A-4AEB-992D-781C57E9AE22}"
EndProject
-Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "MultiAssetAdministrationShell", "MultiAssetAdministrationShell\MultiAssetAdministrationShell.csproj", "{82FDA941-6905-48D5-91FD-2DCF7B97F1C5}"
+Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "MultiAssetAdministrationShell", "MultiAssetAdministrationShell\MultiAssetAdministrationShell.csproj", "{82FDA941-6905-48D5-91FD-2DCF7B97F1C5}"
+EndProject
+Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "BaSyx.AAS.Server.Http", "..\basyx-components\BaSyx.AAS.Server.Http\BaSyx.AAS.Server.Http.csproj", "{83D8FB4E-4F01-4C36-86A4-A932B505708F}"
EndProject
Global
GlobalSection(SolutionConfigurationPlatforms) = preSolution
@@ -27,6 +29,10 @@
{82FDA941-6905-48D5-91FD-2DCF7B97F1C5}.Debug|Any CPU.Build.0 = Debug|Any CPU
{82FDA941-6905-48D5-91FD-2DCF7B97F1C5}.Release|Any CPU.ActiveCfg = Release|Any CPU
{82FDA941-6905-48D5-91FD-2DCF7B97F1C5}.Release|Any CPU.Build.0 = Release|Any CPU
+ {83D8FB4E-4F01-4C36-86A4-A932B505708F}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
+ {83D8FB4E-4F01-4C36-86A4-A932B505708F}.Debug|Any CPU.Build.0 = Debug|Any CPU
+ {83D8FB4E-4F01-4C36-86A4-A932B505708F}.Release|Any CPU.ActiveCfg = Release|Any CPU
+ {83D8FB4E-4F01-4C36-86A4-A932B505708F}.Release|Any CPU.Build.0 = Release|Any CPU
EndGlobalSection
GlobalSection(SolutionProperties) = preSolution
HideSolutionNode = FALSE
diff --git a/sdks/dotnet/basyx-examples/MultiAssetAdministrationShell/MultiAssetAdministrationShell.csproj b/sdks/dotnet/basyx-examples/MultiAssetAdministrationShell/MultiAssetAdministrationShell.csproj
index 8b5e80e..c4234f8 100644
--- a/sdks/dotnet/basyx-examples/MultiAssetAdministrationShell/MultiAssetAdministrationShell.csproj
+++ b/sdks/dotnet/basyx-examples/MultiAssetAdministrationShell/MultiAssetAdministrationShell.csproj
@@ -15,7 +15,7 @@
</PropertyGroup>
<ItemGroup>
- <PackageReference Include="BaSyx.AAS.Server.Http" Version="1.0.0" />
+ <ProjectReference Include="..\..\basyx-components\BaSyx.AAS.Server.Http\BaSyx.AAS.Server.Http.csproj" />
</ItemGroup>
<ItemGroup>
diff --git a/sdks/dotnet/basyx-examples/MultiAssetAdministrationShell/Program.cs b/sdks/dotnet/basyx-examples/MultiAssetAdministrationShell/Program.cs
index b115813..957df78 100644
--- a/sdks/dotnet/basyx-examples/MultiAssetAdministrationShell/Program.cs
+++ b/sdks/dotnet/basyx-examples/MultiAssetAdministrationShell/Program.cs
@@ -13,8 +13,10 @@
using BaSyx.API.Components;
using BaSyx.Models.Connectivity;
using BaSyx.Models.Core.AssetAdministrationShell.Enums;
+using BaSyx.Models.Core.AssetAdministrationShell.Generics;
using BaSyx.Models.Core.AssetAdministrationShell.Identification;
using BaSyx.Models.Core.AssetAdministrationShell.Implementations;
+using BaSyx.Models.Core.AssetAdministrationShell.Implementations.SubmodelElementTypes;
using BaSyx.Models.Core.AssetAdministrationShell.References;
using BaSyx.Models.Core.Common;
using BaSyx.Utils.Settings.Types;
@@ -66,7 +68,14 @@
aas.Submodels.Create(new Submodel()
{
Identification = new Identifier("http://basys40.de/submodels/" + Guid.NewGuid().ToString(), KeyType.IRI),
- IdShort = "TestSubmodel"
+ IdShort = "TestSubmodel",
+ SubmodelElements = new ElementContainer<ISubmodelElement>()
+ {
+ new Property<string>()
+ {
+ IdShort = "Property_" + i
+ }
+ }
});
var aasServiceProvider = aas.CreateServiceProvider(true);
diff --git a/sdks/dotnet/basyx-packages/BaSyx.AAS.Client.Http.1.0.0.nupkg b/sdks/dotnet/basyx-packages/BaSyx.AAS.Client.Http.1.0.0.nupkg
index a688d23..49eeacb 100644
--- a/sdks/dotnet/basyx-packages/BaSyx.AAS.Client.Http.1.0.0.nupkg
+++ b/sdks/dotnet/basyx-packages/BaSyx.AAS.Client.Http.1.0.0.nupkg
Binary files differ
diff --git a/sdks/dotnet/basyx-packages/BaSyx.AAS.Client.Http.1.0.0.symbols.nupkg b/sdks/dotnet/basyx-packages/BaSyx.AAS.Client.Http.1.0.0.symbols.nupkg
index aa930da..a3538a3 100644
--- a/sdks/dotnet/basyx-packages/BaSyx.AAS.Client.Http.1.0.0.symbols.nupkg
+++ b/sdks/dotnet/basyx-packages/BaSyx.AAS.Client.Http.1.0.0.symbols.nupkg
Binary files differ
diff --git a/sdks/dotnet/basyx-packages/BaSyx.AAS.Server.Http.1.0.0.nupkg b/sdks/dotnet/basyx-packages/BaSyx.AAS.Server.Http.1.0.0.nupkg
index 35cef24..aa84efb 100644
--- a/sdks/dotnet/basyx-packages/BaSyx.AAS.Server.Http.1.0.0.nupkg
+++ b/sdks/dotnet/basyx-packages/BaSyx.AAS.Server.Http.1.0.0.nupkg
Binary files differ
diff --git a/sdks/dotnet/basyx-packages/BaSyx.AAS.Server.Http.1.0.0.symbols.nupkg b/sdks/dotnet/basyx-packages/BaSyx.AAS.Server.Http.1.0.0.symbols.nupkg
index 30eb2fa..89052bf 100644
--- a/sdks/dotnet/basyx-packages/BaSyx.AAS.Server.Http.1.0.0.symbols.nupkg
+++ b/sdks/dotnet/basyx-packages/BaSyx.AAS.Server.Http.1.0.0.symbols.nupkg
Binary files differ
diff --git a/sdks/dotnet/basyx-packages/BaSyx.API.1.0.0.nupkg b/sdks/dotnet/basyx-packages/BaSyx.API.1.0.0.nupkg
index 8b6697c..d268bdd 100644
--- a/sdks/dotnet/basyx-packages/BaSyx.API.1.0.0.nupkg
+++ b/sdks/dotnet/basyx-packages/BaSyx.API.1.0.0.nupkg
Binary files differ
diff --git a/sdks/dotnet/basyx-packages/BaSyx.API.1.0.0.symbols.nupkg b/sdks/dotnet/basyx-packages/BaSyx.API.1.0.0.symbols.nupkg
index 7814eaf..2ce6b02 100644
--- a/sdks/dotnet/basyx-packages/BaSyx.API.1.0.0.symbols.nupkg
+++ b/sdks/dotnet/basyx-packages/BaSyx.API.1.0.0.symbols.nupkg
Binary files differ
diff --git a/sdks/dotnet/basyx-packages/BaSyx.API.Http.Controllers.1.0.0.nupkg b/sdks/dotnet/basyx-packages/BaSyx.API.Http.Controllers.1.0.0.nupkg
index aaca7cf..1333ac2 100644
--- a/sdks/dotnet/basyx-packages/BaSyx.API.Http.Controllers.1.0.0.nupkg
+++ b/sdks/dotnet/basyx-packages/BaSyx.API.Http.Controllers.1.0.0.nupkg
Binary files differ
diff --git a/sdks/dotnet/basyx-packages/BaSyx.API.Http.Controllers.1.0.0.symbols.nupkg b/sdks/dotnet/basyx-packages/BaSyx.API.Http.Controllers.1.0.0.symbols.nupkg
index 73b8d99..9077495 100644
--- a/sdks/dotnet/basyx-packages/BaSyx.API.Http.Controllers.1.0.0.symbols.nupkg
+++ b/sdks/dotnet/basyx-packages/BaSyx.API.Http.Controllers.1.0.0.symbols.nupkg
Binary files differ
diff --git a/sdks/dotnet/basyx-packages/BaSyx.API.Http.Controllers.AASX.1.0.0.nupkg b/sdks/dotnet/basyx-packages/BaSyx.API.Http.Controllers.AASX.1.0.0.nupkg
new file mode 100644
index 0000000..17f604e
--- /dev/null
+++ b/sdks/dotnet/basyx-packages/BaSyx.API.Http.Controllers.AASX.1.0.0.nupkg
Binary files differ
diff --git a/sdks/dotnet/basyx-packages/BaSyx.API.Http.Controllers.AASX.1.0.0.symbols.nupkg b/sdks/dotnet/basyx-packages/BaSyx.API.Http.Controllers.AASX.1.0.0.symbols.nupkg
new file mode 100644
index 0000000..bb725b6
--- /dev/null
+++ b/sdks/dotnet/basyx-packages/BaSyx.API.Http.Controllers.AASX.1.0.0.symbols.nupkg
Binary files differ
diff --git a/sdks/dotnet/basyx-packages/BaSyx.Models.1.0.0.nupkg b/sdks/dotnet/basyx-packages/BaSyx.Models.1.0.0.nupkg
index f09ec32..3d949f9 100644
--- a/sdks/dotnet/basyx-packages/BaSyx.Models.1.0.0.nupkg
+++ b/sdks/dotnet/basyx-packages/BaSyx.Models.1.0.0.nupkg
Binary files differ
diff --git a/sdks/dotnet/basyx-packages/BaSyx.Models.1.0.0.symbols.nupkg b/sdks/dotnet/basyx-packages/BaSyx.Models.1.0.0.symbols.nupkg
index eb2d6ca..8f750a6 100644
--- a/sdks/dotnet/basyx-packages/BaSyx.Models.1.0.0.symbols.nupkg
+++ b/sdks/dotnet/basyx-packages/BaSyx.Models.1.0.0.symbols.nupkg
Binary files differ
diff --git a/sdks/dotnet/basyx-packages/BaSyx.Models.Export.1.0.0.nupkg b/sdks/dotnet/basyx-packages/BaSyx.Models.Export.1.0.0.nupkg
index 785e780..9bdf508 100644
--- a/sdks/dotnet/basyx-packages/BaSyx.Models.Export.1.0.0.nupkg
+++ b/sdks/dotnet/basyx-packages/BaSyx.Models.Export.1.0.0.nupkg
Binary files differ
diff --git a/sdks/dotnet/basyx-packages/BaSyx.Models.Export.1.0.0.symbols.nupkg b/sdks/dotnet/basyx-packages/BaSyx.Models.Export.1.0.0.symbols.nupkg
index 6eabf17..68cdcc1 100644
--- a/sdks/dotnet/basyx-packages/BaSyx.Models.Export.1.0.0.symbols.nupkg
+++ b/sdks/dotnet/basyx-packages/BaSyx.Models.Export.1.0.0.symbols.nupkg
Binary files differ
diff --git a/sdks/dotnet/basyx-packages/BaSyx.Registry.Client.Http.1.0.0.nupkg b/sdks/dotnet/basyx-packages/BaSyx.Registry.Client.Http.1.0.0.nupkg
index 5210299..c914584 100644
--- a/sdks/dotnet/basyx-packages/BaSyx.Registry.Client.Http.1.0.0.nupkg
+++ b/sdks/dotnet/basyx-packages/BaSyx.Registry.Client.Http.1.0.0.nupkg
Binary files differ
diff --git a/sdks/dotnet/basyx-packages/BaSyx.Registry.Client.Http.1.0.0.symbols.nupkg b/sdks/dotnet/basyx-packages/BaSyx.Registry.Client.Http.1.0.0.symbols.nupkg
index d73381d..31310a5 100644
--- a/sdks/dotnet/basyx-packages/BaSyx.Registry.Client.Http.1.0.0.symbols.nupkg
+++ b/sdks/dotnet/basyx-packages/BaSyx.Registry.Client.Http.1.0.0.symbols.nupkg
Binary files differ
diff --git a/sdks/dotnet/basyx-packages/BaSyx.Registry.ReferenceImpl.FileBased.1.0.0.nupkg b/sdks/dotnet/basyx-packages/BaSyx.Registry.ReferenceImpl.FileBased.1.0.0.nupkg
index 5eb65f1..30d236c 100644
--- a/sdks/dotnet/basyx-packages/BaSyx.Registry.ReferenceImpl.FileBased.1.0.0.nupkg
+++ b/sdks/dotnet/basyx-packages/BaSyx.Registry.ReferenceImpl.FileBased.1.0.0.nupkg
Binary files differ
diff --git a/sdks/dotnet/basyx-packages/BaSyx.Registry.ReferenceImpl.FileBased.1.0.0.symbols.nupkg b/sdks/dotnet/basyx-packages/BaSyx.Registry.ReferenceImpl.FileBased.1.0.0.symbols.nupkg
index 3c29147..b07207c 100644
--- a/sdks/dotnet/basyx-packages/BaSyx.Registry.ReferenceImpl.FileBased.1.0.0.symbols.nupkg
+++ b/sdks/dotnet/basyx-packages/BaSyx.Registry.ReferenceImpl.FileBased.1.0.0.symbols.nupkg
Binary files differ
diff --git a/sdks/dotnet/basyx-packages/BaSyx.Registry.Server.Http.1.0.0.nupkg b/sdks/dotnet/basyx-packages/BaSyx.Registry.Server.Http.1.0.0.nupkg
index 8774045..9b374ee 100644
--- a/sdks/dotnet/basyx-packages/BaSyx.Registry.Server.Http.1.0.0.nupkg
+++ b/sdks/dotnet/basyx-packages/BaSyx.Registry.Server.Http.1.0.0.nupkg
Binary files differ
diff --git a/sdks/dotnet/basyx-packages/BaSyx.Registry.Server.Http.1.0.0.symbols.nupkg b/sdks/dotnet/basyx-packages/BaSyx.Registry.Server.Http.1.0.0.symbols.nupkg
index be4f99c..64019f4 100644
--- a/sdks/dotnet/basyx-packages/BaSyx.Registry.Server.Http.1.0.0.symbols.nupkg
+++ b/sdks/dotnet/basyx-packages/BaSyx.Registry.Server.Http.1.0.0.symbols.nupkg
Binary files differ
diff --git a/sdks/dotnet/basyx-packages/BaSyx.Submodel.Client.Http.1.0.0.nupkg b/sdks/dotnet/basyx-packages/BaSyx.Submodel.Client.Http.1.0.0.nupkg
index 1f9b352..3bec657 100644
--- a/sdks/dotnet/basyx-packages/BaSyx.Submodel.Client.Http.1.0.0.nupkg
+++ b/sdks/dotnet/basyx-packages/BaSyx.Submodel.Client.Http.1.0.0.nupkg
Binary files differ
diff --git a/sdks/dotnet/basyx-packages/BaSyx.Submodel.Client.Http.1.0.0.symbols.nupkg b/sdks/dotnet/basyx-packages/BaSyx.Submodel.Client.Http.1.0.0.symbols.nupkg
index 4bda363..c05b310 100644
--- a/sdks/dotnet/basyx-packages/BaSyx.Submodel.Client.Http.1.0.0.symbols.nupkg
+++ b/sdks/dotnet/basyx-packages/BaSyx.Submodel.Client.Http.1.0.0.symbols.nupkg
Binary files differ
diff --git a/sdks/dotnet/basyx-packages/BaSyx.Submodel.Server.Http.1.0.0.nupkg b/sdks/dotnet/basyx-packages/BaSyx.Submodel.Server.Http.1.0.0.nupkg
index ace60bf..719e719 100644
--- a/sdks/dotnet/basyx-packages/BaSyx.Submodel.Server.Http.1.0.0.nupkg
+++ b/sdks/dotnet/basyx-packages/BaSyx.Submodel.Server.Http.1.0.0.nupkg
Binary files differ
diff --git a/sdks/dotnet/basyx-packages/BaSyx.Submodel.Server.Http.1.0.0.symbols.nupkg b/sdks/dotnet/basyx-packages/BaSyx.Submodel.Server.Http.1.0.0.symbols.nupkg
index 3807ab6..dd70c5a 100644
--- a/sdks/dotnet/basyx-packages/BaSyx.Submodel.Server.Http.1.0.0.symbols.nupkg
+++ b/sdks/dotnet/basyx-packages/BaSyx.Submodel.Server.Http.1.0.0.symbols.nupkg
Binary files differ
diff --git a/sdks/dotnet/basyx-packages/BaSyx.Submodel.ServiceProvider.Distributed.1.0.0.nupkg b/sdks/dotnet/basyx-packages/BaSyx.Submodel.ServiceProvider.Distributed.1.0.0.nupkg
index a28f040..ff2108d 100644
--- a/sdks/dotnet/basyx-packages/BaSyx.Submodel.ServiceProvider.Distributed.1.0.0.nupkg
+++ b/sdks/dotnet/basyx-packages/BaSyx.Submodel.ServiceProvider.Distributed.1.0.0.nupkg
Binary files differ
diff --git a/sdks/dotnet/basyx-packages/BaSyx.Submodel.ServiceProvider.Distributed.1.0.0.symbols.nupkg b/sdks/dotnet/basyx-packages/BaSyx.Submodel.ServiceProvider.Distributed.1.0.0.symbols.nupkg
index 1b97945..ab1114c 100644
--- a/sdks/dotnet/basyx-packages/BaSyx.Submodel.ServiceProvider.Distributed.1.0.0.symbols.nupkg
+++ b/sdks/dotnet/basyx-packages/BaSyx.Submodel.ServiceProvider.Distributed.1.0.0.symbols.nupkg
Binary files differ
diff --git a/sdks/dotnet/basyx-packages/BaSyx.Utils.1.0.0.nupkg b/sdks/dotnet/basyx-packages/BaSyx.Utils.1.0.0.nupkg
index fdf188c..00e1d6b 100644
--- a/sdks/dotnet/basyx-packages/BaSyx.Utils.1.0.0.nupkg
+++ b/sdks/dotnet/basyx-packages/BaSyx.Utils.1.0.0.nupkg
Binary files differ
diff --git a/sdks/dotnet/basyx-packages/BaSyx.Utils.1.0.0.symbols.nupkg b/sdks/dotnet/basyx-packages/BaSyx.Utils.1.0.0.symbols.nupkg
index fdd7d2e..e5ea54e 100644
--- a/sdks/dotnet/basyx-packages/BaSyx.Utils.1.0.0.symbols.nupkg
+++ b/sdks/dotnet/basyx-packages/BaSyx.Utils.1.0.0.symbols.nupkg
Binary files differ