b/162949100 Define Callback Traversal Change-Id: Ie53c4641e424fa3e5d39c6c1016988236cfc4758
diff --git a/oas-core/src/main/java/com/apigee/security/oas/extendedvalidator/BaseTraversalHelper.java b/oas-core/src/main/java/com/apigee/security/oas/extendedvalidator/BaseTraversalHelper.java index 265431f..71e3a01 100644 --- a/oas-core/src/main/java/com/apigee/security/oas/extendedvalidator/BaseTraversalHelper.java +++ b/oas-core/src/main/java/com/apigee/security/oas/extendedvalidator/BaseTraversalHelper.java
@@ -7,6 +7,7 @@ import java.util.Optional; import javax.inject.Inject; import org.openapi4j.parser.model.OpenApiSchema; +import org.openapi4j.parser.model.v3.Callback; import org.openapi4j.parser.model.v3.Contact; import org.openapi4j.parser.model.v3.ExternalDocs; import org.openapi4j.parser.model.v3.Info; @@ -44,6 +45,17 @@ } @Override + public void sendCallbackTraversals(ImmutableMap<String, Callback> callbackMap) { + Optional.ofNullable(callbackMap) + .ifPresent( + callbacks -> + callbackMap.forEach( + (name, callback) -> + coordinator.handleTraversalCommand( + factory.create(callback, traversalPath, name)))); + } + + @Override public void sendContactTraversal(Contact contact) { Optional.ofNullable(contact) .ifPresent(
diff --git a/oas-core/src/main/java/com/apigee/security/oas/extendedvalidator/CallbackTraversal.java b/oas-core/src/main/java/com/apigee/security/oas/extendedvalidator/CallbackTraversal.java new file mode 100644 index 0000000..ca89f3c --- /dev/null +++ b/oas-core/src/main/java/com/apigee/security/oas/extendedvalidator/CallbackTraversal.java
@@ -0,0 +1,34 @@ +package com.apigee.security.oas.extendedvalidator; + +import com.google.common.collect.ImmutableList; +import com.google.inject.assistedinject.Assisted; +import java.util.Map; +import java.util.Optional; +import javax.inject.Inject; +import org.openapi4j.parser.model.OpenApiSchema; +import org.openapi4j.parser.model.v3.Callback; + +/** A {@link Traversal} that traverses a {@link Callback} object. */ +public class CallbackTraversal extends Traversal<Callback> implements CallbackTraversalCommand { + @Inject + CallbackTraversal( + TraversalHelperFactory traversalHelperFactory, + ExtensionValidationIntegrator extensionValidationIntegrator, + @Assisted + ImmutableList<Map.Entry<Class<? extends OpenApiSchema>, Optional<String>>> traversalPath, + @Assisted Callback openApiSchemaObj, + @Assisted String name) { + super( + traversalHelperFactory, + extensionValidationIntegrator, + traversalPath, + openApiSchemaObj, + name); + } + + @Override + public void traverse() { + // TODO(b/161441872): Process extensions. + // TODO(b/162508047): Add path object traversal and callback object traversal logic. + } +}
diff --git a/oas-core/src/main/java/com/apigee/security/oas/extendedvalidator/CallbackTraversalCommand.java b/oas-core/src/main/java/com/apigee/security/oas/extendedvalidator/CallbackTraversalCommand.java new file mode 100644 index 0000000..fdd48d1 --- /dev/null +++ b/oas-core/src/main/java/com/apigee/security/oas/extendedvalidator/CallbackTraversalCommand.java
@@ -0,0 +1,4 @@ +package com.apigee.security.oas.extendedvalidator; + +/** A {@link TraversalCommand} interface for {@link CallbackTraversal}. */ +public interface CallbackTraversalCommand extends TraversalCommand {}
diff --git a/oas-core/src/main/java/com/apigee/security/oas/extendedvalidator/OperationTraversal.java b/oas-core/src/main/java/com/apigee/security/oas/extendedvalidator/OperationTraversal.java index c929fa8..6fd6f9f 100644 --- a/oas-core/src/main/java/com/apigee/security/oas/extendedvalidator/OperationTraversal.java +++ b/oas-core/src/main/java/com/apigee/security/oas/extendedvalidator/OperationTraversal.java
@@ -34,7 +34,8 @@ TraversalHelper traversalHelper = traversalHelperFactory.create(getUpdatedTraversalPath()); traversalHelper.sendExternalDocsTraversal(openApiSchemaObj.getExternalDocs()); - // TODO(b/162949100): Send Callback Traversals. + traversalHelper.sendCallbackTraversals( + Immutables.toImmutableMap(openApiSchemaObj.getCallbacks())); traversalHelper.sendServerTraversals(Immutables.toImmutableList(openApiSchemaObj.getServers())); traversalHelper.sendParameterTraversals( Immutables.toImmutableList(openApiSchemaObj.getParameters()));
diff --git a/oas-core/src/main/java/com/apigee/security/oas/extendedvalidator/TraversalCommandFactory.java b/oas-core/src/main/java/com/apigee/security/oas/extendedvalidator/TraversalCommandFactory.java index ac98888..5d7f241 100644 --- a/oas-core/src/main/java/com/apigee/security/oas/extendedvalidator/TraversalCommandFactory.java +++ b/oas-core/src/main/java/com/apigee/security/oas/extendedvalidator/TraversalCommandFactory.java
@@ -4,6 +4,7 @@ import java.util.Map; import java.util.Optional; import org.openapi4j.parser.model.OpenApiSchema; +import org.openapi4j.parser.model.v3.Callback; import org.openapi4j.parser.model.v3.Contact; import org.openapi4j.parser.model.v3.ExternalDocs; import org.openapi4j.parser.model.v3.Info; @@ -22,6 +23,11 @@ */ interface TraversalCommandFactory { + CallbackTraversalCommand create( + Callback callback, + ImmutableList<Map.Entry<Class<? extends OpenApiSchema>, Optional<String>>> traversalPath, + String name); + ContactTraversalCommand create( Contact contact, ImmutableList<Map.Entry<Class<? extends OpenApiSchema>, Optional<String>>> traversalPath);
diff --git a/oas-core/src/main/java/com/apigee/security/oas/extendedvalidator/TraversalCommandFactoryModule.java b/oas-core/src/main/java/com/apigee/security/oas/extendedvalidator/TraversalCommandFactoryModule.java index b0e6c56..dfc7cb9 100644 --- a/oas-core/src/main/java/com/apigee/security/oas/extendedvalidator/TraversalCommandFactoryModule.java +++ b/oas-core/src/main/java/com/apigee/security/oas/extendedvalidator/TraversalCommandFactoryModule.java
@@ -9,6 +9,7 @@ protected void configure() { install( new FactoryModuleBuilder() + .implement(CallbackTraversalCommand.class, CallbackTraversal.class) .implement(ContactTraversalCommand.class, ContactTraversal.class) .implement(ExternalDocsTraversalCommand.class, ExternalDocsTraversal.class) .implement(InfoTraversalCommand.class, InfoTraversal.class)
diff --git a/oas-core/src/main/java/com/apigee/security/oas/extendedvalidator/TraversalHelper.java b/oas-core/src/main/java/com/apigee/security/oas/extendedvalidator/TraversalHelper.java index ca55a12..776c07d 100644 --- a/oas-core/src/main/java/com/apigee/security/oas/extendedvalidator/TraversalHelper.java +++ b/oas-core/src/main/java/com/apigee/security/oas/extendedvalidator/TraversalHelper.java
@@ -2,6 +2,7 @@ import com.google.common.collect.ImmutableList; import com.google.common.collect.ImmutableMap; +import org.openapi4j.parser.model.v3.Callback; import org.openapi4j.parser.model.v3.Contact; import org.openapi4j.parser.model.v3.ExternalDocs; import org.openapi4j.parser.model.v3.Info; @@ -17,6 +18,8 @@ /** A set of methods to handle the building and sending of {@linkplain Traversal Traversals}. */ interface TraversalHelper { + void sendCallbackTraversals(ImmutableMap<String, Callback> callbackMap); + void sendContactTraversal(Contact contact); void sendExternalDocsTraversal(ExternalDocs externalDocs);
diff --git a/oas-core/src/test/java/com/apigee/security/oas/extendedvalidator/BaseTraversalHelperTest.java b/oas-core/src/test/java/com/apigee/security/oas/extendedvalidator/BaseTraversalHelperTest.java index f42f992..4a5e6c5 100644 --- a/oas-core/src/test/java/com/apigee/security/oas/extendedvalidator/BaseTraversalHelperTest.java +++ b/oas-core/src/test/java/com/apigee/security/oas/extendedvalidator/BaseTraversalHelperTest.java
@@ -16,6 +16,7 @@ import org.mockito.junit.MockitoJUnit; import org.mockito.junit.MockitoRule; import org.mockito.quality.Strictness; +import org.openapi4j.parser.model.v3.Callback; import org.openapi4j.parser.model.v3.Contact; import org.openapi4j.parser.model.v3.ExternalDocs; import org.openapi4j.parser.model.v3.Info; @@ -43,6 +44,8 @@ private final ImmutableList<Tag> tags = ImmutableList.of(new Tag(), new Tag(), new Tag(), new Tag()); + private final ImmutableMap<String, Callback> callbacks = + ImmutableMap.of("one", new Callback(), "two", new Callback(), "three", new Callback()); private final ImmutableMap<String, ServerVariable> serverVariables = ImmutableMap.of( "one", new ServerVariable(), "two", new ServerVariable(), "three", new ServerVariable()); @@ -66,6 +69,19 @@ } @Test + public void sendCallbackTraversals_sendsCallbackTraversalCommandsToCoordinator() { + traversalHelper.sendCallbackTraversals(callbacks); + + verify(traversalCoordinator, times(callbacks.size())) + .handleTraversalCommand(any(CallbackTraversalCommand.class)); + } + + @Test + public void sendCallbackTraversals_nullParameter_doesNotFail() { + traversalHelper.sendCallbackTraversals(null); + } + + @Test public void sendContactTraversal_sendsContactTraversalCommandToCoordinator() { traversalHelper.sendContactTraversal(contact);
diff --git a/oas-core/src/test/java/com/apigee/security/oas/extendedvalidator/OperationTraversalTest.java b/oas-core/src/test/java/com/apigee/security/oas/extendedvalidator/OperationTraversalTest.java index eca900f..6a5c9af 100644 --- a/oas-core/src/test/java/com/apigee/security/oas/extendedvalidator/OperationTraversalTest.java +++ b/oas-core/src/test/java/com/apigee/security/oas/extendedvalidator/OperationTraversalTest.java
@@ -16,6 +16,7 @@ import org.mockito.junit.MockitoJUnit; import org.mockito.junit.MockitoRule; import org.mockito.quality.Strictness; +import org.openapi4j.parser.model.v3.Callback; import org.openapi4j.parser.model.v3.ExternalDocs; import org.openapi4j.parser.model.v3.Operation; import org.openapi4j.parser.model.v3.Parameter; @@ -33,12 +34,15 @@ @Mock private Operation operation; private final ExternalDocs externalDocs = new ExternalDocs(); + private final ImmutableList servers = ImmutableList.of(new Server(), new Server(), new Server()); private final ImmutableList parameters = ImmutableList.of(new Parameter(), new Parameter(), new Parameter(), new Parameter()); private final ImmutableMap responses = ImmutableMap.of("one", new Response(), "two", new Response()); + private final ImmutableMap callbacks = + ImmutableMap.of("one", new Callback(), "two", new Callback(), "three", new Callback()); private OperationTraversal operationTraversal; @@ -50,6 +54,7 @@ when(operation.getServers()).thenReturn(servers); when(operation.getParameters()).thenReturn(parameters); when(operation.getResponses()).thenReturn(responses); + when(operation.getCallbacks()).thenReturn(callbacks); operationTraversal = new OperationTraversal( @@ -116,4 +121,20 @@ verify(traversalHelper, atLeastOnce()).sendServerTraversals(any()); } + + @Test + public void traverse_sendsCallbacksToTraversalHelper() { + operationTraversal.traverse(); + + verify(traversalHelper).sendCallbackTraversals(callbacks); + } + + @Test + public void traverse_nullCallbacksMember_doesNotFail() { + when(operation.getCallbacks()).thenReturn(null); + + operationTraversal.traverse(); + + verify(traversalHelper, atLeastOnce()).sendCallbackTraversals(any()); + } }
diff --git a/oas-core/src/test/java/com/apigee/security/oas/extendedvalidator/TraversalCommandFactoryTest.java b/oas-core/src/test/java/com/apigee/security/oas/extendedvalidator/TraversalCommandFactoryTest.java index baa2e8b..3a31349 100644 --- a/oas-core/src/test/java/com/apigee/security/oas/extendedvalidator/TraversalCommandFactoryTest.java +++ b/oas-core/src/test/java/com/apigee/security/oas/extendedvalidator/TraversalCommandFactoryTest.java
@@ -11,6 +11,7 @@ import org.junit.runner.RunWith; import org.junit.runners.JUnit4; import org.openapi4j.parser.model.OpenApiSchema; +import org.openapi4j.parser.model.v3.Callback; import org.openapi4j.parser.model.v3.Contact; import org.openapi4j.parser.model.v3.ExternalDocs; import org.openapi4j.parser.model.v3.Info; @@ -33,6 +34,11 @@ traversalPath = ImmutableList.copyOf(new ArrayDeque<>()); @Test + public void create_callbackAndNamePassed_returnsNonNullObject() { + assertThat(traversalCommandFactory.create(new Callback(), traversalPath, "name")).isNotNull(); + } + + @Test public void create_contactPassed_returnsNonNullObject() { assertThat(traversalCommandFactory.create(new Contact(), traversalPath)).isNotNull(); }