Skip to content

Commit

Permalink
Implemented DeleteAllSecurityRequirementsCommand.
Browse files Browse the repository at this point in the history
  • Loading branch information
EricWittmann committed Jan 6, 2025
1 parent 1ea6fc8 commit 3129211
Show file tree
Hide file tree
Showing 5 changed files with 279 additions and 2 deletions.
13 changes: 13 additions & 0 deletions src/main/java/io/apicurio/datamodels/cmd/CommandFactory.java
Original file line number Diff line number Diff line change
Expand Up @@ -15,6 +15,7 @@
import io.apicurio.datamodels.cmd.commands.DeleteAllParametersCommand;
import io.apicurio.datamodels.cmd.commands.DeleteAllPropertiesCommand;
import io.apicurio.datamodels.cmd.commands.DeleteAllResponsesCommand;
import io.apicurio.datamodels.cmd.commands.DeleteAllSecurityRequirementsCommand;
import io.apicurio.datamodels.cmd.commands.DeleteContactCommand;
import io.apicurio.datamodels.cmd.commands.DeleteExtensionCommand;
import io.apicurio.datamodels.cmd.commands.DeleteLicenseCommand;
Expand All @@ -23,6 +24,8 @@
import io.apicurio.datamodels.models.Info;
import io.apicurio.datamodels.models.Node;
import io.apicurio.datamodels.models.Schema;
import io.apicurio.datamodels.models.asyncapi.AsyncApiServer;
import io.apicurio.datamodels.models.openapi.OpenApiDocument;
import io.apicurio.datamodels.models.openapi.OpenApiHeader;
import io.apicurio.datamodels.models.openapi.OpenApiMediaType;
import io.apicurio.datamodels.models.openapi.OpenApiOperation;
Expand Down Expand Up @@ -125,4 +128,14 @@ public static final ICommand createDeleteAllResponsesCommand(OpenApiOperation op
return new DeleteAllResponsesCommand(operation);
}

public static final ICommand createDeleteAllServerSecurityRequirementsCommand(AsyncApiServer server) {
return new DeleteAllSecurityRequirementsCommand(server);
}
public static final ICommand createDeleteAllOperationSecurityRequirementsCommand(OpenApiOperation operation) {
return new DeleteAllSecurityRequirementsCommand(operation);
}
public static final ICommand createDeleteAllDocumentSecurityRequirementsCommand(OpenApiDocument document) {
return new DeleteAllSecurityRequirementsCommand(document);
}

}
Original file line number Diff line number Diff line change
@@ -0,0 +1,258 @@
package io.apicurio.datamodels.cmd.commands;

import com.fasterxml.jackson.databind.node.ObjectNode;
import io.apicurio.datamodels.Library;
import io.apicurio.datamodels.cmd.AbstractCommand;
import io.apicurio.datamodels.models.Document;
import io.apicurio.datamodels.models.Node;
import io.apicurio.datamodels.models.Operation;
import io.apicurio.datamodels.models.SecurityRequirement;
import io.apicurio.datamodels.models.Server;
import io.apicurio.datamodels.models.asyncapi.v20.AsyncApi20SecurityRequirement;
import io.apicurio.datamodels.models.asyncapi.v20.AsyncApi20Server;
import io.apicurio.datamodels.models.asyncapi.v21.AsyncApi21SecurityRequirement;
import io.apicurio.datamodels.models.asyncapi.v21.AsyncApi21Server;
import io.apicurio.datamodels.models.asyncapi.v22.AsyncApi22SecurityRequirement;
import io.apicurio.datamodels.models.asyncapi.v22.AsyncApi22Server;
import io.apicurio.datamodels.models.asyncapi.v23.AsyncApi23SecurityRequirement;
import io.apicurio.datamodels.models.asyncapi.v23.AsyncApi23Server;
import io.apicurio.datamodels.models.asyncapi.v24.AsyncApi24SecurityRequirement;
import io.apicurio.datamodels.models.asyncapi.v24.AsyncApi24Server;
import io.apicurio.datamodels.models.asyncapi.v25.AsyncApi25SecurityRequirement;
import io.apicurio.datamodels.models.asyncapi.v25.AsyncApi25Server;
import io.apicurio.datamodels.models.asyncapi.v26.AsyncApi26SecurityRequirement;
import io.apicurio.datamodels.models.asyncapi.v26.AsyncApi26Server;
import io.apicurio.datamodels.models.openapi.OpenApiDocument;
import io.apicurio.datamodels.models.openapi.OpenApiOperation;
import io.apicurio.datamodels.models.openapi.OpenApiSecurityRequirement;
import io.apicurio.datamodels.models.visitors.CombinedVisitorAdapter;
import io.apicurio.datamodels.paths.NodePath;
import io.apicurio.datamodels.paths.NodePathUtil;
import io.apicurio.datamodels.util.LoggerUtil;
import io.apicurio.datamodels.util.NodeUtil;

import java.util.ArrayList;
import java.util.List;

/**
* A command used to delete all security requirements from a document or operation.
* @author [email protected]
*/
public class DeleteAllSecurityRequirementsCommand extends AbstractCommand {

public NodePath _parentPath;
public List<ObjectNode> _oldSecurityRequirements;

public DeleteAllSecurityRequirementsCommand() {
}

public DeleteAllSecurityRequirementsCommand(Node parent) {
this._parentPath = Library.createNodePath(parent);
}

/**
* @see io.apicurio.datamodels.cmd.ICommand#execute(Document)
*/
@Override
public void execute(Document document) {
LoggerUtil.info("[DeleteAllSecurityRequirementsCommand] Executing.");
this._oldSecurityRequirements = new ArrayList<>();

Node parent = NodePathUtil.resolveNodePath(this._parentPath, document);
if (this.isNullOrUndefined(parent)) {
return;
}

// Save the old security-requirements (if any)
List<? extends SecurityRequirement> requirements = (List<? extends SecurityRequirement>) NodeUtil.getProperty(parent, "security");
if (!this.isNullOrUndefined(requirements)) {
requirements.forEach( req -> {
this._oldSecurityRequirements.add(Library.writeNode(req));
});
}

clearSecurityRequirements(parent);
}

private void clearSecurityRequirements(Node parent) {
ClearSecurityRequirementsVisitor csrv = new ClearSecurityRequirementsVisitor();
parent.accept(csrv);
}

/**
* @see io.apicurio.datamodels.cmd.ICommand#undo(Document)
*/
@Override
public void undo(Document document) {
LoggerUtil.info("[DeleteAllSecurityRequirementsCommand] Reverting.");
if (NodeUtil.isDefined(this._oldSecurityRequirements) && this._oldSecurityRequirements.isEmpty()) {
return;
}

Node parent = NodePathUtil.resolveNodePath(this._parentPath, document);
if (this.isNullOrUndefined(parent)) {
return;
}

List<? extends SecurityRequirement> requirements = (List<? extends SecurityRequirement>) NodeUtil.getProperty(parent, "security");
if (this.isNullOrUndefined(requirements)) {
requirements = new ArrayList<>();
NodeUtil.setProperty(parent, "security", requirements);
}
for (ObjectNode oldSecurityRequirement : this._oldSecurityRequirements) {
SecurityRequirement requirement = createSecurityRequirement(parent);
Library.readNode(oldSecurityRequirement, requirement);
addSecurityRequirement(parent, requirement);
}
}

private SecurityRequirement createSecurityRequirement(Node parent) {
CreateSecurityRequirementVisitor csrv = new CreateSecurityRequirementVisitor();
parent.accept(csrv);
return csrv._requirement;
}

private void addSecurityRequirement(Node parent, SecurityRequirement requirement) {
AddSecurityRequirementVisitor asrv = new AddSecurityRequirementVisitor(requirement);
parent.accept(asrv);
}

private class ClearSecurityRequirementsVisitor extends CombinedVisitorAdapter {

public ClearSecurityRequirementsVisitor() {
}

@Override
public void visitDocument(Document node) {
((OpenApiDocument) node).clearSecurity();
}

@Override
public void visitOperation(Operation node) {
((OpenApiOperation) node).clearSecurity();
}

@Override
public void visitServer(Server node) {
switch (node.root().modelType()) {
case ASYNCAPI20:
((AsyncApi20Server) node).clearSecurity();
break;
case ASYNCAPI21:
((AsyncApi21Server) node).clearSecurity();
break;
case ASYNCAPI22:
((AsyncApi22Server) node).clearSecurity();
break;
case ASYNCAPI23:
((AsyncApi23Server) node).clearSecurity();
break;
case ASYNCAPI24:
((AsyncApi24Server) node).clearSecurity();
break;
case ASYNCAPI25:
((AsyncApi25Server) node).clearSecurity();
break;
case ASYNCAPI26:
((AsyncApi26Server) node).clearSecurity();
break;
default:
break;
}
}
}

private class CreateSecurityRequirementVisitor extends CombinedVisitorAdapter {
SecurityRequirement _requirement;

public CreateSecurityRequirementVisitor() {
}

@Override
public void visitDocument(Document node) {
this._requirement = ((OpenApiDocument) node).createSecurityRequirement();
}

@Override
public void visitOperation(Operation node) {
this._requirement = ((OpenApiOperation) node).createSecurityRequirement();
}

@Override
public void visitServer(Server node) {
switch (node.root().modelType()) {
case ASYNCAPI20:
this._requirement = ((AsyncApi20Server) node).createSecurityRequirement();
break;
case ASYNCAPI21:
this._requirement = ((AsyncApi21Server) node).createSecurityRequirement();
break;
case ASYNCAPI22:
this._requirement = ((AsyncApi22Server) node).createSecurityRequirement();
break;
case ASYNCAPI23:
this._requirement = ((AsyncApi23Server) node).createSecurityRequirement();
break;
case ASYNCAPI24:
this._requirement = ((AsyncApi24Server) node).createSecurityRequirement();
break;
case ASYNCAPI25:
this._requirement = ((AsyncApi25Server) node).createSecurityRequirement();
break;
case ASYNCAPI26:
this._requirement = ((AsyncApi26Server) node).createSecurityRequirement();
break;
default:
break;
}
}
}

private class AddSecurityRequirementVisitor extends CombinedVisitorAdapter {
SecurityRequirement _requirement;

public AddSecurityRequirementVisitor(SecurityRequirement requirement) {
this._requirement = requirement;
}

@Override
public void visitDocument(Document node) {
((OpenApiDocument) node).addSecurity((OpenApiSecurityRequirement) this._requirement);
}

@Override
public void visitOperation(Operation node) {
((OpenApiOperation) node).addSecurity((OpenApiSecurityRequirement) this._requirement);
}

@Override
public void visitServer(Server node) {
switch (node.root().modelType()) {
case ASYNCAPI20:
((AsyncApi20Server) node).addSecurity((AsyncApi20SecurityRequirement) this._requirement);
break;
case ASYNCAPI21:
((AsyncApi21Server) node).addSecurity((AsyncApi21SecurityRequirement) this._requirement);
break;
case ASYNCAPI22:
((AsyncApi22Server) node).addSecurity((AsyncApi22SecurityRequirement) this._requirement);
break;
case ASYNCAPI23:
((AsyncApi23Server) node).addSecurity((AsyncApi23SecurityRequirement) this._requirement);
break;
case ASYNCAPI24:
((AsyncApi24Server) node).addSecurity((AsyncApi24SecurityRequirement) this._requirement);
break;
case ASYNCAPI25:
((AsyncApi25Server) node).addSecurity((AsyncApi25SecurityRequirement) this._requirement);
break;
case ASYNCAPI26:
((AsyncApi26Server) node).addSecurity((AsyncApi26SecurityRequirement) this._requirement);
break;
default:
break;
}
}
}

}
2 changes: 2 additions & 0 deletions src/main/ts/src/io/apicurio/datamodels/util/CommandUtil.ts
Original file line number Diff line number Diff line change
Expand Up @@ -19,6 +19,7 @@ import {DeleteAllOperationsCommand} from "../cmd/commands/DeleteAllOperationsCom
import {DeleteAllParametersCommand} from "../cmd/commands/DeleteAllParametersCommand";
import {DeleteAllPropertiesCommand} from "../cmd/commands/DeleteAllPropertiesCommand";
import {DeleteAllResponsesCommand} from "../cmd/commands/DeleteAllResponsesCommand";
import {DeleteAllSecurityRequirementsCommand} from "../cmd/commands/DeleteAllSecurityRequirementsCommand";
import {DeleteContactCommand} from "../cmd/commands/DeleteContactCommand";
import {DeleteExtensionCommand} from "../cmd/commands/DeleteExtensionCommand";
import {DeleteLicenseCommand} from "../cmd/commands/DeleteLicenseCommand";
Expand Down Expand Up @@ -54,6 +55,7 @@ const commandSuppliers: { [key: string]: Supplier } = {
"DeleteAllParametersCommand": () => { return new DeleteAllParametersCommand(); },
"DeleteAllPropertiesCommand": () => { return new DeleteAllPropertiesCommand(); },
"DeleteAllResponsesCommand": () => { return new DeleteAllResponsesCommand(); },
"DeleteAllSecurityRequirementsCommand": () => { return new DeleteAllSecurityRequirementsCommand(); },
"DeleteContactCommand": () => { return new DeleteContactCommand(); },
"DeleteExtensionCommand": () => { return new DeleteExtensionCommand(); },
"DeleteLicenseCommand": () => { return new DeleteLicenseCommand(); },
Expand Down
Original file line number Diff line number Diff line change
@@ -1,6 +1,6 @@
[
{
"__type": "DeleteAllSecurityRequirementsCommand",
"_parentPath" : "/servers/production"
"_parentPath" : "/servers[production]"
}
]
6 changes: 5 additions & 1 deletion src/test/resources/fixtures/cmd/tests.json
Original file line number Diff line number Diff line change
Expand Up @@ -45,5 +45,9 @@
{ "name": "[OpenAPI 3] {Delete All Properties} - Delete All Properties", "test": "commands/delete-all-properties/openapi-3/delete-all-properties" },
{ "name": "[AsyncAPI 2] {Delete All Properties} - Delete All Properties", "test": "commands/delete-all-properties/asyncapi-2/delete-all-properties" },
{ "name": "[OpenAPI 2] {Delete All Responses} - Delete All Responses", "test": "commands/delete-all-responses/openapi-2/delete-all-responses" },
{ "name": "[OpenAPI 3] {Delete All Responses} - Delete All Responses", "test": "commands/delete-all-responses/openapi-3/delete-all-responses" }
{ "name": "[OpenAPI 3] {Delete All Responses} - Delete All Responses", "test": "commands/delete-all-responses/openapi-3/delete-all-responses" },
{ "name": "[OpenAPI 2] {Delete All Security Requirements} - Delete All Security Requirements", "test": "commands/delete-all-security-requirements/openapi-2/delete-all-security-requirements" },
{ "name": "[OpenAPI 3] {Delete All Security Requirements} - Delete All Security Requirements Op", "test": "commands/delete-all-security-requirements/openapi-3/delete-all-security-requirements-op" },
{ "name": "[OpenAPI 3] {Delete All Security Requirements} - Delete All Security Requirements", "test": "commands/delete-all-security-requirements/openapi-3/delete-all-security-requirements" },
{ "name": "[AsyncAPI 2] {Delete All Security Requirements} - Delete All Security Requirements", "test": "commands/delete-all-security-requirements/asyncapi-2/delete-all-security-requirements" }
]

0 comments on commit 3129211

Please sign in to comment.