This is an automated email from the ASF dual-hosted git repository. tkalkirill pushed a commit to branch main in repository https://gitbox.apache.org/repos/asf/ignite-3.git
The following commit(s) were added to refs/heads/main by this push: new 50a2b1847e IGNITE-19853 Get rid of InjectRevisionListenerHolder (#2600) 50a2b1847e is described below commit 50a2b1847e584b37aa2494abfaac0cf04d95b8e8 Author: Kirill Tkalenko <tkalkir...@yandex.ru> AuthorDate: Tue Sep 19 10:32:54 2023 +0300 IGNITE-19853 Get rid of InjectRevisionListenerHolder (#2600) --- .../ConfigurationListenerTestUtils.java | 20 --- .../testframework/ConfigurationExtensionTest.java | 54 -------- .../ConfigurationStorageRevisionListener.java | 36 ------ ...ConfigurationStorageRevisionListenerHolder.java | 42 ------- .../testframework/ConfigurationExtension.java | 140 +++------------------ .../InjectRevisionListenerHolder.java | 35 ------ 6 files changed, 14 insertions(+), 313 deletions(-) diff --git a/modules/configuration/src/test/java/org/apache/ignite/internal/configuration/notifications/ConfigurationListenerTestUtils.java b/modules/configuration/src/test/java/org/apache/ignite/internal/configuration/notifications/ConfigurationListenerTestUtils.java index cbeca66d81..210b1c88b1 100644 --- a/modules/configuration/src/test/java/org/apache/ignite/internal/configuration/notifications/ConfigurationListenerTestUtils.java +++ b/modules/configuration/src/test/java/org/apache/ignite/internal/configuration/notifications/ConfigurationListenerTestUtils.java @@ -28,7 +28,6 @@ import java.util.List; import java.util.UUID; import java.util.concurrent.CompletableFuture; import java.util.function.Consumer; -import java.util.function.LongConsumer; import java.util.function.Supplier; import org.apache.ignite.configuration.notifications.ConfigurationListener; import org.apache.ignite.configuration.notifications.ConfigurationNamedListListener; @@ -38,12 +37,6 @@ import org.apache.ignite.configuration.notifications.ConfigurationNotificationEv * Utility class for testing configuration listeners. */ class ConfigurationListenerTestUtils { - /** - * Private constructor. - */ - private ConfigurationListenerTestUtils() { - } - /** * Returns consumer who does nothing. */ @@ -209,19 +202,6 @@ class ConfigurationListenerTestUtils { }; } - /** - * Returns configuration storage revision change listener. - * - * @param consumer Consumer of storage revision change. - */ - static ConfigurationStorageRevisionListener configStorageRevisionListener(LongConsumer consumer) { - return (newStorageRevision) -> { - consumer.accept(newStorageRevision); - - return completedFuture(null); - }; - } - /** * Returns a string representation of a random {@link UUID}. */ diff --git a/modules/configuration/src/test/java/org/apache/ignite/internal/configuration/testframework/ConfigurationExtensionTest.java b/modules/configuration/src/test/java/org/apache/ignite/internal/configuration/testframework/ConfigurationExtensionTest.java index 37c96940ce..71ff1c1ec2 100644 --- a/modules/configuration/src/test/java/org/apache/ignite/internal/configuration/testframework/ConfigurationExtensionTest.java +++ b/modules/configuration/src/test/java/org/apache/ignite/internal/configuration/testframework/ConfigurationExtensionTest.java @@ -25,13 +25,9 @@ import static org.hamcrest.CoreMatchers.is; import static org.hamcrest.MatcherAssert.assertThat; import static org.junit.jupiter.api.Assertions.assertEquals; import static org.junit.jupiter.api.Assertions.assertNotNull; -import static org.junit.jupiter.api.Assertions.assertSame; -import static org.junit.jupiter.api.Assertions.assertTrue; import java.util.ArrayList; import java.util.List; -import java.util.concurrent.CopyOnWriteArrayList; -import org.apache.ignite.internal.configuration.notifications.ConfigurationStorageRevisionListenerHolder; import org.apache.ignite.internal.configuration.sample.DiscoveryConfiguration; import org.apache.ignite.internal.configuration.sample.ExtendedDiscoveryConfiguration; import org.apache.ignite.internal.configuration.sample.ExtendedDiscoveryConfigurationSchema; @@ -49,9 +45,6 @@ class ConfigurationExtensionTest extends BaseIgniteAbstractTest { @InjectConfiguration(extensions = ExtendedDiscoveryConfigurationSchema.class) private DiscoveryConfiguration fieldCfg; - @InjectRevisionListenerHolder - private ConfigurationStorageRevisionListenerHolder fieldRevisionListenerHolder; - @BeforeAll static void staticParameterInjection( @InjectConfiguration(extensions = ExtendedDiscoveryConfigurationSchema.class) DiscoveryConfiguration paramCfg @@ -137,53 +130,6 @@ class ConfigurationExtensionTest extends BaseIgniteAbstractTest { assertEquals(4, ((ExtendedConfiguration) cfg).invisible().value()); } - @Test - void testFieldConfigurationStorageRevisionListenerHolder() throws Exception { - assertNotNull(fieldRevisionListenerHolder); - - List<Long> revisions = new CopyOnWriteArrayList<>(); - - fieldRevisionListenerHolder.listenUpdateStorageRevision(revision -> { - revisions.add(revision); - - return completedFuture(null); - }); - - fieldCfg.joinTimeout().update(1_000_000).get(1, SECONDS); - - fieldCfg.joinTimeout().update(2_000_000).get(1, SECONDS); - - assertEquals(2, revisions.size(), revisions::toString); - - assertTrue(revisions.get(0) < revisions.get(1), revisions::toString); - } - - @Test - void testParamConfigurationStorageRevisionListenerHolder( - @InjectConfiguration("mock.joinTimeout=100") DiscoveryConfiguration paramCfg, - @InjectRevisionListenerHolder ConfigurationStorageRevisionListenerHolder paramRevisionListenerHolder - ) throws Exception { - assertNotNull(paramRevisionListenerHolder); - - assertSame(fieldRevisionListenerHolder, paramRevisionListenerHolder); - - List<Long> revisions = new CopyOnWriteArrayList<>(); - - paramRevisionListenerHolder.listenUpdateStorageRevision(revision -> { - revisions.add(revision); - - return completedFuture(null); - }); - - paramCfg.joinTimeout().update(1_000_000).get(1, SECONDS); - - paramCfg.joinTimeout().update(2_000_000).get(1, SECONDS); - - assertEquals(2, revisions.size(), revisions::toString); - - assertTrue(revisions.get(0) < revisions.get(1), revisions::toString); - } - /** Test UUID generation in mocks. */ @Test public void testInjectInternalId( diff --git a/modules/configuration/src/testFixtures/java/org/apache/ignite/internal/configuration/notifications/ConfigurationStorageRevisionListener.java b/modules/configuration/src/testFixtures/java/org/apache/ignite/internal/configuration/notifications/ConfigurationStorageRevisionListener.java deleted file mode 100644 index b892b4a0aa..0000000000 --- a/modules/configuration/src/testFixtures/java/org/apache/ignite/internal/configuration/notifications/ConfigurationStorageRevisionListener.java +++ /dev/null @@ -1,36 +0,0 @@ -/* - * Licensed to the Apache Software Foundation (ASF) under one or more - * contributor license agreements. See the NOTICE file distributed with - * this work for additional information regarding copyright ownership. - * The ASF licenses this file to You under the Apache License, Version 2.0 - * (the "License"); you may not use this file except in compliance with - * the License. You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -package org.apache.ignite.internal.configuration.notifications; - -import java.util.concurrent.CompletableFuture; - -/** - * Configuration storage revision change listener. - * - * <p>Storage revision - monotonously increasing counter, linked to the specific storage for current configuration values. - */ -@FunctionalInterface -public interface ConfigurationStorageRevisionListener { - /** - * Called on update the storage version. - * - * @param newStorageRevision Updated configuration storage revision. - * @return Future that signifies the end of the listener execution. - */ - CompletableFuture<?> onUpdate(long newStorageRevision); -} diff --git a/modules/configuration/src/testFixtures/java/org/apache/ignite/internal/configuration/notifications/ConfigurationStorageRevisionListenerHolder.java b/modules/configuration/src/testFixtures/java/org/apache/ignite/internal/configuration/notifications/ConfigurationStorageRevisionListenerHolder.java deleted file mode 100644 index 1d2dab6436..0000000000 --- a/modules/configuration/src/testFixtures/java/org/apache/ignite/internal/configuration/notifications/ConfigurationStorageRevisionListenerHolder.java +++ /dev/null @@ -1,42 +0,0 @@ -/* - * Licensed to the Apache Software Foundation (ASF) under one or more - * contributor license agreements. See the NOTICE file distributed with - * this work for additional information regarding copyright ownership. - * The ASF licenses this file to You under the Apache License, Version 2.0 - * (the "License"); you may not use this file except in compliance with - * the License. You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -package org.apache.ignite.internal.configuration.notifications; - -/** - * Configuration storage revision change listener holder. - */ -public interface ConfigurationStorageRevisionListenerHolder { - /** - * Adds configuration storage revision change listener. - * - * <p>NOTE: If this method is called from another listener, then it is guaranteed to be called starting from the next configuration - * update only. - * - * @param listener Listener. - */ - void listenUpdateStorageRevision(ConfigurationStorageRevisionListener listener); - - /** - * Removes configuration storage revision change listener. - * - * <p>NOTE: Unpredictable behavior if the method is called inside other listeners. - * - * @param listener Listener. - */ - void stopListenUpdateStorageRevision(ConfigurationStorageRevisionListener listener); -} diff --git a/modules/configuration/src/testFixtures/java/org/apache/ignite/internal/configuration/testframework/ConfigurationExtension.java b/modules/configuration/src/testFixtures/java/org/apache/ignite/internal/configuration/testframework/ConfigurationExtension.java index 963d8458c6..ef0be1ebad 100644 --- a/modules/configuration/src/testFixtures/java/org/apache/ignite/internal/configuration/testframework/ConfigurationExtension.java +++ b/modules/configuration/src/testFixtures/java/org/apache/ignite/internal/configuration/testframework/ConfigurationExtension.java @@ -18,6 +18,7 @@ package org.apache.ignite.internal.configuration.testframework; import static java.lang.reflect.Modifier.isStatic; +import static java.util.concurrent.CompletableFuture.allOf; import static java.util.concurrent.Executors.newSingleThreadExecutor; import static org.apache.ignite.configuration.annotation.ConfigurationType.LOCAL; import static org.apache.ignite.internal.configuration.notifications.ConfigurationNotifier.notifyListeners; @@ -31,12 +32,9 @@ import static org.mockito.Mockito.withSettings; import com.typesafe.config.ConfigFactory; import com.typesafe.config.ConfigObject; -import java.lang.reflect.Executable; import java.lang.reflect.Field; import java.lang.reflect.Parameter; import java.util.ArrayList; -import java.util.Collection; -import java.util.Iterator; import java.util.List; import java.util.ServiceLoader; import java.util.UUID; @@ -48,7 +46,6 @@ import java.util.function.Function; import org.apache.ignite.configuration.ConfigurationModule; import org.apache.ignite.configuration.RootKey; import org.apache.ignite.configuration.annotation.PolymorphicConfigInstance; -import org.apache.ignite.internal.configuration.ConfigurationListenerHolder; import org.apache.ignite.internal.configuration.DynamicConfiguration; import org.apache.ignite.internal.configuration.DynamicConfigurationChanger; import org.apache.ignite.internal.configuration.RootInnerNode; @@ -56,8 +53,6 @@ import org.apache.ignite.internal.configuration.SuperRoot; import org.apache.ignite.internal.configuration.asm.ConfigurationAsmGenerator; import org.apache.ignite.internal.configuration.direct.KeyPathNode; import org.apache.ignite.internal.configuration.hocon.HoconConverter; -import org.apache.ignite.internal.configuration.notifications.ConfigurationStorageRevisionListener; -import org.apache.ignite.internal.configuration.notifications.ConfigurationStorageRevisionListenerHolder; import org.apache.ignite.internal.configuration.tree.ConfigurationSource; import org.apache.ignite.internal.configuration.tree.InnerNode; import org.apache.ignite.internal.configuration.util.ConfigurationUtil; @@ -91,12 +86,6 @@ public class ConfigurationExtension implements BeforeEachCallback, AfterEachCall /** Key to store {@link ExecutorService} in {@link ExtensionContext.Store}. */ private static final Object POOL_KEY = new Object(); - /** Key to store {@link StorageRevisionListenerHolderImpl} in {@link ExtensionContext.Store} for all tests. */ - private static final Object REVISION_LISTENER_ALL_TEST_HOLDER_KEY = new Object(); - - /** Key to store {@link StorageRevisionListenerHolderImpl} in {@link ExtensionContext.Store} for each test. */ - private static final Object REVISION_LISTENER_PER_TEST_HOLDER_KEY = new Object(); - /** All {@link ConfigurationExtension} classes in classpath. */ private static final List<Class<?>> EXTENSIONS; @@ -120,7 +109,6 @@ public class ConfigurationExtension implements BeforeEachCallback, AfterEachCall POLYMORPHIC_EXTENSIONS = List.copyOf(polymorphicExtensions); } - /** {@inheritDoc} */ @Override public void beforeAll(ExtensionContext context) throws Exception { context.getStore(NAMESPACE).put(CGEN_KEY, new ConfigurationAsmGenerator()); @@ -129,23 +117,19 @@ public class ConfigurationExtension implements BeforeEachCallback, AfterEachCall injectFields(context, true); } - /** {@inheritDoc} */ @Override public void afterAll(ExtensionContext context) throws Exception { context.getStore(NAMESPACE).remove(CGEN_KEY); context.getStore(NAMESPACE).remove(POOL_KEY, ExecutorService.class).shutdownNow(); - - context.getStore(NAMESPACE).remove(REVISION_LISTENER_ALL_TEST_HOLDER_KEY); } - /** {@inheritDoc} */ @Override public void beforeEach(ExtensionContext context) throws Exception { injectFields(context, false); } - private void injectFields(ExtensionContext context, boolean forStatic) throws Exception { + private static void injectFields(ExtensionContext context, boolean forStatic) throws Exception { Class<?> testClass = context.getRequiredTestClass(); Object testInstance = context.getTestInstance().orElse(null); @@ -156,38 +140,21 @@ public class ConfigurationExtension implements BeforeEachCallback, AfterEachCall ConfigurationAsmGenerator cgen = store.get(CGEN_KEY, ConfigurationAsmGenerator.class); ExecutorService pool = store.get(POOL_KEY, ExecutorService.class); - StorageRevisionListenerHolderImpl revisionListenerHolder = new StorageRevisionListenerHolderImpl(); - - if (forStatic) { - store.put(REVISION_LISTENER_ALL_TEST_HOLDER_KEY, revisionListenerHolder); - } else { - store.put(REVISION_LISTENER_PER_TEST_HOLDER_KEY, revisionListenerHolder); - } - for (Field field : getInjectConfigurationFields(testClass, forStatic)) { field.setAccessible(true); InjectConfiguration annotation = field.getAnnotation(InjectConfiguration.class); - Object cfgValue = cfgValue(field.getType(), annotation, cgen, pool, revisionListenerHolder); + Object cfgValue = cfgValue(field.getType(), annotation, cgen, pool); field.set(forStatic ? null : testInstance, cfgValue); } - - for (Field field : getInjectRevisionListenerHolderFields(testClass, forStatic)) { - field.setAccessible(true); - - field.set(forStatic ? null : testInstance, revisionListenerHolder); - } } - /** {@inheritDoc} */ @Override public void afterEach(ExtensionContext context) throws Exception { - context.getStore(NAMESPACE).remove(REVISION_LISTENER_PER_TEST_HOLDER_KEY); } - /** {@inheritDoc} */ @Override public boolean supportsParameter( ParameterContext parameterContext, @@ -195,11 +162,9 @@ public class ConfigurationExtension implements BeforeEachCallback, AfterEachCall ) throws ParameterResolutionException { Class<?> parameterType = parameterContext.getParameter().getType(); - return (parameterContext.isAnnotated(InjectConfiguration.class) && supportsAsConfigurationType(parameterType)) - || (parameterContext.isAnnotated(InjectRevisionListenerHolder.class) && isRevisionListenerHolder(parameterType)); + return parameterContext.isAnnotated(InjectConfiguration.class) && supportsAsConfigurationType(parameterType); } - /** {@inheritDoc} */ @Override public Object resolveParameter( ParameterContext parameterContext, @@ -207,14 +172,6 @@ public class ConfigurationExtension implements BeforeEachCallback, AfterEachCall ) throws ParameterResolutionException { Store store = extensionContext.getStore(NAMESPACE); - StorageRevisionListenerHolderImpl revisionListenerHolder; - - if (isStaticExecutable(parameterContext.getDeclaringExecutable())) { - revisionListenerHolder = store.get(REVISION_LISTENER_ALL_TEST_HOLDER_KEY, StorageRevisionListenerHolderImpl.class); - } else { - revisionListenerHolder = store.get(REVISION_LISTENER_PER_TEST_HOLDER_KEY, StorageRevisionListenerHolderImpl.class); - } - if (parameterContext.isAnnotated(InjectConfiguration.class)) { Parameter parameter = parameterContext.getParameter(); @@ -223,25 +180,18 @@ public class ConfigurationExtension implements BeforeEachCallback, AfterEachCall try { ExecutorService pool = store.get(POOL_KEY, ExecutorService.class); - return cfgValue(parameter.getType(), parameter.getAnnotation(InjectConfiguration.class), cgen, pool, - revisionListenerHolder); + return cfgValue(parameter.getType(), parameter.getAnnotation(InjectConfiguration.class), cgen, pool); } catch (ClassNotFoundException classNotFoundException) { throw new ParameterResolutionException( "Cannot find a configuration schema class that matches " + parameter.getType().getCanonicalName(), classNotFoundException ); } - } else if (parameterContext.isAnnotated(InjectRevisionListenerHolder.class)) { - return revisionListenerHolder; } else { throw new ParameterResolutionException("Unknown parameter:" + parameterContext.getParameter()); } } - private static boolean isStaticExecutable(Executable executable) { - return isStatic(executable.getModifiers()); - } - /** * Instantiates a configuration instance for injection. * @@ -249,7 +199,6 @@ public class ConfigurationExtension implements BeforeEachCallback, AfterEachCall * @param annotation Annotation present on the field or parameter. * @param cgen Runtime code generator associated with the extension instance. * @param pool Single-threaded executor service to perform configuration changes. - * @param revisionListenerHolder Configuration storage revision change listener holder. * @return Mock configuration instance. * @throws ClassNotFoundException If corresponding configuration schema class is not found. */ @@ -257,8 +206,7 @@ public class ConfigurationExtension implements BeforeEachCallback, AfterEachCall Class<?> type, InjectConfiguration annotation, ConfigurationAsmGenerator cgen, - ExecutorService pool, - StorageRevisionListenerHolderImpl revisionListenerHolder + ExecutorService pool ) throws ClassNotFoundException { // Trying to find a schema class using configuration naming convention. This code won't work for inner Java // classes, extension is designed to mock actual configurations from public API to configure Ignite components. @@ -314,8 +262,11 @@ public class ConfigurationExtension implements BeforeEachCallback, AfterEachCall // Reference that's required for notificator. var cfgRef = new AtomicReference<DynamicConfiguration<?, ?>>(); + AtomicLong storageRevisionCounter = new AtomicLong(); + + AtomicLong notificationListenerCounter = new AtomicLong(); + cfgRef.set(cgen.instantiateCfg(rootKey, new DynamicConfigurationChanger() { - /** {@inheritDoc} */ @Override public CompletableFuture<Void> change(ConfigurationSource change) { return CompletableFuture.supplyAsync(() -> { @@ -328,8 +279,8 @@ public class ConfigurationExtension implements BeforeEachCallback, AfterEachCall ConfigurationUtil.dropNulls(copy); if (superRootRef.compareAndSet(sr, copy)) { - long storageRevision = revisionListenerHolder.storageRev.incrementAndGet(); - long notificationNumber = revisionListenerHolder.notificationListenerCnt.incrementAndGet(); + long storageRevision = storageRevisionCounter.incrementAndGet(); + long notificationNumber = notificationListenerCounter.incrementAndGet(); List<CompletableFuture<?>> futures = new ArrayList<>(); @@ -341,31 +292,26 @@ public class ConfigurationExtension implements BeforeEachCallback, AfterEachCall notificationNumber )); - futures.addAll(revisionListenerHolder.notifyStorageRevisionListeners(storageRevision, notificationNumber)); - - return CompletableFuture.allOf(futures.toArray(CompletableFuture[]::new)); + return allOf(futures.toArray(CompletableFuture[]::new)); } return change(change); }, pool).thenCompose(Function.identity()); } - /** {@inheritDoc} */ @Override public InnerNode getRootNode(RootKey<?, ?> rk) { return superRootRef.get().getRoot(rk); } - /** {@inheritDoc} */ @Override public <T> T getLatest(List<KeyPathNode> path) { return findEx(path, superRootRef.get()); } - /** {@inheritDoc} */ @Override public long notificationCount() { - return revisionListenerHolder.notificationListenerCnt.get(); + return notificationListenerCounter.get(); } })); @@ -383,65 +329,7 @@ public class ConfigurationExtension implements BeforeEachCallback, AfterEachCall ); } - private static List<Field> getInjectRevisionListenerHolderFields(Class<?> testClass, boolean forStatic) { - return AnnotationSupport.findAnnotatedFields( - testClass, - InjectRevisionListenerHolder.class, - field -> isRevisionListenerHolder(field.getType()) && (isStatic(field.getModifiers()) == forStatic), - HierarchyTraversalMode.TOP_DOWN - ); - } - private static boolean supportsAsConfigurationType(Class<?> type) { return type.getCanonicalName().endsWith("Configuration"); } - - private static boolean isRevisionListenerHolder(Class<?> type) { - return ConfigurationStorageRevisionListenerHolder.class.isAssignableFrom(type); - } - - /** - * Implementation for {@link ConfigurationExtension}. - */ - private static class StorageRevisionListenerHolderImpl implements ConfigurationStorageRevisionListenerHolder { - final AtomicLong storageRev = new AtomicLong(); - - final AtomicLong notificationListenerCnt = new AtomicLong(); - - final ConfigurationListenerHolder<ConfigurationStorageRevisionListener> listeners = new ConfigurationListenerHolder<>(); - - /** {@inheritDoc} */ - @Override - public void listenUpdateStorageRevision(ConfigurationStorageRevisionListener listener) { - listeners.addListener(listener, notificationListenerCnt.get()); - } - - /** {@inheritDoc} */ - @Override - public void stopListenUpdateStorageRevision(ConfigurationStorageRevisionListener listener) { - listeners.removeListener(listener); - } - - private Collection<CompletableFuture<?>> notifyStorageRevisionListeners(long storageRevision, long notificationNumber) { - List<CompletableFuture<?>> futures = new ArrayList<>(); - - for (Iterator<ConfigurationStorageRevisionListener> it = listeners.listeners(notificationNumber); it.hasNext(); ) { - ConfigurationStorageRevisionListener listener = it.next(); - - try { - CompletableFuture<?> future = listener.onUpdate(storageRevision); - - assert future != null; - - if (future.isCompletedExceptionally() || future.isCancelled() || !future.isDone()) { - futures.add(future); - } - } catch (Throwable t) { - futures.add(CompletableFuture.failedFuture(t)); - } - } - - return futures; - } - } } diff --git a/modules/configuration/src/testFixtures/java/org/apache/ignite/internal/configuration/testframework/InjectRevisionListenerHolder.java b/modules/configuration/src/testFixtures/java/org/apache/ignite/internal/configuration/testframework/InjectRevisionListenerHolder.java deleted file mode 100644 index 12c04e9a60..0000000000 --- a/modules/configuration/src/testFixtures/java/org/apache/ignite/internal/configuration/testframework/InjectRevisionListenerHolder.java +++ /dev/null @@ -1,35 +0,0 @@ -/* - * Licensed to the Apache Software Foundation (ASF) under one or more - * contributor license agreements. See the NOTICE file distributed with - * this work for additional information regarding copyright ownership. - * The ASF licenses this file to You under the Apache License, Version 2.0 - * (the "License"); you may not use this file except in compliance with - * the License. You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -package org.apache.ignite.internal.configuration.testframework; - -import java.lang.annotation.ElementType; -import java.lang.annotation.Retention; -import java.lang.annotation.RetentionPolicy; -import java.lang.annotation.Target; -import org.apache.ignite.internal.configuration.notifications.ConfigurationStorageRevisionListenerHolder; - -/** - * Annotation for injecting {@link ConfigurationStorageRevisionListenerHolder} into tests. - * - * <p>This annotation should be used on either fields or method parameters, one instance per test. - */ -@Retention(RetentionPolicy.RUNTIME) -@Target({ElementType.FIELD, ElementType.PARAMETER}) -// TODO: IGNITE-19853 Get rid of this annotation. -public @interface InjectRevisionListenerHolder { -}