Skip to content

Commit ff19bbc

Browse files
rraystcoderabbitai[bot]christiangoerdes
authored
added @mcelement(noEnvelope=true) modus (#2181)
* added @mcelement(noEnvelope=true) modus * forbid combining 'noEnvelope' with 'topLevel' * added more 'noEnvelope' attributes * forbid 'noEvelope' elements form occurring in their old verbose form * Update core/src/main/java/com/predic8/membrane/core/kubernetes/GenericYamlParser.java Co-authored-by: coderabbitai[bot] <136622811+coderabbitai[bot]@users.noreply.github.com> * fixed collection type list * fixed java syntax * adjust tests --------- Co-authored-by: coderabbitai[bot] <136622811+coderabbitai[bot]@users.noreply.github.com> Co-authored-by: Christian Gördes <christian.goerdes@outlook.de> Co-authored-by: Christian Gördes <118011644+christiangoerdes@users.noreply.github.com>
1 parent 4f4a2b3 commit ff19bbc

File tree

17 files changed

+149
-54
lines changed

17 files changed

+149
-54
lines changed

annot/src/main/java/com/predic8/membrane/annot/MCElement.java

Lines changed: 33 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -21,9 +21,37 @@
2121
@Target(ElementType.TYPE)
2222
@Retention(RetentionPolicy.RUNTIME)
2323
public @interface MCElement {
24-
String name();
25-
String id() default "";
26-
boolean mixed() default false;
27-
boolean topLevel() default true;
28-
String configPackage() default "";
24+
String name();
25+
26+
String id() default "";
27+
28+
boolean mixed() default false;
29+
30+
/**
31+
* Whether the element can be a separate bean in the XML schema, or a separate document in YAML/JSON.
32+
*/
33+
boolean topLevel() default true;
34+
35+
String configPackage() default "";
36+
37+
/**
38+
* If set, this activates the 'no envelope' mode for this element.
39+
* <p>
40+
* In 'no envelope' mode, the class annotated by <code>@MCElement</code> must have no <code>@MCAttribute</code>
41+
* setter methods, no <code>@MCTextContent</code> setter methods, no <code>@MCOtherAttributes</code> setter methods
42+
* and exactly one <code>@MCChildElement</code> setter, which must accept a List or Collection as parameter.
43+
* <p>
44+
* In JSON/YAML representations, the element's content is then represented directly by the item list
45+
* <p>
46+
* ["item1":{}, "item2":{}]
47+
* <p>
48+
* instead of
49+
* <p>
50+
* {"propertyName": ["item1":{}, "item2":{}]}
51+
* <p>
52+
* .
53+
* <p>
54+
* This does not have any effect on the XML grammar.
55+
*/
56+
boolean noEnvelope() default false;
2957
}

annot/src/main/java/com/predic8/membrane/annot/SpringConfigurationXSDGeneratingAnnotationProcessor.java

Lines changed: 17 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -217,7 +217,23 @@ public boolean process(Set<? extends TypeElement> annotations, RoundEnvironment
217217
String uniquenessError = getUniquenessError(ii);
218218
if (uniquenessError != null)
219219
throw new ProcessingException(uniquenessError, ii.getElement());
220-
if (ii.getTci() != null && !ii.getAnnotation().mixed())
220+
if (ii.getAnnotation().noEnvelope()) {
221+
if (ii.getAnnotation().topLevel())
222+
throw new ProcessingException("@MCElement(..., noEnvelope=true, topLevel=true) is invalid.", ii.getElement());
223+
if (ii.getAnnotation().mixed())
224+
throw new ProcessingException("@MCElement(..., noEnvelope=true, mixed=true) is invalid.", ii.getElement());
225+
if (ii.getChildElementSpecs().size() != 1)
226+
throw new ProcessingException("@MCElement(noEnvelope=true) requires exactly one @MCChildElement.", ii.getElement());
227+
if (!ii.getChildElementSpecs().get(0).isList())
228+
throw new ProcessingException("@MCElement(noEnvelope=true) requires its @MCChildElement() to be a List or Collection.", ii.getElement());
229+
if (!ii.getAis().isEmpty())
230+
throw new ProcessingException("@MCElement(noEnvelope=true) requires @MCAttribute to be not present.", ii.getElement());
231+
if (ii.getOai() != null)
232+
throw new ProcessingException("@MCElement(noEnvelope=true) requires @MCOtherAttributes to be not present.", ii.getElement());
233+
if (ii.getTci() != null)
234+
throw new ProcessingException("@MCElement(noEnvelope=true) requires @MCTextContent to be not present.", ii.getElement());
235+
}
236+
if (ii.getTci() != null && !ii.getAnnotation().mixed())
221237
throw new ProcessingException("@MCTextContent requires @MCElement(..., mixed=true) on the class.", ii.getElement());
222238
if (ii.getTci() == null && ii.getAnnotation().mixed())
223239
throw new ProcessingException("@MCElement(..., mixed=true) requires @MCTextContent on a property.", ii.getElement());

annot/src/main/java/com/predic8/membrane/annot/generator/JsonSchemaGenerator.java

Lines changed: 13 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -63,7 +63,7 @@ private void assemble(Model m, MainInfo main) throws IOException {
6363
}
6464

6565
SchemaObject parser = new SchemaObject(elementInfo.getXSDTypeName(m));
66-
parser.addAttribute("type", "object");
66+
parser.addAttribute("type", elementInfo.getAnnotation().noEnvelope() ? "array" : "object");
6767
parser.addAttribute("additionalProperties", elementInfo.getOai() != null);
6868
parser.addAttribute("description", getDescriptionAsText(elementInfo));
6969
parser.addAttribute("x-intellij-html-description", getDescriptionAsHtml(elementInfo));
@@ -201,15 +201,19 @@ private void collectChildElements(Model m, MainInfo main, ElementInfo i, ISchema
201201
items.addAttribute("type", "object");
202202
items.addAttribute("additionalProperties", cei.getAnnotation().allowForeign());
203203

204-
SchemaObject sop = new SchemaObject(cei.getPropertyName());
205-
sop.setRequired(cei.isRequired());
206-
sop.addAttribute("description", getDescriptionAsText(cei));
207-
sop.addAttribute("x-intellij-html-description", getDescriptionAsHtml(cei));
208-
sop.addAttribute("type", "array");
209-
sop.addAttribute("additionalItems", false);
210-
sop.addAttribute("items", items);
204+
if (i.getAnnotation().noEnvelope()) {
205+
so.addAttribute("items", items);
206+
} else {
207+
SchemaObject sop = new SchemaObject(cei.getPropertyName());
208+
sop.setRequired(cei.isRequired());
209+
sop.addAttribute("description", getDescriptionAsText(cei));
210+
sop.addAttribute("x-intellij-html-description", getDescriptionAsHtml(cei));
211+
sop.addAttribute("type", "array");
212+
sop.addAttribute("additionalItems", false);
213+
sop.addAttribute("items", items);
211214

212-
so.addProperty(sop);
215+
so.addProperty(sop);
216+
}
213217

214218
parent2 = items;
215219
} else {

annot/src/main/java/com/predic8/membrane/annot/generator/kubernetes/K8sJsonSchemaGenerator.java

Lines changed: 11 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -111,7 +111,7 @@ private void collectDefinitions(Model m, MainInfo main, ElementInfo i, Schema sc
111111

112112
for (Map.Entry<String, ElementInfo> entry : all.entrySet()) {
113113
SchemaObject so = new SchemaObject(entry.getKey());
114-
so.addAttribute("type", "object");
114+
so.addAttribute("type", entry.getValue().getAnnotation().noEnvelope() ? "array" : "object");
115115
so.addAttribute("additionalProperties", entry.getValue().getOai() != null);
116116

117117
collectProperties(m, main, entry.getValue(), so);
@@ -140,13 +140,17 @@ private void collectChildElements(Model m, MainInfo main, ElementInfo i, ISchema
140140
items.addAttribute("type", "object");
141141
items.addAttribute("additionalProperties", cei.getAnnotation().allowForeign());
142142

143-
SchemaObject sop = new SchemaObject(cei.getPropertyName());
144-
sop.setRequired(cei.isRequired());
145-
sop.addAttribute("type", "array");
146-
sop.addAttribute("additionalItems", false);
147-
sop.addAttribute("items", items);
143+
if (i.getAnnotation().noEnvelope()) {
144+
so.addAttribute("items", items);
145+
} else {
146+
SchemaObject sop = new SchemaObject(cei.getPropertyName());
147+
sop.setRequired(cei.isRequired());
148+
sop.addAttribute("type", "array");
149+
sop.addAttribute("additionalItems", false);
150+
sop.addAttribute("items", items);
148151

149-
so.addProperty(sop);
152+
so.addProperty(sop);
153+
}
150154

151155
parent2 = items;
152156
} else {

annot/src/main/java/com/predic8/membrane/annot/generator/kubernetes/model/ISchema.java

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -14,6 +14,8 @@
1414
package com.predic8.membrane.annot.generator.kubernetes.model;
1515

1616
public interface ISchema {
17+
void addAttribute(String key, Object value);
18+
1719
void addProperty(SchemaObject so);
1820

1921
void setAdditionalProperties(boolean additionalProperties);

core/src/main/java/com/predic8/membrane/core/interceptor/apikey/stores/inConfig/SimpleKeyStore.java

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -24,7 +24,7 @@
2424
/**
2525
* @description Stores api keys inline as XML.
2626
*/
27-
@MCElement(name = "keys", topLevel = false)
27+
@MCElement(name = "keys", topLevel = false, noEnvelope = true)
2828
public class SimpleKeyStore implements ApiKeyStore {
2929

3030
private final List<Key> keys = new ArrayList<>();

core/src/main/java/com/predic8/membrane/core/interceptor/authentication/session/LDAPUserDataProvider.java

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -110,7 +110,7 @@ public class LDAPUserDataProvider implements UserDataProvider {
110110
AttributeMap map;
111111
SSLParser sslParser;
112112

113-
@MCElement(name="map", topLevel=false, id="ldapUserDataProvider-map")
113+
@MCElement(name="map", topLevel=false, id="ldapUserDataProvider-map", noEnvelope = true)
114114
public static class AttributeMap {
115115

116116
@MCElement(name="attribute", topLevel=false)

core/src/main/java/com/predic8/membrane/core/interceptor/authentication/session/UnifyingUserDataProvider.java

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -37,7 +37,7 @@
3737
* provider could verify the user, the login attempt fails.
3838
* </p>
3939
*/
40-
@MCElement(name="unifyingUserDataProvider", topLevel=false)
40+
@MCElement(name="unifyingUserDataProvider", topLevel=false, noEnvelope = true)
4141
public class UnifyingUserDataProvider implements UserDataProvider {
4242

4343
private List<UserDataProvider> userDataProviders = new ArrayList<>();

core/src/main/java/com/predic8/membrane/core/interceptor/balancer/Balancer.java

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -20,7 +20,7 @@
2020

2121
import java.util.*;
2222

23-
@MCElement(name="clusters", topLevel=false)
23+
@MCElement(name="clusters", topLevel=false, noEnvelope = true)
2424
public class Balancer extends AbstractXmlElement {
2525
public static final String DEFAULT_NAME = "Default";
2626
private static final Logger log = LoggerFactory.getLogger(Balancer.class.getName());

core/src/main/java/com/predic8/membrane/core/interceptor/flow/AbortInterceptor.java

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -29,7 +29,7 @@
2929
* allow normal processing.
3030
* @topic 1. Proxies and Flow
3131
*/
32-
@MCElement(name="abort", topLevel=false)
32+
@MCElement(name="abort", topLevel=false, noEnvelope = true)
3333
public class AbortInterceptor extends AbstractFlowWithChildrenInterceptor {
3434

3535
private static final Logger log = LoggerFactory.getLogger(AbortInterceptor.class);

0 commit comments

Comments
 (0)