Skip to content

Commit 5ce23fb

Browse files
committed
Updated CSDL Generation for STA V2
1 parent a254b98 commit 5ce23fb

7 files changed

Lines changed: 71 additions & 36 deletions

File tree

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

Lines changed: 5 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -41,6 +41,7 @@
4141
import de.fraunhofer.iosb.ilt.frostserver.path.Version;
4242
import de.fraunhofer.iosb.ilt.frostserver.plugin.odata.MetaDataGenerator;
4343
import de.fraunhofer.iosb.ilt.frostserver.plugin.odata.deserialize.JsonReaderOData;
44+
import de.fraunhofer.iosb.ilt.frostserver.plugin.odata.metadata.CsdlDocument.ODataVersion;
4445
import de.fraunhofer.iosb.ilt.frostserver.plugin.odata.serialize.JsonWriterOdata401;
4546
import de.fraunhofer.iosb.ilt.frostserver.query.expression.constant.Constant;
4647
import de.fraunhofer.iosb.ilt.frostserver.query.expression.function.Operator;
@@ -226,7 +227,10 @@ public ServiceResponse execute(Service mainService, ServiceRequest request, Serv
226227
request.setJsonReader(new JsonReaderOData(request.getCoreSettings().getModelRegistry(), request.getUserPrincipal()));
227228
switch (request.getRequestType()) {
228229
case REQUEST_TYPE_METADATA:
229-
return new MetaDataGenerator(coreSettings).generateMetaData(request, response);
230+
return new MetaDataGenerator(coreSettings)
231+
.setVersion(ODataVersion.V4_01)
232+
.setJsonDefault(true)
233+
.generateMetaData(request, response);
230234

231235
case CREATE:
232236
case UPDATE_ALL:

Plugins/OData/src/main/java/de/fraunhofer/iosb/ilt/frostserver/plugin/odata/MetaDataGenerator.java

Lines changed: 37 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -22,7 +22,6 @@
2222
import static de.fraunhofer.iosb.ilt.frostserver.util.Constants.HEADER_ACCEPT;
2323
import static de.fraunhofer.iosb.ilt.frostserver.util.Constants.REQUEST_PARAM_FORMAT;
2424

25-
import de.fraunhofer.iosb.ilt.frostserver.path.Version;
2625
import de.fraunhofer.iosb.ilt.frostserver.plugin.odata.metadata.CsdlDocument;
2726
import de.fraunhofer.iosb.ilt.frostserver.plugin.odata.metadata.MxGraphGenerator;
2827
import de.fraunhofer.iosb.ilt.frostserver.service.ServiceRequest;
@@ -32,22 +31,33 @@
3231
import de.fraunhofer.iosb.ilt.frostserver.util.user.PrincipalExtended;
3332
import java.io.IOException;
3433
import org.slf4j.LoggerFactory;
34+
import tools.jackson.core.JacksonException;
3535

3636
/**
37-
*
38-
* @author hylke
37+
* A generator for OData CSDL documents.
3938
*/
4039
public class MetaDataGenerator {
4140

4241
private static final org.slf4j.Logger LOGGER = LoggerFactory.getLogger(MetaDataGenerator.class.getName());
4342
private final CoreSettings settings;
43+
private boolean jsonDefault = false;
44+
private CsdlDocument.ODataVersion version = CsdlDocument.ODataVersion.V4_01;
4445

4546
public MetaDataGenerator(CoreSettings settings) {
4647
this.settings = settings;
4748
}
4849

50+
public MetaDataGenerator setJsonDefault(boolean jsonDefault) {
51+
this.jsonDefault = jsonDefault;
52+
return this;
53+
}
54+
55+
public MetaDataGenerator setVersion(CsdlDocument.ODataVersion version) {
56+
this.version = version;
57+
return this;
58+
}
59+
4960
public ServiceResponse generateMetaData(ServiceRequest request, ServiceResponse response) {
50-
final Version version = request.getVersion();
5161
try {
5262
final CsdlDocument doc = new CsdlDocument().generateFrom(version, settings);
5363
String format = request.getParameter(REQUEST_PARAM_FORMAT, "");
@@ -67,18 +77,34 @@ public ServiceResponse generateMetaData(ServiceRequest request, ServiceResponse
6777
settings.getModelRegistry(),
6878
PrincipalExtended.getLocalPrincipal().isAdmin());
6979
response.setCode(200);
70-
} else if (idxJson < idxXml || "json".equalsIgnoreCase(format)) {
71-
response.setContentType(CONTENT_TYPE_APPLICATION_JSON);
72-
SimpleJsonMapper.getSimpleObjectMapper().writeValue(response.getWriter(), doc);
73-
response.setCode(200);
80+
} else if ("json".equalsIgnoreCase(format)) {
81+
generateJson(response, doc);
82+
} else if ("xml".equalsIgnoreCase(format)) {
83+
generateXml(response, doc);
84+
} else if (idxJson < idxXml) {
85+
generateJson(response, doc);
7486
} else {
75-
response.setContentType(CONTENT_TYPE_APPLICATION_XML);
76-
doc.writeXml(version, response.getWriter());
77-
response.setCode(200);
87+
if (jsonDefault) {
88+
generateJson(response, doc);
89+
} else {
90+
generateXml(response, doc);
91+
}
7892
}
7993
} catch (IOException ex) {
8094
LOGGER.error("Failed to generate metadata document", ex);
8195
}
8296
return response;
8397
}
98+
99+
private void generateXml(ServiceResponse response, final CsdlDocument doc) throws IOException {
100+
response.setContentType(CONTENT_TYPE_APPLICATION_XML);
101+
doc.writeXml(response.getWriter());
102+
response.setCode(200);
103+
}
104+
105+
private void generateJson(ServiceResponse response, final CsdlDocument doc) throws JacksonException {
106+
response.setContentType(CONTENT_TYPE_APPLICATION_JSON);
107+
SimpleJsonMapper.getSimpleObjectMapper().writeValue(response.getWriter(), doc);
108+
response.setCode(200);
109+
}
84110
}

Plugins/OData/src/main/java/de/fraunhofer/iosb/ilt/frostserver/plugin/odata/PluginOData.java

Lines changed: 8 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -33,6 +33,7 @@
3333
import de.fraunhofer.iosb.ilt.frostserver.path.EditFeatures;
3434
import de.fraunhofer.iosb.ilt.frostserver.path.Version;
3535
import de.fraunhofer.iosb.ilt.frostserver.plugin.odata.deserialize.JsonReaderOData;
36+
import de.fraunhofer.iosb.ilt.frostserver.plugin.odata.metadata.CsdlDocument.ODataVersion;
3637
import de.fraunhofer.iosb.ilt.frostserver.plugin.odata.serialize.JsonWriterOdata40;
3738
import de.fraunhofer.iosb.ilt.frostserver.plugin.odata.serialize.JsonWriterOdata401;
3839
import de.fraunhofer.iosb.ilt.frostserver.service.InitResult;
@@ -193,17 +194,21 @@ public String getRequestTypeFor(Version version, String path, HttpMethod method,
193194

194195
@Override
195196
public ServiceResponse execute(Service mainService, ServiceRequest request, ServiceResponse response) {
197+
ODataVersion version;
196198
boolean isOdata401 = false;
197199
if (request.getVersion() == VERSION_ODATA_40) {
198-
response.addHeader("OData-Version", "4.0");
200+
version = ODataVersion.V4_0;
199201
} else {
200202
isOdata401 = true;
201-
response.addHeader("OData-Version", "4.01");
203+
version = ODataVersion.V4_01;
202204
}
205+
response.addHeader("OData-Version", version.name);
203206
request.setJsonReader(new JsonReaderOData(request.getCoreSettings().getModelRegistry(), request.getUserPrincipal()));
204207
switch (request.getRequestType()) {
205208
case REQUEST_TYPE_METADATA:
206-
return new MetaDataGenerator(settings).generateMetaData(request, response);
209+
return new MetaDataGenerator(settings)
210+
.setVersion(version)
211+
.generateMetaData(request, response);
207212

208213
case GET_CAPABILITIES:
209214
return executeGetCapabilities(request, response);

Plugins/OData/src/main/java/de/fraunhofer/iosb/ilt/frostserver/plugin/odata/metadata/CsdlDocument.java

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

20-
import static de.fraunhofer.iosb.ilt.frostserver.plugin.odata.PluginOData.VERSION_ODATA_40;
21-
2220
import com.fasterxml.jackson.annotation.JsonAnyGetter;
2321
import com.fasterxml.jackson.annotation.JsonAnySetter;
2422
import com.fasterxml.jackson.annotation.JsonIgnore;
2523
import com.fasterxml.jackson.annotation.JsonProperty;
26-
import de.fraunhofer.iosb.ilt.frostserver.path.Version;
2724
import de.fraunhofer.iosb.ilt.frostserver.settings.CoreSettings;
2825
import java.io.IOException;
2926
import java.io.Writer;
@@ -38,11 +35,21 @@
3835
import org.apache.commons.lang3.StringUtils;
3936

4037
/**
41-
*
42-
* @author hylke
38+
* A CSDL Document representation.
4339
*/
4440
public class CsdlDocument {
4541

42+
public static enum ODataVersion {
43+
V4_0("4.0"),
44+
V4_01("4.01");
45+
46+
private ODataVersion(String name) {
47+
this.name = name;
48+
}
49+
50+
public final String name;
51+
}
52+
4653
@JsonProperty("$Version")
4754
public String version = "4.01";
4855

@@ -157,11 +164,12 @@ public void writeXml(Writer writer) throws IOException {
157164
/**
158165
* Fill the document using the given Settings, and return itself.
159166
*
167+
* @param version the OData version to generate the document for.
160168
* @param settings the CoreSettings to use.
161169
* @return this.
162170
*/
163-
public CsdlDocument generateFrom(Version version, CoreSettings settings) {
164-
this.version = version == VERSION_ODATA_40 ? "4.0" : "4.01";
171+
public CsdlDocument generateFrom(ODataVersion version, CoreSettings settings) {
172+
this.version = version.name;
165173
String nameSpace = "de.FROST";
166174
nameSpaces.put(nameSpace, new CsdlSchema().generateFrom(this, version, nameSpace, settings));
167175
return this;
@@ -171,12 +179,8 @@ public void registerAnnotation(String baseUrl, CsdlAnnotation annotation) {
171179
referencedDocs.computeIfAbsent(baseUrl, ReferencedDoc::new).addAnnotation(annotation);
172180
}
173181

174-
public void writeXml(Version version, Writer writer) throws IOException {
175-
if (version == VERSION_ODATA_40) {
176-
writer.write("<?xml version=\"1.0\" encoding=\"utf-8\"?><edmx:Edmx Version=\"4.0\" xmlns:edmx=\"http://docs.oasis-open.org/odata/ns/edmx\">");
177-
} else {
178-
writer.write("<?xml version=\"1.0\" encoding=\"utf-8\"?><edmx:Edmx Version=\"4.01\" xmlns:edmx=\"http://docs.oasis-open.org/odata/ns/edmx\">");
179-
}
182+
public void writeXml(Writer writer) throws IOException {
183+
writer.write("<?xml version=\"1.0\" encoding=\"utf-8\"?><edmx:Edmx Version=\"" + version + "\" xmlns:edmx=\"http://docs.oasis-open.org/odata/ns/edmx\">");
180184
for (ReferencedDoc refDoc : referencedDocs.values()) {
181185
refDoc.writeXml(writer);
182186
}

Plugins/OData/src/main/java/de/fraunhofer/iosb/ilt/frostserver/plugin/odata/metadata/CsdlItemEntityType.java

Lines changed: 1 addition & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -24,7 +24,6 @@
2424
import de.fraunhofer.iosb.ilt.frostserver.model.ModelRegistry;
2525
import de.fraunhofer.iosb.ilt.frostserver.model.core.PrimaryKey;
2626
import de.fraunhofer.iosb.ilt.frostserver.model.core.annotations.Annotation;
27-
import de.fraunhofer.iosb.ilt.frostserver.path.Version;
2827
import de.fraunhofer.iosb.ilt.frostserver.property.EntityPropertyMain;
2928
import de.fraunhofer.iosb.ilt.frostserver.property.NavigationPropertyMain;
3029
import java.io.IOException;
@@ -48,7 +47,7 @@ public class CsdlItemEntityType implements CsdlSchemaItem {
4847
@JsonIgnore
4948
private final List<CsdlAnnotation> annotations = new ArrayList<>();
5049

51-
public CsdlItemEntityType generateFrom(CsdlDocument doc, Version version, String nameSpace, EntityType et) {
50+
public CsdlItemEntityType generateFrom(CsdlDocument doc, CsdlDocument.ODataVersion version, String nameSpace, EntityType et) {
5251
final PrimaryKey primaryKey = et.getPrimaryKey();
5352
for (var property : primaryKey.getKeyProperties()) {
5453
String keyName = property.getName();

Plugins/OData/src/main/java/de/fraunhofer/iosb/ilt/frostserver/plugin/odata/metadata/CsdlPropertyEntity.java

Lines changed: 2 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -23,8 +23,6 @@
2323
import com.fasterxml.jackson.annotation.JsonProperty;
2424
import de.fraunhofer.iosb.ilt.frostserver.model.EntityType;
2525
import de.fraunhofer.iosb.ilt.frostserver.model.core.annotations.Annotation;
26-
import de.fraunhofer.iosb.ilt.frostserver.path.Version;
27-
import de.fraunhofer.iosb.ilt.frostserver.plugin.odata.PluginOData;
2826
import de.fraunhofer.iosb.ilt.frostserver.property.EntityPropertyMain;
2927
import de.fraunhofer.iosb.ilt.frostserver.property.type.PropertyType;
3028
import de.fraunhofer.iosb.ilt.frostserver.property.type.TypeSimplePrimitive;
@@ -54,7 +52,7 @@ public class CsdlPropertyEntity implements CsdlProperty {
5452
@JsonIgnore
5553
private final List<CsdlAnnotation> annotations = new ArrayList<>();
5654

57-
public CsdlPropertyEntity generateFrom(CsdlDocument doc, Version version, String nameSpace, EntityType et, EntityPropertyMain<?> ep) {
55+
public CsdlPropertyEntity generateFrom(CsdlDocument doc, CsdlDocument.ODataVersion version, String nameSpace, EntityType et, EntityPropertyMain<?> ep) {
5856
final PropertyType propertyType = ep.getType();
5957
type = propertyType.getName();
6058
collection = propertyType.isCollection();
@@ -64,7 +62,7 @@ public CsdlPropertyEntity generateFrom(CsdlDocument doc, Version version, String
6462
if (TYPE_DEFAULT.equals(type)) {
6563
type = null;
6664
}
67-
if (TypeSimplePrimitive.EDM_UNTYPED == propertyType && version == PluginOData.VERSION_ODATA_40) {
65+
if (TypeSimplePrimitive.EDM_UNTYPED == propertyType && version == CsdlDocument.ODataVersion.V4_0) {
6866
type = TypeSimplePrimitive.EDM_STRING.getName();
6967
}
7068
if (!et.getPrimaryKey().getKeyProperties().contains(ep)) {

Plugins/OData/src/main/java/de/fraunhofer/iosb/ilt/frostserver/plugin/odata/metadata/CsdlSchema.java

Lines changed: 1 addition & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -21,7 +21,6 @@
2121
import com.fasterxml.jackson.annotation.JsonAnySetter;
2222
import de.fraunhofer.iosb.ilt.frostserver.model.EntityType;
2323
import de.fraunhofer.iosb.ilt.frostserver.model.ModelRegistry;
24-
import de.fraunhofer.iosb.ilt.frostserver.path.Version;
2524
import de.fraunhofer.iosb.ilt.frostserver.property.type.PropertyType;
2625
import de.fraunhofer.iosb.ilt.frostserver.property.type.TypeComplex;
2726
import de.fraunhofer.iosb.ilt.frostserver.property.type.TypeEnumeration;
@@ -48,7 +47,7 @@ public class CsdlSchema {
4847
@JsonAnySetter
4948
public Map<String, CsdlSchemaItem> schemaItems = new LinkedHashMap<>();
5049

51-
public CsdlSchema generateFrom(CsdlDocument doc, Version version, String nameSpace, CoreSettings settings) {
50+
public CsdlSchema generateFrom(CsdlDocument doc, CsdlDocument.ODataVersion version, String nameSpace, CoreSettings settings) {
5251
ModelRegistry mr = settings.getModelRegistry();
5352
for (EntityType entityType : mr.getEntityTypes(PrincipalExtended.getLocalPrincipal().isAdmin())) {
5453
schemaItems.put(entityType.entityName, new CsdlItemEntityType().generateFrom(doc, version, nameSpace, entityType));

0 commit comments

Comments
 (0)