Skip to content

Commit 34a6d6f

Browse files
authored
Fix load_directory silently dropping all descriptors (#545)
Previously `load_directory()` called `read_server_aas_json_file_into()`, which internally only adds items where `isinstance(item, model.Identifiable)`. `AssetAdministrationShellDescriptor` and `SubmodelDescriptor` are not `Identifiable`, so all descriptors were silently skipped. The registry always started empty. This parses descriptor JSON directly with `ServerAASFromJsonDecoder` and add items to `DictDescriptorStore`. Fixes #544
1 parent cd39f2e commit 34a6d6f

2 files changed

Lines changed: 27 additions & 44 deletions

File tree

server/app/adapter/jsonization.py

Lines changed: 3 additions & 24 deletions
Original file line numberDiff line numberDiff line change
@@ -1,10 +1,10 @@
11
import logging
2-
from typing import Callable, Dict, Optional, Set, Type
2+
from typing import Callable, Dict, Type
33

44
from basyx.aas import model
5-
from basyx.aas.adapter._generic import ASSET_KIND, ASSET_KIND_INVERSE, JSON_AAS_TOP_LEVEL_KEYS_TO_TYPES, PathOrIO
5+
from basyx.aas.adapter._generic import ASSET_KIND, ASSET_KIND_INVERSE, JSON_AAS_TOP_LEVEL_KEYS_TO_TYPES
66
from basyx.aas.adapter.json import AASToJsonEncoder
7-
from basyx.aas.adapter.json.json_deserialization import AASFromJsonDecoder, _get_ts, read_aas_json_file_into
7+
from basyx.aas.adapter.json.json_deserialization import AASFromJsonDecoder, _get_ts
88

99
import app.model as server_model
1010

@@ -207,27 +207,6 @@ class ServerStrictStrippedAASFromJsonDecoder(ServerStrictAASFromJsonDecoder, Ser
207207
pass
208208

209209

210-
def read_server_aas_json_file_into(
211-
object_store: model.AbstractObjectStore,
212-
file: PathOrIO,
213-
replace_existing: bool = False,
214-
ignore_existing: bool = False,
215-
failsafe: bool = True,
216-
stripped: bool = False,
217-
decoder: Optional[Type[AASFromJsonDecoder]] = None,
218-
) -> Set[model.Identifier]:
219-
return read_aas_json_file_into(
220-
object_store=object_store,
221-
file=file,
222-
replace_existing=replace_existing,
223-
ignore_existing=ignore_existing,
224-
failsafe=failsafe,
225-
stripped=stripped,
226-
decoder=decoder,
227-
keys_to_types=JSON_SERVER_AAS_TOP_LEVEL_KEYS_TO_TYPES,
228-
)
229-
230-
231210
class ServerAASToJsonEncoder(AASToJsonEncoder):
232211

233212
@classmethod

server/app/model/provider.py

Lines changed: 24 additions & 20 deletions
Original file line numberDiff line numberDiff line change
@@ -1,10 +1,11 @@
1+
import json
12
from pathlib import Path
23
from typing import IO, Dict, Iterable, Iterator, Union
34

45
from basyx.aas import model
56
from basyx.aas.model import provider as sdk_provider
67

7-
import app.adapter as adapter
8+
from app.adapter import ServerAASFromJsonDecoder
89
from app.model import descriptor
910

1011
PathOrIO = Union[Path, IO]
@@ -53,27 +54,30 @@ def __iter__(self) -> Iterator[_DESCRIPTOR_TYPE]:
5354

5455
def load_directory(directory: Union[Path, str]) -> DictDescriptorStore:
5556
"""
56-
Create a new :class:`~basyx.aas.model.provider.DictIdentifiableStore` and use it to load Asset Administration Shell
57-
and Submodel files in ``AASX``, ``JSON`` and ``XML`` format from a given directory into memory. Additionally, load
58-
all embedded supplementary files into a new :class:`~basyx.aas.adapter.aasx.DictSupplementaryFileContainer`.
59-
60-
:param directory: :class:`~pathlib.Path` or ``str`` pointing to the directory containing all Asset Administration
61-
Shell and Submodel files to load
62-
:return: Tuple consisting of a :class:`~basyx.aas.model.provider.DictIdentifiableStore` and a
63-
:class:`~basyx.aas.adapter.aasx.DictSupplementaryFileContainer` containing all loaded data
64-
"""
65-
66-
dict_descriptor_store: DictDescriptorStore = DictDescriptorStore()
57+
Load AAS/Submodel descriptor JSON files from a directory into a :class:`DictDescriptorStore`.
6758
59+
:param directory: Path to the directory containing JSON descriptor files
60+
:return: Populated :class:`DictDescriptorStore`
61+
"""
62+
store = DictDescriptorStore()
6863
directory = Path(directory)
6964

7065
for file in directory.iterdir():
71-
if not file.is_file():
66+
if not file.is_file() or file.suffix.lower() != ".json":
7267
continue
73-
74-
suffix = file.suffix.lower()
75-
if suffix == ".json":
76-
with open(file) as f:
77-
adapter.read_server_aas_json_file_into(dict_descriptor_store, f)
78-
79-
return dict_descriptor_store
68+
with open(file) as f:
69+
data = json.load(f, cls=ServerAASFromJsonDecoder)
70+
for item in data.get("assetAdministrationShellDescriptors", []):
71+
if isinstance(item, descriptor.AssetAdministrationShellDescriptor):
72+
try:
73+
store.add(item)
74+
except KeyError:
75+
pass
76+
for item in data.get("submodelDescriptors", []):
77+
if isinstance(item, descriptor.SubmodelDescriptor):
78+
try:
79+
store.add(item)
80+
except KeyError:
81+
pass
82+
83+
return store

0 commit comments

Comments
 (0)