Skip to content

Commit 68f55bf

Browse files
committed
Added SWE-Common classes
1 parent 9edc7dd commit 68f55bf

30 files changed

Lines changed: 3508 additions & 38 deletions

File tree

FROST-Server.Core/src/main/java/de/fraunhofer/iosb/ilt/frostserver/service/PluginManager.java

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -62,6 +62,7 @@ public class PluginManager implements ConfigDefaults {
6262
+ ",de.fraunhofer.iosb.ilt.frostserver.plugin.openapi.PluginOpenApi"
6363
+ ",de.fraunhofer.iosb.ilt.frostserver.plugin.modelloader.PluginModelLoader"
6464
+ ",de.fraunhofer.iosb.ilt.frostserver.plugin.coremodelv2.PluginCoreModelV2"
65+
+ ",de.fraunhofer.iosb.ilt.frostserver.plugin.coremodelv2.PluginCoreServiceV2"
6566
+ ",de.fraunhofer.iosb.ilt.frostserver.plugin.modelom.PluginModelOM"
6667
+ ",de.fraunhofer.iosb.ilt.frostserver.plugin.modelsampling.PluginModelSampling"
6768
+ ",de.fraunhofer.iosb.ilt.frostserver.plugin.modelrelations.PluginModelRelations"

Plugins/CoreModelV2/pom.xml

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -34,6 +34,11 @@
3434
<artifactId>FROST-Server.Plugin.ModelLoader</artifactId>
3535
<version>${project.version}</version>
3636
</dependency>
37+
<dependency>
38+
<groupId>${project.groupId}</groupId>
39+
<artifactId>FROST-Server.Plugin.OData</artifactId>
40+
<version>${project.version}</version>
41+
</dependency>
3742
<dependency>
3843
<groupId>${project.groupId}</groupId>
3944
<artifactId>FROST-Server.Util</artifactId>

Plugins/CoreModelV2/src/main/java/de/fraunhofer/iosb/ilt/frostserver/plugin/coremodelv2/PluginCoreModelV2.java

Lines changed: 32 additions & 33 deletions
Original file line numberDiff line numberDiff line change
@@ -17,13 +17,12 @@
1717
*/
1818
package de.fraunhofer.iosb.ilt.frostserver.plugin.coremodelv2;
1919

20+
import static de.fraunhofer.iosb.ilt.frostserver.plugin.coremodel.CoreModelSettings.TAG_ENABLE_CORE_MODEL;
2021
import static de.fraunhofer.iosb.ilt.frostserver.service.InitResult.INIT_DELAY;
21-
import static de.fraunhofer.iosb.ilt.frostserver.service.Service.KEY_CONFORMANCE_LIST;
22-
import static de.fraunhofer.iosb.ilt.frostserver.service.Service.KEY_SERVER_SETTINGS;
2322

2423
import de.fraunhofer.iosb.ilt.frostserver.extensions.Extension;
2524
import de.fraunhofer.iosb.ilt.frostserver.path.Version;
26-
import de.fraunhofer.iosb.ilt.frostserver.plugin.coremodel.PluginCoreService;
25+
import de.fraunhofer.iosb.ilt.frostserver.plugin.coremodel.CoreModelSettings;
2726
import de.fraunhofer.iosb.ilt.frostserver.plugin.modelloader.PluginModelLoader;
2827
import de.fraunhofer.iosb.ilt.frostserver.service.InitResult;
2928
import de.fraunhofer.iosb.ilt.frostserver.service.Plugin;
@@ -45,15 +44,16 @@
4544
import org.slf4j.LoggerFactory;
4645

4746
/**
48-
*
49-
* @author scf
47+
* The core data model of STA Version 2.0.
5048
*/
5149
public class PluginCoreModelV2 implements Plugin, PluginRootDocument, ConfigDefaults {
5250

5351
private static final Logger LOGGER = LoggerFactory.getLogger(PluginCoreModelV2.class.getName());
5452
private static final List<String> REQUIREMENTS_CORE_MODEL = Arrays.asList(
5553
"http://www.opengis.net/spec/sensorthings/2.0/req-class/datamodel/core");
5654

55+
public static final String CONFORMANCE_CLASS_CORE_MODEL = "http://www.opengis.net/spec/sensorthings/2.0/req-class/datamodel/core";
56+
5757
@DefaultValueBoolean(false)
5858
public static final String TAG_ENABLE_PCMV2 = "coreModelV2.enable";
5959

@@ -64,24 +64,30 @@ public class PluginCoreModelV2 implements Plugin, PluginRootDocument, ConfigDefa
6464
public InitResult init(CoreSettings settings) {
6565
this.settings = settings;
6666
Settings pluginSettings = settings.getPluginSettings();
67+
boolean enabledV1 = pluginSettings.getBoolean(TAG_ENABLE_CORE_MODEL, CoreModelSettings.class);
6768
enabled = pluginSettings.getBoolean(TAG_ENABLE_PCMV2, PluginCoreModelV2.class);
6869
if (enabled) {
70+
if (enabledV1) {
71+
LOGGER.error("Can not enable both CoreModelV1 and CoreModelV2");
72+
return InitResult.INIT_FAILED;
73+
}
6974
final PluginManager pluginManager = settings.getPluginManager();
7075
PluginModelLoader pml = pluginManager.getPlugin(PluginModelLoader.class);
7176
if (pml == null || !pml.isEnabled()) {
7277
LOGGER.warn("PluginModelLoader must be enabled first, delaying initialisation...");
7378
return INIT_DELAY;
7479
}
75-
pml.addLiquibaseFile("plugincoremodelv2/liquibase/tables.xml");
76-
pml.addModelFile("plugincoremodelv2/model/Datastream.json");
77-
pml.addModelFile("plugincoremodelv2/model/Feature.json");
78-
pml.addModelFile("plugincoremodelv2/model/FeatureType.json");
79-
pml.addModelFile("plugincoremodelv2/model/HistoricalLocation.json");
80-
pml.addModelFile("plugincoremodelv2/model/Location.json");
81-
pml.addModelFile("plugincoremodelv2/model/Observation.json");
82-
pml.addModelFile("plugincoremodelv2/model/ObservedProperty.json");
83-
pml.addModelFile("plugincoremodelv2/model/Sensor.json");
84-
pml.addModelFile("plugincoremodelv2/model/Thing.json");
80+
pml.addLiquibaseFile("plugincoremodelv2/liquibase/tables.xml")
81+
.addModelFile("plugincoremodelv2/model/Datastream.json")
82+
.addModelFile("plugincoremodelv2/model/Feature.json")
83+
.addModelFile("plugincoremodelv2/model/FeatureType.json")
84+
.addModelFile("plugincoremodelv2/model/HistoricalLocation.json")
85+
.addModelFile("plugincoremodelv2/model/Location.json")
86+
.addModelFile("plugincoremodelv2/model/Observation.json")
87+
.addModelFile("plugincoremodelv2/model/ObservedProperty.json")
88+
.addModelFile("plugincoremodelv2/model/Sensor.json")
89+
.addModelFile("plugincoremodelv2/model/Thing.json")
90+
.addConformanceItem(CONFORMANCE_CLASS_CORE_MODEL);
8591
pluginManager.registerPlugin(this);
8692
}
8793
return InitResult.INIT_OK;
@@ -95,28 +101,21 @@ public boolean isEnabled() {
95101
@Override
96102
public void modifyServiceDocument(ServiceRequest request, Map<String, Object> result) {
97103
Version version = request.getVersion();
98-
if (version == PluginCoreService.V_1_1) {
99-
Map<String, Object> serverSettings = new LinkedHashMap<>();
100-
result.put(KEY_SERVER_SETTINGS, serverSettings);
104+
if (version != PluginCoreServiceV2.VERSION_STA_2_0) {
105+
return;
106+
}
107+
Map<String, Object> serverSettings = (Map<String, Object>) result.computeIfAbsent(Service.KEY_SERVER_SETTINGS, t -> new LinkedHashMap<>());
101108

102-
final Set<Extension> enabledSettings = settings.getEnabledExtensions();
103-
Set<String> extensionList = new TreeSet<>();
104-
serverSettings.put(KEY_CONFORMANCE_LIST, extensionList);
105-
for (Extension setting : enabledSettings) {
106-
if (setting.isExposedFeature()) {
107-
extensionList.addAll(setting.getRequirements());
108-
}
109+
final Set<Extension> enabledSettings = settings.getEnabledExtensions();
110+
Set<String> extensionList = (Set<String>) serverSettings.computeIfAbsent(Service.KEY_CONFORMANCE_LIST, t -> new TreeSet<>());
111+
for (Extension setting : enabledSettings) {
112+
if (setting.isExposedFeature()) {
113+
extensionList.addAll(setting.getRequirements());
109114
}
110-
111-
settings.getMqttSettings().fillServerSettings(serverSettings);
112115
}
113116

114-
Map<String, Object> serverSettings = (Map<String, Object>) result.get(Service.KEY_SERVER_SETTINGS);
115-
if (serverSettings == null) {
116-
// Nothing to add to.
117-
return;
118-
}
119-
Set<String> extensionList = (Set<String>) serverSettings.get(Service.KEY_CONFORMANCE_LIST);
117+
settings.getMqttSettings().fillServerSettings(serverSettings);
118+
120119
extensionList.addAll(REQUIREMENTS_CORE_MODEL);
121120
}
122121

Lines changed: 228 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,228 @@
1+
/*
2+
* Copyright (C) 2024 Fraunhofer Institut IOSB, Fraunhoferstr. 1, D 76131
3+
* Karlsruhe, Germany.
4+
*
5+
* This program is free software: you can redistribute it and/or modify
6+
* it under the terms of the GNU Lesser General Public License as published by
7+
* the Free Software Foundation, either version 3 of the License, or
8+
* (at your option) any later version.
9+
*
10+
* This program is distributed in the hope that it will be useful,
11+
* but WITHOUT ANY WARRANTY; without even the implied warranty of
12+
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
13+
* GNU Lesser General Public License for more details.
14+
*
15+
* You should have received a copy of the GNU Lesser General Public License
16+
* along with this program. If not, see <http://www.gnu.org/licenses/>.
17+
*/
18+
package de.fraunhofer.iosb.ilt.frostserver.plugin.coremodelv2;
19+
20+
import static de.fraunhofer.iosb.ilt.frostserver.path.Version.builder;
21+
import static de.fraunhofer.iosb.ilt.frostserver.plugin.odata.PluginOData.PARAM_METADATA;
22+
import static de.fraunhofer.iosb.ilt.frostserver.plugin.odata.PluginOData.PATH_METADATA;
23+
import static de.fraunhofer.iosb.ilt.frostserver.plugin.odata.PluginOData.REQUEST_TYPE_METADATA;
24+
import static de.fraunhofer.iosb.ilt.frostserver.service.PluginManager.PATH_WILDCARD;
25+
import static de.fraunhofer.iosb.ilt.frostserver.service.PluginResultFormat.FORMAT_NAME_EMPTY;
26+
import static de.fraunhofer.iosb.ilt.frostserver.service.RequestTypeUtils.CREATE;
27+
import static de.fraunhofer.iosb.ilt.frostserver.service.RequestTypeUtils.UPDATE_ALL;
28+
import static de.fraunhofer.iosb.ilt.frostserver.service.RequestTypeUtils.UPDATE_CHANGES;
29+
import static de.fraunhofer.iosb.ilt.frostserver.service.RequestTypeUtils.UPDATE_CHANGESET;
30+
import static de.fraunhofer.iosb.ilt.frostserver.service.Service.KEY_CONFORMANCE_LIST;
31+
import static de.fraunhofer.iosb.ilt.frostserver.service.Service.KEY_SERVER_SETTINGS;
32+
import static de.fraunhofer.iosb.ilt.frostserver.util.Constants.CONTENT_TYPE_APPLICATION_JSONPATCH;
33+
import static de.fraunhofer.iosb.ilt.frostserver.util.Constants.REQUEST_PARAM_FORMAT;
34+
import static de.fraunhofer.iosb.ilt.frostserver.util.Constants.TAG_PREFER_RETURN;
35+
36+
import de.fraunhofer.iosb.ilt.frostserver.extensions.Extension;
37+
import de.fraunhofer.iosb.ilt.frostserver.model.ModelRegistry;
38+
import de.fraunhofer.iosb.ilt.frostserver.path.EditFeatures;
39+
import de.fraunhofer.iosb.ilt.frostserver.path.Version;
40+
import de.fraunhofer.iosb.ilt.frostserver.plugin.odata.MetaDataGenerator;
41+
import de.fraunhofer.iosb.ilt.frostserver.plugin.odata.PluginResultFormatOData;
42+
import de.fraunhofer.iosb.ilt.frostserver.plugin.odata.deserialize.JsonReaderOData;
43+
import de.fraunhofer.iosb.ilt.frostserver.plugin.odata.serialize.JsonWriterOdata401;
44+
import de.fraunhofer.iosb.ilt.frostserver.service.InitResult;
45+
import de.fraunhofer.iosb.ilt.frostserver.service.PluginRootDocument;
46+
import de.fraunhofer.iosb.ilt.frostserver.service.PluginService;
47+
import de.fraunhofer.iosb.ilt.frostserver.service.RequestTypeUtils;
48+
import de.fraunhofer.iosb.ilt.frostserver.service.Service;
49+
import de.fraunhofer.iosb.ilt.frostserver.service.ServiceRequest;
50+
import de.fraunhofer.iosb.ilt.frostserver.service.ServiceResponse;
51+
import de.fraunhofer.iosb.ilt.frostserver.settings.ConfigDefaults;
52+
import de.fraunhofer.iosb.ilt.frostserver.settings.CoreSettings;
53+
import de.fraunhofer.iosb.ilt.frostserver.settings.Settings;
54+
import de.fraunhofer.iosb.ilt.frostserver.settings.annotation.DefaultValueBoolean;
55+
import de.fraunhofer.iosb.ilt.frostserver.util.Constants;
56+
import de.fraunhofer.iosb.ilt.frostserver.util.HttpMethod;
57+
import de.fraunhofer.iosb.ilt.frostserver.util.StringHelper;
58+
import java.util.Arrays;
59+
import java.util.Collection;
60+
import java.util.LinkedHashMap;
61+
import java.util.Map;
62+
import java.util.Set;
63+
import java.util.TreeSet;
64+
import org.slf4j.Logger;
65+
import org.slf4j.LoggerFactory;
66+
67+
/**
68+
*
69+
* @author hylke
70+
*/
71+
public class PluginCoreServiceV2 implements PluginRootDocument, PluginService, ConfigDefaults {
72+
73+
private static final EditFeatures INSERT_STA_20 = new EditFeatures(true, false, false);
74+
private static final EditFeatures UPDATE_STA_20 = new EditFeatures(true, true, true);
75+
76+
public static final String VERSION_STA_V20_NAME = "v2.0";
77+
78+
public static final Version VERSION_STA_2_0 = builder()
79+
.setUrlPart(VERSION_STA_V20_NAME)
80+
.setCountName(JsonWriterOdata401.AT_COUNT)
81+
.setIdName("id")
82+
.setSelfLinkName(JsonWriterOdata401.AT_ID)
83+
.setNextLinkName(JsonWriterOdata401.AT_NEXT_LINK)
84+
.setNavLinkName(JsonWriterOdata401.AT_NAVIGATION_LINK)
85+
.setCreateFeatures(INSERT_STA_20)
86+
.setUpdateFeatures(UPDATE_STA_20)
87+
.registerSytheticProperty(ModelRegistry.EP_SELFLINK)
88+
.build();
89+
90+
@DefaultValueBoolean(true)
91+
public static final String TAG_ENABLE_CORE_SERVICE_V2 = "coreServiceV2.enable";
92+
93+
private static final Logger LOGGER = LoggerFactory.getLogger(PluginCoreServiceV2.class.getName());
94+
95+
private CoreSettings settings;
96+
private boolean enabled;
97+
98+
@Override
99+
public InitResult init(CoreSettings settings) {
100+
this.settings = settings;
101+
final Settings pluginSettings = settings.getPluginSettings();
102+
enabled = pluginSettings.getBoolean(TAG_ENABLE_CORE_SERVICE_V2, PluginCoreServiceV2.class);
103+
if (enabled) {
104+
settings.getPluginManager().registerPlugin(this);
105+
settings.getPluginManager().registerPlugin(new PluginResultFormatOData());
106+
}
107+
return InitResult.INIT_OK;
108+
}
109+
110+
@Override
111+
public boolean isEnabled() {
112+
return enabled;
113+
}
114+
115+
@Override
116+
public Collection<Version> getVersions() {
117+
return Arrays.asList(VERSION_STA_2_0);
118+
}
119+
120+
@Override
121+
public boolean definesVersions() {
122+
return true;
123+
}
124+
125+
@Override
126+
public Collection<String> getVersionedUrlPaths() {
127+
return Arrays.asList(PATH_WILDCARD);
128+
}
129+
130+
@Override
131+
public Collection<String> getRequestTypes() {
132+
return Arrays.asList(
133+
RequestTypeUtils.GET_CAPABILITIES,
134+
RequestTypeUtils.CREATE,
135+
RequestTypeUtils.DELETE,
136+
RequestTypeUtils.READ,
137+
RequestTypeUtils.UPDATE_ALL,
138+
RequestTypeUtils.UPDATE_CHANGES,
139+
RequestTypeUtils.UPDATE_CHANGESET,
140+
REQUEST_TYPE_METADATA);
141+
}
142+
143+
@Override
144+
public String getRequestTypeFor(Version version, String path, HttpMethod method, String contentType) {
145+
if (version != VERSION_STA_2_0) {
146+
return null;
147+
}
148+
if (path.startsWith(PATH_METADATA)) {
149+
return REQUEST_TYPE_METADATA;
150+
}
151+
switch (method) {
152+
case DELETE:
153+
return RequestTypeUtils.DELETE;
154+
155+
case HEAD:
156+
case GET:
157+
if (path.isEmpty() || "/".equals(path)) {
158+
return RequestTypeUtils.GET_CAPABILITIES;
159+
}
160+
return RequestTypeUtils.READ;
161+
162+
case PATCH:
163+
if (!StringHelper.isNullOrEmpty(contentType) && contentType.startsWith(CONTENT_TYPE_APPLICATION_JSONPATCH)) {
164+
return RequestTypeUtils.UPDATE_CHANGESET;
165+
}
166+
return RequestTypeUtils.UPDATE_CHANGES;
167+
168+
case POST:
169+
return RequestTypeUtils.CREATE;
170+
171+
case PUT:
172+
return RequestTypeUtils.UPDATE_ALL;
173+
174+
default:
175+
return null;
176+
}
177+
}
178+
179+
@Override
180+
public ServiceResponse execute(Service mainService, ServiceRequest request, ServiceResponse response) {
181+
response.addHeader("OData-Version", "4.01");
182+
request.setJsonReader(new JsonReaderOData(request.getCoreSettings().getModelRegistry(), request.getUserPrincipal()));
183+
switch (request.getRequestType()) {
184+
case REQUEST_TYPE_METADATA:
185+
return new MetaDataGenerator(settings).generateMetaData(request, response);
186+
187+
case CREATE:
188+
case UPDATE_ALL:
189+
case UPDATE_CHANGES:
190+
case UPDATE_CHANGESET:
191+
if (Constants.VALUE_RETURN_MINIMAL.equalsIgnoreCase(request.getParameter(TAG_PREFER_RETURN))) {
192+
request.addParameterIfAbsent(REQUEST_PARAM_FORMAT, FORMAT_NAME_EMPTY);
193+
}
194+
return mainService.execute(request, response);
195+
196+
default:
197+
return mainService.execute(request, response);
198+
}
199+
}
200+
201+
@Override
202+
public void modifyServiceDocument(ServiceRequest request, Map<String, Object> result) {
203+
Version version = request.getVersion();
204+
if (version != VERSION_STA_2_0) {
205+
return;
206+
}
207+
208+
String path = request.getQueryDefaults().getServiceRootUrl()
209+
+ '/' + request.getVersion().urlPart
210+
+ '/';
211+
result.put(JsonWriterOdata401.AT_CONTEXT, path + PARAM_METADATA);
212+
213+
Map<String, Object> serverSettings = (Map<String, Object>) result.computeIfAbsent(KEY_SERVER_SETTINGS, t -> new LinkedHashMap<>());
214+
215+
final Set<Extension> enabledSettings = settings.getEnabledExtensions();
216+
Set<String> extensionList = new TreeSet<>();
217+
serverSettings.put(KEY_CONFORMANCE_LIST, extensionList);
218+
for (Extension setting : enabledSettings) {
219+
if (setting.isExposedFeature()) {
220+
extensionList.addAll(setting.getRequirements());
221+
}
222+
}
223+
224+
settings.getMqttSettings().fillServerSettings(serverSettings);
225+
226+
}
227+
228+
}

0 commit comments

Comments
 (0)