Skip to content

Commit 0226071

Browse files
committed
chore(wip): odata code generation
1 parent 029c3fd commit 0226071

9 files changed

Lines changed: 721 additions & 413 deletions

File tree

frost_server/docker-compose.yaml

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -5,6 +5,7 @@ services:
55
# For all settings see: https://fraunhoferiosb.github.io/FROST-Server/settings/settings.html
66
- serviceRootUrl=http://localhost:8080/FROST-Server
77
- plugins_multiDatastream.enable=false
8+
- plugins_odata.enable=true
89
- http_cors_enable=true
910
- http_cors_allowed_origins=*
1011
- persistence_db_driver=org.postgresql.Driver
@@ -41,4 +42,3 @@ services:
4142

4243
volumes:
4344
postgis_volume:
44-

frost_sta_client/__init__.py

Lines changed: 6 additions & 29 deletions
Original file line numberDiff line numberDiff line change
@@ -1,34 +1,11 @@
1-
from frost_sta_client import model
2-
from frost_sta_client import dao
3-
from frost_sta_client import query
4-
from frost_sta_client import service
5-
6-
from frost_sta_client.model.actuator import Actuator
7-
from frost_sta_client.model.datastream import Datastream
8-
from frost_sta_client.model.entity import Entity
9-
from frost_sta_client.model.feature_of_interest import FeatureOfInterest
10-
from frost_sta_client.model.historical_location import HistoricalLocation
11-
from frost_sta_client.model.location import Location
12-
from frost_sta_client.model.multi_datastream import MultiDatastream
13-
from frost_sta_client.model.observation import Observation
14-
from frost_sta_client.model.observedproperty import ObservedProperty
15-
from frost_sta_client.model.sensor import Sensor
16-
from frost_sta_client.model.task import Task
17-
from frost_sta_client.model.tasking_capability import TaskingCapability
18-
from frost_sta_client.model.thing import Thing
19-
from frost_sta_client.generated.odata.datamodel import UnitOfMeasurement
20-
from frost_sta_client.service.sensorthingsservice import SensorThingsService
21-
from frost_sta_client.service.auth_handler import AuthHandler
22-
from frost_sta_client.model.ext.entity_type import EntityTypes
23-
from frost_sta_client.model.ext.entity_list import EntityList
24-
from frost_sta_client.model.ext.data_array_value import DataArrayValue
25-
from frost_sta_client.model.ext.data_array_document import DataArrayDocument
26-
271
import jsonpickle
282

3+
# Configure jsonpickle backend
294
jsonpickle.load_backend('demjson3', 'encode', 'decode', 'JSONDecodeError')
305
jsonpickle.set_preferred_backend('demjson3')
31-
jsonpickle.set_decoder_options("demjson3", decode_float=float)
6+
jsonpickle.set_decoder_options('demjson3', decode_float=float)
327

33-
from .__version__ import (__title__, __version__, __license__, __author__, __contact__, __url__,
34-
__description__, __copyright__)
8+
from .__version__ import (
9+
__title__, __version__, __license__, __author__, __contact__, __url__,
10+
__description__, __copyright__
11+
)

frost_sta_client/cli.py

Lines changed: 3 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -6,10 +6,8 @@
66

77
def main(argv: Optional[list] = None) -> int:
88
parser = argparse.ArgumentParser(prog="frost-codegen", description="FROST-STA OData code generator")
9-
# Support README's --output-dir in addition to --out
10-
parser.add_argument("--output-dir", dest="out", help="Output directory for generated code (alias of --out)")
11-
parser.add_argument("--url", "-u", required=True, help="Base URL of FROST-Server (e.g., http://host:8080/FROST-Server)")
12-
parser.add_argument("--out", "-o", default="frost_sta_client/generated/odata", help="Output directory for generated code")
9+
parser.add_argument("--url", "-u", required=True, help="OData endpoint of FROST-Server (e.g., http://host:8080/FROST-Server/ODATA_4.01)")
10+
parser.add_argument("--output-dir", "-o", default="frost_sta_client/generated/odata", help="Output directory for generated code")
1311
parser.add_argument("--module", "-m", default="datamodel", help="Module name for the generated file (default: datamodel)")
1412
parser.add_argument("--username", help="Basic auth username", default=None)
1513
parser.add_argument("--password", help="Basic auth password", default=None)
@@ -20,10 +18,9 @@ def main(argv: Optional[list] = None) -> int:
2018
auth = (args.username, args.password or "")
2119

2220
try:
23-
out_path = generate_from_url(args.url, args.out, args.module, auth=auth)
21+
out_path = generate_from_url(args.url, args.output_dir, args.module, auth=auth)
2422
return 0
2523
except RuntimeError as e:
26-
# Print message to stdout to mirror README-friendly UX but remain non-failing for CI that tolerates fallback.
2724
print(str(e))
2825
return 0 # Fallback to existing model is acceptable
2926
except Exception as e:

frost_sta_client/metadata.xml

Lines changed: 170 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,170 @@
1+
<?xml version="1.0" encoding="utf-8"?>
2+
<edmx:Edmx Version="4.01" xmlns:edmx="http://docs.oasis-open.org/odata/ns/edmx">
3+
<edmx:DataServices>
4+
<Schema Namespace="STA" xmlns="http://docs.oasis-open.org/odata/ns/edm">
5+
<ComplexType Name="UnitOfMeasurement">
6+
<Property Name="Name" Type="Edm.String"/>
7+
<Property Name="Symbol" Type="Edm.String"/>
8+
<Property Name="Definition" Type="Edm.String"/>
9+
</ComplexType>
10+
11+
<EntityType Name="Actuator">
12+
<Key><PropertyRef Name="Id"/></Key>
13+
<Property Name="Id" Type="Edm.Int32" Nullable="false"/>
14+
<Property Name="Name" Type="Edm.String"/>
15+
<Property Name="Description" Type="Edm.String"/>
16+
<Property Name="EncodingType" Type="Edm.String"/>
17+
<Property Name="Metadata" Type="Edm.String"/>
18+
<Property Name="Properties" Type="Edm.Untyped"/>
19+
<NavigationProperty Name="TaskingCapabilities" Type="Collection(STA.TaskingCapability)"/>
20+
</EntityType>
21+
22+
<EntityType Name="Datastream">
23+
<Key><PropertyRef Name="Id"/></Key>
24+
<Property Name="Id" Type="Edm.Int32" Nullable="false"/>
25+
<Property Name="Name" Type="Edm.String"/>
26+
<Property Name="Description" Type="Edm.String"/>
27+
<Property Name="ObservationType" Type="Edm.String"/>
28+
<Property Name="UnitOfMeasurement" Type="STA.UnitOfMeasurement"/>
29+
<Property Name="Properties" Type="Edm.Untyped"/>
30+
<NavigationProperty Name="Thing" Type="STA.Thing"/>
31+
<NavigationProperty Name="Sensor" Type="STA.Sensor"/>
32+
<NavigationProperty Name="ObservedProperty" Type="STA.ObservedProperty"/>
33+
<NavigationProperty Name="Observations" Type="Collection(STA.Observation)"/>
34+
</EntityType>
35+
36+
<EntityType Name="FeatureOfInterest">
37+
<Key><PropertyRef Name="Id"/></Key>
38+
<Property Name="Id" Type="Edm.Int32" Nullable="false"/>
39+
<Property Name="Name" Type="Edm.String"/>
40+
<Property Name="Description" Type="Edm.String"/>
41+
<Property Name="EncodingType" Type="Edm.String"/>
42+
<Property Name="Feature" Type="Edm.GeometryPoint"/>
43+
<Property Name="Properties" Type="Edm.Untyped"/>
44+
<NavigationProperty Name="Observations" Type="Collection(STA.Observation)"/>
45+
</EntityType>
46+
47+
<EntityType Name="HistoricalLocation">
48+
<Key><PropertyRef Name="Id"/></Key>
49+
<Property Name="Id" Type="Edm.Int32" Nullable="false"/>
50+
<Property Name="Time" Type="Edm.DateTimeOffset"/>
51+
<NavigationProperty Name="Thing" Type="STA.Thing"/>
52+
<NavigationProperty Name="Locations" Type="Collection(STA.Location)"/>
53+
</EntityType>
54+
55+
<EntityType Name="Location">
56+
<Key><PropertyRef Name="Id"/></Key>
57+
<Property Name="Id" Type="Edm.Int32" Nullable="false"/>
58+
<Property Name="Name" Type="Edm.String"/>
59+
<Property Name="Description" Type="Edm.String"/>
60+
<Property Name="EncodingType" Type="Edm.String"/>
61+
<Property Name="Location" Type="Edm.GeometryPoint"/>
62+
<NavigationProperty Name="Things" Type="Collection(STA.Thing)"/>
63+
<NavigationProperty Name="HistoricalLocations" Type="Collection(STA.HistoricalLocation)"/>
64+
</EntityType>
65+
66+
<EntityType Name="MultiDatastream">
67+
<Key><PropertyRef Name="Id"/></Key>
68+
<Property Name="Id" Type="Edm.Int32" Nullable="false"/>
69+
<Property Name="Name" Type="Edm.String"/>
70+
<Property Name="Description" Type="Edm.String"/>
71+
<Property Name="ObservationType" Type="Edm.String"/>
72+
<Property Name="ObservedArea" Type="Edm.Geometry"/>
73+
<Property Name="MultiObservationDataTypes" Type="Edm.String"/>
74+
<Property Name="Properties" Type="Edm.Untyped"/>
75+
<NavigationProperty Name="Thing" Type="STA.Thing"/>
76+
<NavigationProperty Name="Sensor" Type="STA.Sensor"/>
77+
<NavigationProperty Name="ObservedProperties" Type="Collection(STA.ObservedProperty)"/>
78+
<NavigationProperty Name="Observations" Type="Collection(STA.Observation)"/>
79+
</EntityType>
80+
81+
<EntityType Name="Observation">
82+
<Key><PropertyRef Name="Id"/></Key>
83+
<Property Name="Id" Type="Edm.String" Nullable="false"/>
84+
<Property Name="Result" Type="Edm.Untyped"/>
85+
<Property Name="PhenomenonTime" Type="Edm.DateTimeOffset"/>
86+
<Property Name="ResultTime" Type="Edm.DateTimeOffset"/>
87+
<Property Name="ResultQuality" Type="Edm.String"/>
88+
<Property Name="ValidTime" Type="Edm.String"/>
89+
<Property Name="Parameters" Type="Edm.Untyped"/>
90+
<NavigationProperty Name="FeatureOfInterest" Type="STA.FeatureOfInterest"/>
91+
<NavigationProperty Name="Datastream" Type="STA.Datastream"/>
92+
<NavigationProperty Name="MultiDatastream" Type="STA.MultiDatastream"/>
93+
</EntityType>
94+
95+
<EntityType Name="ObservedProperty">
96+
<Key><PropertyRef Name="Id"/></Key>
97+
<Property Name="Id" Type="Edm.Int32" Nullable="false"/>
98+
<Property Name="Name" Type="Edm.String"/>
99+
<Property Name="Definition" Type="Edm.String"/>
100+
<Property Name="Description" Type="Edm.String"/>
101+
<Property Name="Properties" Type="Edm.Untyped"/>
102+
<NavigationProperty Name="Datastreams" Type="Collection(STA.Datastream)"/>
103+
<NavigationProperty Name="MultiDatastreams" Type="Collection(STA.MultiDatastream)"/>
104+
</EntityType>
105+
106+
<EntityType Name="Sensor">
107+
<Key><PropertyRef Name="Id"/></Key>
108+
<Property Name="Id" Type="Edm.Int32" Nullable="false"/>
109+
<Property Name="Name" Type="Edm.String"/>
110+
<Property Name="Description" Type="Edm.String"/>
111+
<Property Name="EncodingType" Type="Edm.String"/>
112+
<Property Name="Metadata" Type="Edm.String"/>
113+
<Property Name="Properties" Type="Edm.Untyped"/>
114+
<NavigationProperty Name="Datastreams" Type="Collection(STA.Datastream)"/>
115+
<NavigationProperty Name="MultiDatastreams" Type="Collection(STA.MultiDatastream)"/>
116+
</EntityType>
117+
118+
<EntityType Name="Task">
119+
<Key><PropertyRef Name="Id"/></Key>
120+
<Property Name="Id" Type="Edm.Int32" Nullable="false"/>
121+
<Property Name="Name" Type="Edm.String"/>
122+
<Property Name="Description" Type="Edm.String"/>
123+
<Property Name="TaskingParameters" Type="Edm.Untyped"/>
124+
<Property Name="CreationTime" Type="Edm.DateTimeOffset"/>
125+
<Property Name="Properties" Type="Edm.Untyped"/>
126+
<NavigationProperty Name="TaskingCapability" Type="STA.TaskingCapability"/>
127+
</EntityType>
128+
129+
<EntityType Name="TaskingCapability">
130+
<Key><PropertyRef Name="Id"/></Key>
131+
<Property Name="Id" Type="Edm.Int32" Nullable="false"/>
132+
<Property Name="Name" Type="Edm.String"/>
133+
<Property Name="Description" Type="Edm.String"/>
134+
<Property Name="TaskingParameters" Type="Edm.Untyped"/>
135+
<Property Name="Properties" Type="Edm.Untyped"/>
136+
<NavigationProperty Name="Tasks" Type="Collection(STA.Task)"/>
137+
<NavigationProperty Name="Actuator" Type="STA.Actuator"/>
138+
<NavigationProperty Name="Thing" Type="STA.Thing"/>
139+
</EntityType>
140+
141+
<EntityType Name="Thing">
142+
<Key><PropertyRef Name="Id"/></Key>
143+
<Property Name="Id" Type="Edm.Int32" Nullable="false"/>
144+
<Property Name="Name" Type="Edm.String"/>
145+
<Property Name="Description" Type="Edm.String"/>
146+
<Property Name="Properties" Type="Edm.Untyped"/>
147+
<NavigationProperty Name="Datastreams" Type="Collection(STA.Datastream)"/>
148+
<NavigationProperty Name="MultiDatastreams" Type="Collection(STA.MultiDatastream)"/>
149+
<NavigationProperty Name="Locations" Type="Collection(STA.Location)"/>
150+
<NavigationProperty Name="HistoricalLocations" Type="Collection(STA.HistoricalLocation)"/>
151+
<NavigationProperty Name="TaskingCapabilities" Type="Collection(STA.TaskingCapability)"/>
152+
</EntityType>
153+
154+
<EntityContainer Name="Container">
155+
<EntitySet Name="Actuators" EntityType="STA.Actuator"/>
156+
<EntitySet Name="Datastreams" EntityType="STA.Datastream"/>
157+
<EntitySet Name="FeaturesOfInterest" EntityType="STA.FeatureOfInterest"/>
158+
<EntitySet Name="HistoricalLocations" EntityType="STA.HistoricalLocation"/>
159+
<EntitySet Name="Locations" EntityType="STA.Location"/>
160+
<EntitySet Name="MultiDatastreams" EntityType="STA.MultiDatastream"/>
161+
<EntitySet Name="Observations" EntityType="STA.Observation"/>
162+
<EntitySet Name="ObservedProperties" EntityType="STA.ObservedProperty"/>
163+
<EntitySet Name="Sensors" EntityType="STA.Sensor"/>
164+
<EntitySet Name="Tasks" EntityType="STA.Task"/>
165+
<EntitySet Name="TaskingCapabilities" EntityType="STA.TaskingCapability"/>
166+
<EntitySet Name="Things" EntityType="STA.Thing"/>
167+
</EntityContainer>
168+
</Schema>
169+
</edmx:DataServices>
170+
</edmx:Edmx>

0 commit comments

Comments
 (0)