This is an automated email from the ASF dual-hosted git repository. nfilotto pushed a commit to branch CAMEL-17717/securityRequirements-cleanup in repository https://gitbox.apache.org/repos/asf/camel.git
commit ccdba875c83d203158f0edb767bb779e304c678a Author: Nicolas Filotto <[email protected]> AuthorDate: Fri Mar 4 09:45:00 2022 +0100 CAMEL-17717: REST DSL securityRequirements cleanup --- .../org/apache/camel/catalog/models/rest.json | 2 +- .../apache/camel/catalog/schemas/camel-spring.xsd | 20 ++++++++----- .../apache/camel/openapi/RestOpenApiReader.java | 28 ++++++++---------- .../org/apache/camel/model/rest/rest.json | 2 +- .../apache/camel/model/rest/RestDefinition.java | 33 ++++++++++++++++------ .../java/org/apache/camel/xml/in/ModelParser.java | 22 +++++++-------- .../ROOT/pages/camel-3x-upgrade-guide-3_16.adoc | 5 +++- .../dsl/yaml/deserializers/ModelDeserializers.java | 4 +-- .../src/generated/resources/camel-yaml-dsl.json | 5 +++- .../src/generated/resources/camelYamlDsl.json | 5 +++- 10 files changed, 77 insertions(+), 49 deletions(-) diff --git a/catalog/camel-catalog/src/generated/resources/org/apache/camel/catalog/models/rest.json b/catalog/camel-catalog/src/generated/resources/org/apache/camel/catalog/models/rest.json index c64990e..7f5f3af 100644 --- a/catalog/camel-catalog/src/generated/resources/org/apache/camel/catalog/models/rest.json +++ b/catalog/camel-catalog/src/generated/resources/org/apache/camel/catalog/models/rest.json @@ -22,7 +22,7 @@ "apiDocs": { "kind": "attribute", "displayName": "Api Docs", "label": "advanced", "required": false, "type": "boolean", "javaType": "java.lang.Boolean", "deprecated": false, "autowired": false, "secret": false, "defaultValue": true, "description": "Whether to include or exclude this rest operation in API documentation. This option will override what may be configured on a parent level. The default value is true." }, "tag": { "kind": "attribute", "displayName": "Tag", "label": "advanced", "required": false, "type": "string", "javaType": "java.lang.String", "deprecated": false, "autowired": false, "secret": false, "description": "To configure a special tag for the operations within this rest definition." }, "securityDefinitions": { "kind": "element", "displayName": "Security Definitions", "label": "security", "required": false, "type": "object", "javaType": "org.apache.camel.model.rest.RestSecuritiesDefinition", "deprecated": false, "autowired": false, "secret": false, "description": "Sets the security definitions such as Basic, OAuth2 etc." }, - "securityRequirements": { "kind": "element", "displayName": "Security Requirements", "label": "security", "required": false, "type": "object", "javaType": "org.apache.camel.model.rest.SecurityRequirementsDefinition", "deprecated": false, "autowired": false, "secret": false, "description": "Sets the security requirement(s) for all endpoints." }, + "securityRequirements": { "kind": "element", "displayName": "Security Requirements", "label": "security", "required": false, "type": "array", "javaType": "java.util.List<org.apache.camel.model.rest.SecurityDefinition>", "deprecated": false, "autowired": false, "secret": false, "description": "Sets the security requirement(s) for all endpoints." }, "id": { "kind": "attribute", "displayName": "Id", "required": false, "type": "string", "javaType": "java.lang.String", "deprecated": false, "autowired": false, "secret": false, "description": "Sets the id of this node" }, "description": { "kind": "element", "displayName": "Description", "required": false, "type": "object", "javaType": "org.apache.camel.model.DescriptionDefinition", "deprecated": false, "autowired": false, "secret": false, "description": "Sets the description of this node" } } diff --git a/catalog/camel-catalog/src/generated/resources/org/apache/camel/catalog/schemas/camel-spring.xsd b/catalog/camel-catalog/src/generated/resources/org/apache/camel/catalog/schemas/camel-spring.xsd index b600499..1570f16 100644 --- a/catalog/camel-catalog/src/generated/resources/org/apache/camel/catalog/schemas/camel-spring.xsd +++ b/catalog/camel-catalog/src/generated/resources/org/apache/camel/catalog/schemas/camel-spring.xsd @@ -14664,7 +14664,13 @@ to refer to an existing data format instance. <xs:extension base="tns:optionalIdentifiedDefinition"> <xs:sequence> <xs:element minOccurs="0" ref="tns:securityDefinitions"/> - <xs:element minOccurs="0" ref="tns:securityRequirements"/> + <xs:element maxOccurs="unbounded" minOccurs="0" name="securityRequirements" type="tns:securityDefinition"> + <xs:annotation> + <xs:documentation xml:lang="en"><![CDATA[ +Sets the security requirement(s) for all endpoints. + ]]></xs:documentation> + </xs:annotation> + </xs:element> <xs:choice maxOccurs="unbounded" minOccurs="0"> <xs:element ref="tns:delete"/> <xs:element ref="tns:get"/> @@ -14772,12 +14778,6 @@ To configure a special tag for the operations within this rest definition. </xs:sequence> </xs:complexType> - <xs:complexType name="securityRequirementsDefinition"> - <xs:sequence> - <xs:element maxOccurs="unbounded" minOccurs="0" name="securityRequirement" type="tns:securityDefinition"/> - </xs:sequence> - </xs:complexType> - <xs:complexType name="restsDefinition"> <xs:complexContent> <xs:extension base="tns:optionalIdentifiedDefinition"> @@ -14788,6 +14788,12 @@ To configure a special tag for the operations within this rest definition. </xs:complexContent> </xs:complexType> + <xs:complexType name="securityRequirementsDefinition"> + <xs:sequence> + <xs:element maxOccurs="unbounded" minOccurs="0" name="securityRequirement" type="tns:securityDefinition"/> + </xs:sequence> + </xs:complexType> + <xs:complexType name="customTransformer"> <xs:complexContent> <xs:extension base="tns:transformer"> diff --git a/components/camel-openapi-java/src/main/java/org/apache/camel/openapi/RestOpenApiReader.java b/components/camel-openapi-java/src/main/java/org/apache/camel/openapi/RestOpenApiReader.java index 43f7348..cfe96b5 100644 --- a/components/camel-openapi-java/src/main/java/org/apache/camel/openapi/RestOpenApiReader.java +++ b/components/camel-openapi-java/src/main/java/org/apache/camel/openapi/RestOpenApiReader.java @@ -97,7 +97,6 @@ import org.apache.camel.model.rest.RestPropertyDefinition; import org.apache.camel.model.rest.RestSecuritiesDefinition; import org.apache.camel.model.rest.RestSecurityDefinition; import org.apache.camel.model.rest.SecurityDefinition; -import org.apache.camel.model.rest.SecurityRequirementsDefinition; import org.apache.camel.model.rest.VerbDefinition; import org.apache.camel.spi.ClassResolver; import org.apache.camel.support.CamelContextHelper; @@ -258,21 +257,18 @@ public class RestOpenApiReader { doParseVerbs(camelContext, openApi, rest, camelContextId, verbs, pathAsTag); // setup root security node if necessary - SecurityRequirementsDefinition securitiesRequirement = rest.getSecurityRequirements(); - if (securitiesRequirement != null) { - Collection<SecurityDefinition> securityRequirements = securitiesRequirement.securityRequirements(); - securityRequirements.forEach(requirement -> { - OasSecurityRequirement oasRequirement = openApi.createSecurityRequirement(); - List<String> scopes; - if (requirement.getScopes() == null || requirement.getScopes().trim().isEmpty()) { - scopes = Collections.emptyList(); - } else { - scopes = Arrays.asList(requirement.getScopes().trim().split("\\s*,\\s*")); - } - oasRequirement.addSecurityRequirementItem(requirement.getKey(), scopes); - openApi.addSecurityRequirement(oasRequirement); - }); - } + Collection<SecurityDefinition> securityRequirements = rest.securityRequirements(); + securityRequirements.forEach(requirement -> { + OasSecurityRequirement oasRequirement = openApi.createSecurityRequirement(); + List<String> scopes; + if (requirement.getScopes() == null || requirement.getScopes().trim().isEmpty()) { + scopes = Collections.emptyList(); + } else { + scopes = Arrays.asList(requirement.getScopes().trim().split("\\s*,\\s*")); + } + oasRequirement.addSecurityRequirementItem(requirement.getKey(), scopes); + openApi.addSecurityRequirement(oasRequirement); + }); } private void parseOas30(Oas30Document openApi, RestDefinition rest, String pathAsTag) { diff --git a/core/camel-core-model/src/generated/resources/org/apache/camel/model/rest/rest.json b/core/camel-core-model/src/generated/resources/org/apache/camel/model/rest/rest.json index c64990e..7f5f3af 100644 --- a/core/camel-core-model/src/generated/resources/org/apache/camel/model/rest/rest.json +++ b/core/camel-core-model/src/generated/resources/org/apache/camel/model/rest/rest.json @@ -22,7 +22,7 @@ "apiDocs": { "kind": "attribute", "displayName": "Api Docs", "label": "advanced", "required": false, "type": "boolean", "javaType": "java.lang.Boolean", "deprecated": false, "autowired": false, "secret": false, "defaultValue": true, "description": "Whether to include or exclude this rest operation in API documentation. This option will override what may be configured on a parent level. The default value is true." }, "tag": { "kind": "attribute", "displayName": "Tag", "label": "advanced", "required": false, "type": "string", "javaType": "java.lang.String", "deprecated": false, "autowired": false, "secret": false, "description": "To configure a special tag for the operations within this rest definition." }, "securityDefinitions": { "kind": "element", "displayName": "Security Definitions", "label": "security", "required": false, "type": "object", "javaType": "org.apache.camel.model.rest.RestSecuritiesDefinition", "deprecated": false, "autowired": false, "secret": false, "description": "Sets the security definitions such as Basic, OAuth2 etc." }, - "securityRequirements": { "kind": "element", "displayName": "Security Requirements", "label": "security", "required": false, "type": "object", "javaType": "org.apache.camel.model.rest.SecurityRequirementsDefinition", "deprecated": false, "autowired": false, "secret": false, "description": "Sets the security requirement(s) for all endpoints." }, + "securityRequirements": { "kind": "element", "displayName": "Security Requirements", "label": "security", "required": false, "type": "array", "javaType": "java.util.List<org.apache.camel.model.rest.SecurityDefinition>", "deprecated": false, "autowired": false, "secret": false, "description": "Sets the security requirement(s) for all endpoints." }, "id": { "kind": "attribute", "displayName": "Id", "required": false, "type": "string", "javaType": "java.lang.String", "deprecated": false, "autowired": false, "secret": false, "description": "Sets the id of this node" }, "description": { "kind": "element", "displayName": "Description", "required": false, "type": "object", "javaType": "org.apache.camel.model.DescriptionDefinition", "deprecated": false, "autowired": false, "secret": false, "description": "Sets the description of this node" } } diff --git a/core/camel-core-model/src/main/java/org/apache/camel/model/rest/RestDefinition.java b/core/camel-core-model/src/main/java/org/apache/camel/model/rest/RestDefinition.java index 954be24..46d546b 100644 --- a/core/camel-core-model/src/main/java/org/apache/camel/model/rest/RestDefinition.java +++ b/core/camel-core-model/src/main/java/org/apache/camel/model/rest/RestDefinition.java @@ -17,13 +17,16 @@ package org.apache.camel.model.rest; import java.util.ArrayList; +import java.util.Collection; import java.util.HashMap; import java.util.HashSet; import java.util.List; import java.util.Map; import java.util.Set; +import java.util.function.Function; import java.util.regex.Matcher; import java.util.regex.Pattern; +import java.util.stream.Collectors; import javax.xml.bind.annotation.XmlAccessType; import javax.xml.bind.annotation.XmlAccessorType; @@ -31,6 +34,7 @@ import javax.xml.bind.annotation.XmlAttribute; import javax.xml.bind.annotation.XmlElement; import javax.xml.bind.annotation.XmlElementRef; import javax.xml.bind.annotation.XmlRootElement; +import javax.xml.bind.annotation.XmlTransient; import org.apache.camel.CamelContext; import org.apache.camel.ExtendedCamelContext; @@ -80,11 +84,13 @@ public class RestDefinition extends OptionalIdentifiedDefinition<RestDefinition> @XmlElement(name = "securityDefinitions") // use the name Swagger/OpenAPI uses @Metadata(label = "security") private RestSecuritiesDefinition securityDefinitions; - @XmlElement(name = "securityRequirements") // use the name Swagger/OpenAPI uses + @XmlElement @Metadata(label = "security") - private SecurityRequirementsDefinition securityRequirements; + private List<SecurityDefinition> securityRequirements = new ArrayList<>(); @XmlElementRef private List<VerbDefinition> verbs = new ArrayList<>(); + @XmlTransient + private Map<String, SecurityDefinition> itemsMap = new HashMap<>(); @Override public String getShortName() { @@ -170,15 +176,17 @@ public class RestDefinition extends OptionalIdentifiedDefinition<RestDefinition> this.securityDefinitions = securityDefinitions; } - public SecurityRequirementsDefinition getSecurityRequirements() { + public List<SecurityDefinition> getSecurityRequirements() { return securityRequirements; } /** * Sets the security requirement(s) for all endpoints. */ - public void setSecurityRequirements(SecurityRequirementsDefinition securityRequirements) { - this.securityRequirements = securityRequirements; + public void setSecurityRequirements(Collection<SecurityDefinition> securityRequirements) { + itemsMap = securityRequirements.stream() + .collect(Collectors.toMap(SecurityDefinition::getKey, Function.identity(), (u, v) -> u)); + this.securityRequirements = new ArrayList<>(itemsMap.values()); } /** @@ -591,10 +599,15 @@ public class RestDefinition extends OptionalIdentifiedDefinition<RestDefinition> public RestDefinition security(String key, String scopes) { // add to last verb if (getVerbs().isEmpty()) { - if (securityRequirements == null) { - securityRequirements = new SecurityRequirementsDefinition(); + SecurityDefinition requirement = itemsMap.get(key); + if (requirement == null) { + requirement = new SecurityDefinition(); } - securityRequirements.securityRequirement(key, scopes); + + requirement.setKey(key); + requirement.setScopes(scopes); + itemsMap.put(key, requirement); + securityRequirements = new ArrayList<>(itemsMap.values()); } else { VerbDefinition verb = getVerbs().get(getVerbs().size() - 1); SecurityDefinition sd = new SecurityDefinition(); @@ -606,6 +619,10 @@ public class RestDefinition extends OptionalIdentifiedDefinition<RestDefinition> return this; } + public Collection<SecurityDefinition> securityRequirements() { + return new ArrayList<>(securityRequirements); + } + /** * The Camel endpoint this REST service will call, such as a direct endpoint to link to an existing route that * handles this REST call. diff --git a/core/camel-xml-io/src/generated/java/org/apache/camel/xml/in/ModelParser.java b/core/camel-xml-io/src/generated/java/org/apache/camel/xml/in/ModelParser.java index 5b9047b..c2ea239 100644 --- a/core/camel-xml-io/src/generated/java/org/apache/camel/xml/in/ModelParser.java +++ b/core/camel-xml-io/src/generated/java/org/apache/camel/xml/in/ModelParser.java @@ -1095,7 +1095,7 @@ public class ModelParser extends BaseParser { case "post": doAdd(doParsePostDefinition(), def.getVerbs(), def::setVerbs); break; case "put": doAdd(doParsePutDefinition(), def.getVerbs(), def::setVerbs); break; case "securityDefinitions": def.setSecurityDefinitions(doParseRestSecuritiesDefinition()); break; - case "securityRequirements": def.setSecurityRequirements(doParseSecurityRequirementsDefinition()); break; + case "securityRequirements": doAdd(doParseSecurityDefinition(), def.getSecurityRequirements(), def::setSecurityRequirements); break; default: return optionalIdentifiedDefinitionElementHandler().accept(def, key); } return true; @@ -3065,16 +3065,6 @@ public class ModelParser extends BaseParser { return true; }, noValueHandler()); } - protected SecurityRequirementsDefinition doParseSecurityRequirementsDefinition() throws IOException, XmlPullParserException { - return doParse(new SecurityRequirementsDefinition(), - noAttributeHandler(), (def, key) -> { - if ("securityRequirement".equals(key)) { - doAdd(doParseSecurityDefinition(), def.getSecurityRequirements(), def::setSecurityRequirements); - return true; - } - return false; - }, noValueHandler()); - } public Optional<RestsDefinition> parseRestsDefinition() throws IOException, XmlPullParserException { String tag = getNextTag("rests", "rest"); @@ -3108,6 +3098,16 @@ public class ModelParser extends BaseParser { return optionalIdentifiedDefinitionElementHandler().accept(def, key); }, noValueHandler()); } + protected SecurityRequirementsDefinition doParseSecurityRequirementsDefinition() throws IOException, XmlPullParserException { + return doParse(new SecurityRequirementsDefinition(), + noAttributeHandler(), (def, key) -> { + if ("securityRequirement".equals(key)) { + doAdd(doParseSecurityDefinition(), def.getSecurityRequirements(), def::setSecurityRequirements); + return true; + } + return false; + }, noValueHandler()); + } protected CustomTransformerDefinition doParseCustomTransformerDefinition() throws IOException, XmlPullParserException { return doParse(new CustomTransformerDefinition(), (def, key, val) -> { switch (key) { diff --git a/docs/user-manual/modules/ROOT/pages/camel-3x-upgrade-guide-3_16.adoc b/docs/user-manual/modules/ROOT/pages/camel-3x-upgrade-guide-3_16.adoc index 7be01b3..0e54c46 100644 --- a/docs/user-manual/modules/ROOT/pages/camel-3x-upgrade-guide-3_16.adoc +++ b/docs/user-manual/modules/ROOT/pages/camel-3x-upgrade-guide-3_16.adoc @@ -147,7 +147,10 @@ Renamed the following classes in package `org.apache.camel.model.rest`: - `RestOperationParamDefinition` to `ParamDefinition` - `RestOperationResponseHeaderDefinition` to `ResponseHeaderDefinition` - `RestOperationResponseMsgDefinition` to `ResponseMessageDefinition` -- `RestSecuritiesRequirement` to `SecurityRequirementsDefinition` + +==== Removed classes + +For the sake of simplicity, the class `RestSecuritiesRequirement` has been removed because it contains only elements of type `SecurityDefinition` which have been moved directly into `RestDefinition`. === Aggregate EIP diff --git a/dsl/camel-yaml-dsl/camel-yaml-dsl-deserializers/src/generated/java/org/apache/camel/dsl/yaml/deserializers/ModelDeserializers.java b/dsl/camel-yaml-dsl/camel-yaml-dsl-deserializers/src/generated/java/org/apache/camel/dsl/yaml/deserializers/ModelDeserializers.java index 7d9cc24..ae9bbc4 100644 --- a/dsl/camel-yaml-dsl/camel-yaml-dsl-deserializers/src/generated/java/org/apache/camel/dsl/yaml/deserializers/ModelDeserializers.java +++ b/dsl/camel-yaml-dsl/camel-yaml-dsl-deserializers/src/generated/java/org/apache/camel/dsl/yaml/deserializers/ModelDeserializers.java @@ -12165,7 +12165,7 @@ public final class ModelDeserializers extends YamlDeserializerSupport { @YamlProperty(name = "produces", type = "string"), @YamlProperty(name = "put", type = "array:org.apache.camel.model.rest.PutDefinition"), @YamlProperty(name = "security-definitions", type = "object:org.apache.camel.model.rest.RestSecuritiesDefinition"), - @YamlProperty(name = "security-requirements", type = "object:org.apache.camel.model.rest.SecurityRequirementsDefinition"), + @YamlProperty(name = "security-requirements", type = "array:org.apache.camel.model.rest.SecurityDefinition"), @YamlProperty(name = "skip-binding-on-error-code", type = "boolean"), @YamlProperty(name = "tag", type = "string") } @@ -12225,7 +12225,7 @@ public final class ModelDeserializers extends YamlDeserializerSupport { break; } case "security-requirements": { - org.apache.camel.model.rest.SecurityRequirementsDefinition val = asType(node, org.apache.camel.model.rest.SecurityRequirementsDefinition.class); + java.util.List<org.apache.camel.model.rest.SecurityDefinition> val = asFlatList(node, org.apache.camel.model.rest.SecurityDefinition.class); target.setSecurityRequirements(val); break; } diff --git a/dsl/camel-yaml-dsl/camel-yaml-dsl/src/generated/resources/camel-yaml-dsl.json b/dsl/camel-yaml-dsl/camel-yaml-dsl/src/generated/resources/camel-yaml-dsl.json index ac4fdc1..038e998 100644 --- a/dsl/camel-yaml-dsl/camel-yaml-dsl/src/generated/resources/camel-yaml-dsl.json +++ b/dsl/camel-yaml-dsl/camel-yaml-dsl/src/generated/resources/camel-yaml-dsl.json @@ -7368,7 +7368,10 @@ "$ref" : "#/items/definitions/org.apache.camel.model.rest.RestSecuritiesDefinition" }, "security-requirements" : { - "$ref" : "#/items/definitions/org.apache.camel.model.rest.SecurityRequirementsDefinition" + "type" : "array", + "items" : { + "$ref" : "#/items/definitions/org.apache.camel.model.rest.SecurityDefinition" + } }, "skip-binding-on-error-code" : { "type" : "boolean" diff --git a/dsl/camel-yaml-dsl/camel-yaml-dsl/src/generated/resources/camelYamlDsl.json b/dsl/camel-yaml-dsl/camel-yaml-dsl/src/generated/resources/camelYamlDsl.json index cf4c823..04fddab 100644 --- a/dsl/camel-yaml-dsl/camel-yaml-dsl/src/generated/resources/camelYamlDsl.json +++ b/dsl/camel-yaml-dsl/camel-yaml-dsl/src/generated/resources/camelYamlDsl.json @@ -7266,7 +7266,10 @@ "$ref" : "#/items/definitions/org.apache.camel.model.rest.RestSecuritiesDefinition" }, "securityRequirements" : { - "$ref" : "#/items/definitions/org.apache.camel.model.rest.SecurityRequirementsDefinition" + "type" : "array", + "items" : { + "$ref" : "#/items/definitions/org.apache.camel.model.rest.SecurityDefinition" + } }, "skipBindingOnErrorCode" : { "type" : "boolean"
