Browse Source

Make MappedActionFilter its own interface (#108187) (#108210)

This commit reapplies the change from #107960
Ryan Ernst 1 year ago
parent
commit
3578dca668

+ 1 - 7
server/src/main/java/org/elasticsearch/action/ActionModule.java

@@ -800,13 +800,7 @@ public class ActionModule extends AbstractModule {
         List<ActionFilter> finalFilters = new ArrayList<>();
         List<ActionFilter> finalFilters = new ArrayList<>();
         List<MappedActionFilter> mappedFilters = new ArrayList<>();
         List<MappedActionFilter> mappedFilters = new ArrayList<>();
         for (var plugin : actionPlugins) {
         for (var plugin : actionPlugins) {
-            for (var filter : plugin.getActionFilters()) {
-                if (filter instanceof MappedActionFilter mappedFilter) {
-                    mappedFilters.add(mappedFilter);
-                } else {
-                    finalFilters.add(filter);
-                }
-            }
+            finalFilters.addAll(plugin.getActionFilters());
             mappedFilters.addAll(plugin.getMappedActionFilters());
             mappedFilters.addAll(plugin.getMappedActionFilters());
         }
         }
         if (mappedFilters.isEmpty() == false) {
         if (mappedFilters.isEmpty() == false) {

+ 26 - 1
server/src/main/java/org/elasticsearch/action/support/MappedActionFilter.java

@@ -8,6 +8,31 @@
 
 
 package org.elasticsearch.action.support;
 package org.elasticsearch.action.support;
 
 
-public interface MappedActionFilter extends ActionFilter {
+import org.elasticsearch.action.ActionListener;
+import org.elasticsearch.action.ActionRequest;
+import org.elasticsearch.action.ActionResponse;
+import org.elasticsearch.tasks.Task;
+
+/**
+ * An action filter that is run only for a single action.
+ *
+ * Note: This is an independent interface from {@link ActionFilter} so that it does not
+ * have an order. The relative order of executed MappedActionFilter with the same action name
+ * is undefined.
+ */
+public interface MappedActionFilter {
+    /** Return the name of the action for which this filter should be run */
     String actionName();
     String actionName();
+
+    /**
+     * Enables filtering the execution of an action on the request side, either by sending a response through the
+     * {@link ActionListener} or by continuing the execution through the given {@link ActionFilterChain chain}
+     */
+    <Request extends ActionRequest, Response extends ActionResponse> void apply(
+        Task task,
+        String action,
+        Request request,
+        ActionListener<Response> listener,
+        ActionFilterChain<Request, Response> chain
+    );
 }
 }

+ 0 - 20
server/src/test/java/org/elasticsearch/action/support/MappedActionFiltersTests.java

@@ -59,11 +59,6 @@ public class MappedActionFiltersTests extends ESTestCase {
                 return "dummyAction";
                 return "dummyAction";
             }
             }
 
 
-            @Override
-            public int order() {
-                return 0;
-            }
-
             @Override
             @Override
             public <Request extends ActionRequest, Response extends ActionResponse> void apply(
             public <Request extends ActionRequest, Response extends ActionResponse> void apply(
                 Task task,
                 Task task,
@@ -100,11 +95,6 @@ public class MappedActionFiltersTests extends ESTestCase {
                 return "dummyAction";
                 return "dummyAction";
             }
             }
 
 
-            @Override
-            public int order() {
-                return 0;
-            }
-
             @Override
             @Override
             public <Request extends ActionRequest, Response extends ActionResponse> void apply(
             public <Request extends ActionRequest, Response extends ActionResponse> void apply(
                 Task task,
                 Task task,
@@ -123,11 +113,6 @@ public class MappedActionFiltersTests extends ESTestCase {
                 return "dummyAction";
                 return "dummyAction";
             }
             }
 
 
-            @Override
-            public int order() {
-                return 0;
-            }
-
             @Override
             @Override
             public <Request extends ActionRequest, Response extends ActionResponse> void apply(
             public <Request extends ActionRequest, Response extends ActionResponse> void apply(
                 Task task,
                 Task task,
@@ -164,11 +149,6 @@ public class MappedActionFiltersTests extends ESTestCase {
                 return "dummyAction";
                 return "dummyAction";
             }
             }
 
 
-            @Override
-            public int order() {
-                return 0;
-            }
-
             @Override
             @Override
             public <Request extends ActionRequest, Response extends ActionResponse> void apply(
             public <Request extends ActionRequest, Response extends ActionResponse> void apply(
                 Task task,
                 Task task,

+ 0 - 5
x-pack/plugin/core/src/main/java/org/elasticsearch/xpack/core/api/filtering/ApiFilteringActionFilter.java

@@ -31,11 +31,6 @@ public abstract class ApiFilteringActionFilter<Res extends ActionResponse> imple
         this.responseClass = responseClass;
         this.responseClass = responseClass;
     }
     }
 
 
-    @Override
-    public int order() {
-        return 0;
-    }
-
     @Override
     @Override
     public final String actionName() {
     public final String actionName() {
         return actionName;
         return actionName;

+ 2 - 2
x-pack/plugin/inference/src/main/java/org/elasticsearch/xpack/inference/InferencePlugin.java

@@ -10,7 +10,7 @@ package org.elasticsearch.xpack.inference;
 import org.apache.lucene.util.SetOnce;
 import org.apache.lucene.util.SetOnce;
 import org.elasticsearch.action.ActionRequest;
 import org.elasticsearch.action.ActionRequest;
 import org.elasticsearch.action.ActionResponse;
 import org.elasticsearch.action.ActionResponse;
-import org.elasticsearch.action.support.ActionFilter;
+import org.elasticsearch.action.support.MappedActionFilter;
 import org.elasticsearch.cluster.metadata.IndexNameExpressionResolver;
 import org.elasticsearch.cluster.metadata.IndexNameExpressionResolver;
 import org.elasticsearch.cluster.node.DiscoveryNodes;
 import org.elasticsearch.cluster.node.DiscoveryNodes;
 import org.elasticsearch.common.io.stream.NamedWriteableRegistry;
 import org.elasticsearch.common.io.stream.NamedWriteableRegistry;
@@ -286,7 +286,7 @@ public class InferencePlugin extends Plugin implements ActionPlugin, ExtensibleP
     }
     }
 
 
     @Override
     @Override
-    public Collection<ActionFilter> getActionFilters() {
+    public Collection<MappedActionFilter> getMappedActionFilters() {
         if (SemanticTextFeature.isEnabled()) {
         if (SemanticTextFeature.isEnabled()) {
             return singletonList(shardBulkInferenceActionFilter.get());
             return singletonList(shardBulkInferenceActionFilter.get());
         }
         }

+ 0 - 6
x-pack/plugin/inference/src/main/java/org/elasticsearch/xpack/inference/action/filter/ShardBulkInferenceActionFilter.java

@@ -81,12 +81,6 @@ public class ShardBulkInferenceActionFilter implements MappedActionFilter {
         this.batchSize = batchSize;
         this.batchSize = batchSize;
     }
     }
 
 
-    @Override
-    public int order() {
-        // must execute last (after the security action filter)
-        return Integer.MAX_VALUE;
-    }
-
     @Override
     @Override
     public String actionName() {
     public String actionName() {
         return TransportShardBulkAction.ACTION_NAME;
         return TransportShardBulkAction.ACTION_NAME;