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"

Reply via email to