diff --git a/clustered/ehcache-client/src/main/java/org/ehcache/clustered/client/internal/loaderwriter/ClusteredLoaderWriterStore.java b/clustered/ehcache-client/src/main/java/org/ehcache/clustered/client/internal/loaderwriter/ClusteredLoaderWriterStore.java index 998e481e0c..ae8e3646a0 100644 --- a/clustered/ehcache-client/src/main/java/org/ehcache/clustered/client/internal/loaderwriter/ClusteredLoaderWriterStore.java +++ b/clustered/ehcache-client/src/main/java/org/ehcache/clustered/client/internal/loaderwriter/ClusteredLoaderWriterStore.java @@ -343,15 +343,6 @@ public int rank(Set> resourceTypes, Collection authorityResource, Collection> serviceConfigs) { - int parentRank = super.rankAuthority(authorityResource, serviceConfigs); - if (parentRank == 0 || serviceConfigs.stream().noneMatch(CacheLoaderWriterConfiguration.class::isInstance)) { - return 0; - } - return parentRank + 1; - } } } diff --git a/clustered/ehcache-client/src/main/java/org/ehcache/clustered/client/internal/loaderwriter/DelegatingLoaderWriterStoreProvider.java b/clustered/ehcache-client/src/main/java/org/ehcache/clustered/client/internal/loaderwriter/DelegatingLoaderWriterStoreProvider.java index 7a5bb4846d..df95350121 100644 --- a/clustered/ehcache-client/src/main/java/org/ehcache/clustered/client/internal/loaderwriter/DelegatingLoaderWriterStoreProvider.java +++ b/clustered/ehcache-client/src/main/java/org/ehcache/clustered/client/internal/loaderwriter/DelegatingLoaderWriterStoreProvider.java @@ -17,7 +17,6 @@ import org.ehcache.clustered.client.service.ClusteringService; import org.ehcache.clustered.client.service.ClusteringService.ClusteredCacheIdentifier; -import org.ehcache.config.ResourceType; import org.ehcache.core.spi.store.AbstractWrapperStoreProvider; import org.ehcache.core.spi.store.Store; import org.ehcache.spi.loaderwriter.CacheLoaderWriterConfiguration; @@ -25,7 +24,6 @@ import org.ehcache.spi.service.ServiceConfiguration; import org.ehcache.spi.service.ServiceDependencies; import java.util.Collection; -import java.util.Set; import static org.ehcache.core.spi.service.ServiceUtils.findSingletonAmongst; @@ -38,11 +36,6 @@ protected Store wrap(Store store, Store.Configuration s return loaderWriterStore; } - @Override - public int rank(Set> resourceTypes, Collection> serviceConfigs) { - throw new UnsupportedOperationException("Its a Wrapper store provider, does not support regular ranking"); - } - @Override public int wrapperStoreRank(Collection> serviceConfigs) { CacheLoaderWriterConfiguration loaderWriterConfiguration = findSingletonAmongst(CacheLoaderWriterConfiguration.class, serviceConfigs); diff --git a/clustered/ehcache-client/src/main/java/org/ehcache/clustered/client/internal/loaderwriter/writebehind/ClusteredWriteBehindStore.java b/clustered/ehcache-client/src/main/java/org/ehcache/clustered/client/internal/loaderwriter/writebehind/ClusteredWriteBehindStore.java index 76e8e62f3a..db7db899ed 100644 --- a/clustered/ehcache-client/src/main/java/org/ehcache/clustered/client/internal/loaderwriter/writebehind/ClusteredWriteBehindStore.java +++ b/clustered/ehcache-client/src/main/java/org/ehcache/clustered/client/internal/loaderwriter/writebehind/ClusteredWriteBehindStore.java @@ -318,14 +318,5 @@ public int rank(Set> resourceTypes, Collection authorityResource, Collection> serviceConfigs) { - int parentRank = super.rankAuthority(authorityResource, serviceConfigs); - if (parentRank == 0 || serviceConfigs.stream().noneMatch(WriteBehindConfiguration.class::isInstance)) { - return 0; - } - return parentRank + 1; - } } } diff --git a/clustered/ehcache-client/src/main/java/org/ehcache/clustered/client/internal/store/ClusteredStore.java b/clustered/ehcache-client/src/main/java/org/ehcache/clustered/client/internal/store/ClusteredStore.java index eda5ad8972..2a393ff77c 100644 --- a/clustered/ehcache-client/src/main/java/org/ehcache/clustered/client/internal/store/ClusteredStore.java +++ b/clustered/ehcache-client/src/main/java/org/ehcache/clustered/client/internal/store/ClusteredStore.java @@ -882,15 +882,6 @@ public int rank(final Set> resourceTypes, final Collection authorityResource, Collection> serviceConfigs) { - if (clusteringService == null) { - return 0; - } else { - return CLUSTER_RESOURCES.contains(authorityResource) ? 1 : 0; - } - } - @Override public void start(final ServiceProvider serviceProvider) { connectLock.lock(); @@ -915,7 +906,7 @@ public void stop() { } @Override - public AuthoritativeTier createAuthoritativeTier(Configuration storeConfig, ServiceConfiguration... serviceConfigs) { + public AuthoritativeTier createAuthoritativeTier(Set> resourceTypes, Configuration storeConfig, ServiceConfiguration... serviceConfigs) { ClusteredStore authoritativeTier = createStoreInternal(storeConfig, serviceConfigs); tierOperationStatistics.put(authoritativeTier, new OperationStatistic[] { diff --git a/clustered/ehcache-client/src/test/java/org/ehcache/clustered/client/internal/loaderwriter/ClusteredLoaderWriterStoreProviderTest.java b/clustered/ehcache-client/src/test/java/org/ehcache/clustered/client/internal/loaderwriter/ClusteredLoaderWriterStoreProviderTest.java index 163cbfd8fd..d361366c35 100644 --- a/clustered/ehcache-client/src/test/java/org/ehcache/clustered/client/internal/loaderwriter/ClusteredLoaderWriterStoreProviderTest.java +++ b/clustered/ehcache-client/src/test/java/org/ehcache/clustered/client/internal/loaderwriter/ClusteredLoaderWriterStoreProviderTest.java @@ -30,6 +30,7 @@ import java.util.Collections; import java.util.HashSet; +import static java.util.Collections.singleton; import static org.ehcache.core.spi.ServiceLocator.dependencySet; import static org.hamcrest.MatcherAssert.assertThat; import static org.hamcrest.Matchers.is; @@ -65,12 +66,12 @@ public void testAuthoritativeRank() { ServiceLocator serviceLocator = dependencySet().with(mock(ClusteringService.class)).build(); provider.start(serviceLocator); - assertThat(provider.rankAuthority(ClusteredResourceType.Types.DEDICATED, + assertThat(provider.rank(singleton(ClusteredResourceType.Types.DEDICATED), Collections.singletonList(cacheLoaderWriterConfiguration)), is(2)); - assertThat(provider.rankAuthority(ClusteredResourceType.Types.DEDICATED, Collections.emptyList()), + assertThat(provider.rank(singleton(ClusteredResourceType.Types.DEDICATED), Collections.emptyList()), is(0)); - assertThat(provider.rankAuthority(new ClusteredStoreProviderTest.UnmatchedResourceType(), Collections.singletonList(cacheLoaderWriterConfiguration)), + assertThat(provider.rank(singleton(new ClusteredStoreProviderTest.UnmatchedResourceType()), Collections.singletonList(cacheLoaderWriterConfiguration)), is(0)); } } diff --git a/clustered/ehcache-client/src/test/java/org/ehcache/clustered/client/internal/loaderwriter/writebehind/ClusteredWriteBehindStoreProviderTest.java b/clustered/ehcache-client/src/test/java/org/ehcache/clustered/client/internal/loaderwriter/writebehind/ClusteredWriteBehindStoreProviderTest.java index 673381fd61..7d9a198015 100644 --- a/clustered/ehcache-client/src/test/java/org/ehcache/clustered/client/internal/loaderwriter/writebehind/ClusteredWriteBehindStoreProviderTest.java +++ b/clustered/ehcache-client/src/test/java/org/ehcache/clustered/client/internal/loaderwriter/writebehind/ClusteredWriteBehindStoreProviderTest.java @@ -32,6 +32,7 @@ import java.util.Collections; import java.util.HashSet; +import static java.util.Collections.singleton; import static org.ehcache.core.spi.ServiceLocator.dependencySet; import static org.hamcrest.MatcherAssert.assertThat; import static org.hamcrest.Matchers.is; @@ -68,13 +69,13 @@ public void testAuthoritativeRank() { ServiceLocator serviceLocator = dependencySet().with(mock(ClusteringService.class)).build(); provider.start(serviceLocator); - assertThat(provider.rankAuthority(ClusteredResourceType.Types.DEDICATED, + assertThat(provider.rank(singleton(ClusteredResourceType.Types.DEDICATED), Arrays.asList(cacheLoaderWriterConfiguration, writeBehindConfiguration)), is(3)); - assertThat(provider.rankAuthority(ClusteredResourceType.Types.DEDICATED, + assertThat(provider.rank(singleton(ClusteredResourceType.Types.DEDICATED), Collections.singletonList(writeBehindConfiguration)), is(0)); - assertThat(provider.rankAuthority(new ClusteredStoreProviderTest.UnmatchedResourceType(), Arrays.asList(cacheLoaderWriterConfiguration, + assertThat(provider.rank(singleton(new ClusteredStoreProviderTest.UnmatchedResourceType()), Arrays.asList(cacheLoaderWriterConfiguration, writeBehindConfiguration)), is(0)); } diff --git a/clustered/ehcache-client/src/test/java/org/ehcache/clustered/client/internal/store/ClusteredStoreProviderTest.java b/clustered/ehcache-client/src/test/java/org/ehcache/clustered/client/internal/store/ClusteredStoreProviderTest.java index 814b8886ff..59c7336a1e 100644 --- a/clustered/ehcache-client/src/test/java/org/ehcache/clustered/client/internal/store/ClusteredStoreProviderTest.java +++ b/clustered/ehcache-client/src/test/java/org/ehcache/clustered/client/internal/store/ClusteredStoreProviderTest.java @@ -52,6 +52,7 @@ import java.util.List; import java.util.Map; +import static java.util.Collections.singleton; import static org.ehcache.core.spi.ServiceLocator.dependencySet; import static org.hamcrest.MatcherAssert.assertThat; import static org.hamcrest.Matchers.is; @@ -129,9 +130,9 @@ public void testAuthoritativeRank() throws Exception { ServiceLocator serviceLocator = dependencySet().with(mock(ClusteringService.class)).build(); provider.start(serviceLocator); - assertThat(provider.rankAuthority(ClusteredResourceType.Types.DEDICATED, Collections.>emptyList()), is(1)); - assertThat(provider.rankAuthority(ClusteredResourceType.Types.SHARED, Collections.>emptyList()), is(1)); - assertThat(provider.rankAuthority(new UnmatchedResourceType(), Collections.>emptyList()), is(0)); + assertThat(provider.rank(singleton(ClusteredResourceType.Types.DEDICATED), Collections.>emptyList()), is(1)); + assertThat(provider.rank(singleton(ClusteredResourceType.Types.SHARED), Collections.>emptyList()), is(1)); + assertThat(provider.rank(singleton(new UnmatchedResourceType()), Collections.>emptyList()), is(0)); } private void assertRank(final Store.Provider provider, final int expectedRank, final ResourceType... resources) { diff --git a/ehcache-core/src/main/java/org/ehcache/core/EhcacheManager.java b/ehcache-core/src/main/java/org/ehcache/core/EhcacheManager.java index 0b5b857c46..af9adc8d00 100644 --- a/ehcache-core/src/main/java/org/ehcache/core/EhcacheManager.java +++ b/ehcache-core/src/main/java/org/ehcache/core/EhcacheManager.java @@ -501,7 +501,7 @@ public void close() throws Exception { Store.Provider storeProvider = StoreSupport.selectWrapperStoreProvider(serviceLocator, serviceConfigs); if (storeProvider == null) { - storeProvider = StoreSupport.selectStoreProvider(serviceLocator, resourceTypes, serviceConfigs); + storeProvider = StoreSupport.select(Store.Provider.class, serviceLocator, resourceTypes, serviceConfigs); } Store store = storeProvider.createStore(storeConfiguration, serviceConfigArray); diff --git a/ehcache-core/src/main/java/org/ehcache/core/spi/store/AbstractWrapperStoreProvider.java b/ehcache-core/src/main/java/org/ehcache/core/spi/store/AbstractWrapperStoreProvider.java index 63e21e0b75..18cb89c3d6 100644 --- a/ehcache-core/src/main/java/org/ehcache/core/spi/store/AbstractWrapperStoreProvider.java +++ b/ehcache-core/src/main/java/org/ehcache/core/spi/store/AbstractWrapperStoreProvider.java @@ -25,7 +25,7 @@ import java.util.Arrays; import java.util.Map; -import static org.ehcache.core.store.StoreSupport.selectStoreProvider; +import static org.ehcache.core.store.StoreSupport.select; @OptionalServiceDependencies("org.ehcache.core.spi.service.StatisticsService") public abstract class AbstractWrapperStoreProvider implements WrapperStore.Provider { @@ -38,7 +38,7 @@ public abstract class AbstractWrapperStoreProvider implements WrapperStore.Provi @Override public Store createStore(Store.Configuration storeConfig, ServiceConfiguration... serviceConfigs) { - Store.Provider underlyingStoreProvider = selectStoreProvider(serviceProvider, storeConfig.getResourcePools().getResourceTypeSet(), + Store.Provider underlyingStoreProvider = select(Store.Provider.class, serviceProvider, storeConfig.getResourcePools().getResourceTypeSet(), Arrays.asList(serviceConfigs)); Store store = underlyingStoreProvider.createStore(storeConfig, serviceConfigs); diff --git a/ehcache-core/src/main/java/org/ehcache/core/spi/store/ResourceRankableService.java b/ehcache-core/src/main/java/org/ehcache/core/spi/store/ResourceRankableService.java new file mode 100644 index 0000000000..77f244591b --- /dev/null +++ b/ehcache-core/src/main/java/org/ehcache/core/spi/store/ResourceRankableService.java @@ -0,0 +1,42 @@ +/* + * Copyright Terracotta, Inc. + * + * Licensed 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.ehcache.core.spi.store; + +import org.ehcache.config.ResourceType; +import org.ehcache.spi.service.PluralService; +import org.ehcache.spi.service.Service; +import org.ehcache.spi.service.ServiceConfiguration; + +import java.util.Collection; +import java.util.Set; + +@PluralService +public interface ResourceRankableService extends Service { + + /** + * Gets the internal ranking for the instances provided by this {@code Service} + * ability to handle the specified resources. A higher rank value indicates a more preferable instance. + * + * @param resourceTypes the set of {@code ResourceType}s for the store to handle + * @param serviceConfigs the collection of {@code ServiceConfiguration} instances that may contribute + * to the ranking + * + * @return a non-negative rank indicating the ability of a instance created by this {@code Service} + * to handle the resource types specified by {@code resourceTypes}; a rank of 0 indicates an + * inability to handle all types specified in {@code resourceTypes} + */ + int rank(Set> resourceTypes, Collection> serviceConfigs); +} diff --git a/ehcache-core/src/main/java/org/ehcache/core/spi/store/Store.java b/ehcache-core/src/main/java/org/ehcache/core/spi/store/Store.java index d3c0fd82ff..4c62e50b8f 100644 --- a/ehcache-core/src/main/java/org/ehcache/core/spi/store/Store.java +++ b/ehcache-core/src/main/java/org/ehcache/core/spi/store/Store.java @@ -19,17 +19,14 @@ import org.ehcache.Cache; import org.ehcache.config.EvictionAdvisor; import org.ehcache.config.ResourcePools; -import org.ehcache.config.ResourceType; import org.ehcache.core.spi.store.events.StoreEventSource; import org.ehcache.expiry.ExpiryPolicy; import org.ehcache.spi.loaderwriter.CacheLoaderWriter; import org.ehcache.spi.resilience.StoreAccessException; import org.ehcache.spi.serialization.Serializer; import org.ehcache.spi.service.PluralService; -import org.ehcache.spi.service.Service; import org.ehcache.spi.service.ServiceConfiguration; -import java.util.Collection; import java.util.Map; import java.util.Set; import java.util.function.BiFunction; @@ -555,7 +552,7 @@ interface ValueHolder extends Supplier { * Implementation of {@link Provider} have to be thread-safe. */ @PluralService - interface Provider extends Service { + interface Provider extends ResourceRankableService { /** * Creates a new Store instance @@ -577,20 +574,6 @@ interface Provider extends Service { * @param resource the store to initialize */ void initStore(Store resource); - - /** - * Gets the internal ranking for the {@link Store} instances provided by this {@code Provider} of the store's - * ability to handle the specified resources. A higher rank value indicates a more capable {@code Store}. - * - * @param resourceTypes the set of {@code ResourceType}s for the store to handle - * @param serviceConfigs the collection of {@code ServiceConfiguration} instances that may contribute - * to the ranking - * - * @return a non-negative rank indicating the ability of a {@code Store} created by this {@code Provider} - * to handle the resource types specified by {@code resourceTypes}; a rank of 0 indicates the store - * can not handle all types specified in {@code resourceTypes} - */ - int rank(Set> resourceTypes, Collection> serviceConfigs); } /** diff --git a/ehcache-core/src/main/java/org/ehcache/core/spi/store/WrapperStore.java b/ehcache-core/src/main/java/org/ehcache/core/spi/store/WrapperStore.java index 4002b660b4..fddfee731e 100644 --- a/ehcache-core/src/main/java/org/ehcache/core/spi/store/WrapperStore.java +++ b/ehcache-core/src/main/java/org/ehcache/core/spi/store/WrapperStore.java @@ -16,10 +16,12 @@ package org.ehcache.core.spi.store; +import org.ehcache.config.ResourceType; import org.ehcache.spi.service.PluralService; import org.ehcache.spi.service.ServiceConfiguration; import java.util.Collection; +import java.util.Set; /** * Marker interface for {@link Store}s which act like wrapper and does not have any storage, rather @@ -35,6 +37,11 @@ public interface WrapperStore extends Store { @PluralService interface Provider extends Store.Provider { + @Override + default int rank(Set> resourceTypes, Collection> serviceConfigs) { + return 0; + } + /** * Gets the internal ranking for the {@code WrapperStore} instances provided by this {@code Provider} of the wrapper * store's diff --git a/ehcache-core/src/main/java/org/ehcache/core/spi/store/tiering/AuthoritativeTier.java b/ehcache-core/src/main/java/org/ehcache/core/spi/store/tiering/AuthoritativeTier.java index 4a0abbe4ec..c46d7d738c 100644 --- a/ehcache-core/src/main/java/org/ehcache/core/spi/store/tiering/AuthoritativeTier.java +++ b/ehcache-core/src/main/java/org/ehcache/core/spi/store/tiering/AuthoritativeTier.java @@ -17,14 +17,15 @@ package org.ehcache.core.spi.store.tiering; import org.ehcache.config.ResourceType; +import org.ehcache.core.spi.store.ResourceRankableService; import org.ehcache.spi.resilience.StoreAccessException; import org.ehcache.core.spi.store.Store; import org.ehcache.spi.service.PluralService; import org.ehcache.spi.service.Service; import org.ehcache.spi.service.ServiceConfiguration; -import java.util.Collection; import java.util.Map; +import java.util.Set; import java.util.function.Function; /** @@ -121,7 +122,7 @@ interface InvalidationValve { * Multiple providers may exist in a given {@link org.ehcache.CacheManager}. */ @PluralService - interface Provider extends Service { + interface Provider extends ResourceRankableService { /** * Creates a new {@link AuthoritativeTier} instance using the provided configuration. @@ -133,7 +134,7 @@ interface Provider extends Service { * @param serviceConfigs a collection of service configurations * @return the new authoritative tier */ - AuthoritativeTier createAuthoritativeTier(Configuration storeConfig, ServiceConfiguration... serviceConfigs); + AuthoritativeTier createAuthoritativeTier(Set> resourceTypes, Configuration storeConfig, ServiceConfiguration... serviceConfigs); /** * Releases an {@link AuthoritativeTier}. @@ -150,22 +151,6 @@ interface Provider extends Service { * @param resource the authoritative tier to initialise */ void initAuthoritativeTier(AuthoritativeTier resource); - - /** - * Gets the internal ranking for the {@link AuthoritativeTier} instances provided by this {@code Provider} of the - * authority's ability to handle the specified resource. - *

- * A higher rank value indicates a more capable {@code AuthoritativeTier}. - * - * @param authorityResource the {@code ResourceType} for the authority to handle - * @param serviceConfigs the collection of {@code ServiceConfiguration} instances that may contribute - * to the ranking - * - * @return a non-negative rank indicating the ability of a {@code AuthoritativeTier} created by this {@code Provider} - * to handle the resource type specified by {@code authorityResource}; a rank of 0 indicates the authority - * can not handle the type specified in {@code authorityResource} - */ - int rankAuthority(ResourceType authorityResource, Collection> serviceConfigs); } } diff --git a/ehcache-core/src/main/java/org/ehcache/core/spi/store/tiering/CachingTier.java b/ehcache-core/src/main/java/org/ehcache/core/spi/store/tiering/CachingTier.java index 7a50ac2c43..b026165261 100644 --- a/ehcache-core/src/main/java/org/ehcache/core/spi/store/tiering/CachingTier.java +++ b/ehcache-core/src/main/java/org/ehcache/core/spi/store/tiering/CachingTier.java @@ -17,6 +17,7 @@ package org.ehcache.core.spi.store.tiering; import org.ehcache.config.ResourceType; +import org.ehcache.core.spi.store.ResourceRankableService; import org.ehcache.spi.resilience.StoreAccessException; import org.ehcache.core.spi.store.ConfigurationChangeSupport; import org.ehcache.core.spi.store.Store; @@ -24,7 +25,6 @@ import org.ehcache.spi.service.Service; import org.ehcache.spi.service.ServiceConfiguration; -import java.util.Collection; import java.util.Map; import java.util.Set; import java.util.function.Function; @@ -150,7 +150,7 @@ interface InvalidationListener { * Multiple providers may exist in a single {@link org.ehcache.CacheManager}. */ @PluralService - interface Provider extends Service { + interface Provider extends ResourceRankableService { /** * Creates a new {@link CachingTier} instance using the provided configuration @@ -162,7 +162,7 @@ interface Provider extends Service { * * @return the new caching tier */ - CachingTier createCachingTier(Store.Configuration storeConfig, ServiceConfiguration... serviceConfigs); + CachingTier createCachingTier(Set> resourceTypes, Store.Configuration storeConfig, ServiceConfiguration... serviceConfigs); /** * Releases a {@link CachingTier}. @@ -179,22 +179,6 @@ interface Provider extends Service { * @param resource the caching tier to initialise */ void initCachingTier(CachingTier resource); - - /** - * Gets the internal ranking for the {@link CachingTier} instances provided by this {@code Provider} of the - * caching tier's ability to handle the specified resources. - *

- * A higher rank value indicates a more capable {@code CachingTier}. - * - * @param resourceTypes the set of {@code ResourceType}s for the store to handle - * @param serviceConfigs the collection of {@code ServiceConfiguration} instances that may contribute - * to the ranking - * - * @return a non-negative rank indicating the ability of a {@code CachingTier} created by this {@code Provider} - * to handle the resource types specified by {@code resourceTypes}; a rank of 0 indicates the caching tier - * can not handle the type specified in {@code resourceTypes} - */ - int rankCachingTier(Set> resourceTypes, Collection> serviceConfigs); } } diff --git a/ehcache-core/src/main/java/org/ehcache/core/spi/store/tiering/HigherCachingTier.java b/ehcache-core/src/main/java/org/ehcache/core/spi/store/tiering/HigherCachingTier.java index bda5705091..29754bc06d 100644 --- a/ehcache-core/src/main/java/org/ehcache/core/spi/store/tiering/HigherCachingTier.java +++ b/ehcache-core/src/main/java/org/ehcache/core/spi/store/tiering/HigherCachingTier.java @@ -16,12 +16,15 @@ package org.ehcache.core.spi.store.tiering; +import org.ehcache.config.ResourceType; +import org.ehcache.core.spi.store.ResourceRankableService; import org.ehcache.spi.resilience.StoreAccessException; import org.ehcache.core.spi.store.Store; import org.ehcache.spi.service.PluralService; import org.ehcache.spi.service.Service; import org.ehcache.spi.service.ServiceConfiguration; +import java.util.Set; import java.util.function.BiFunction; import java.util.function.Function; @@ -65,7 +68,7 @@ public interface HigherCachingTier extends CachingTier { * {@link Service} interface for providing {@link HigherCachingTier} instances. */ @PluralService - interface Provider extends Service { + interface Provider extends ResourceRankableService { /** * Creates a new {@link HigherCachingTier} instance using the provided configuration @@ -77,7 +80,7 @@ interface Provider extends Service { * * @return the new higher caching tier */ - HigherCachingTier createHigherCachingTier(Store.Configuration storeConfig, ServiceConfiguration... serviceConfigs); + HigherCachingTier createHigherCachingTier(Set> resourceTypes, Store.Configuration storeConfig, ServiceConfiguration... serviceConfigs); /** * Releases a {@link HigherCachingTier}. diff --git a/ehcache-core/src/main/java/org/ehcache/core/spi/store/tiering/LowerCachingTier.java b/ehcache-core/src/main/java/org/ehcache/core/spi/store/tiering/LowerCachingTier.java index d9e2860e01..84c7dbe5b6 100644 --- a/ehcache-core/src/main/java/org/ehcache/core/spi/store/tiering/LowerCachingTier.java +++ b/ehcache-core/src/main/java/org/ehcache/core/spi/store/tiering/LowerCachingTier.java @@ -16,13 +16,16 @@ package org.ehcache.core.spi.store.tiering; +import org.ehcache.config.ResourceType; import org.ehcache.core.spi.store.ConfigurationChangeSupport; +import org.ehcache.core.spi.store.ResourceRankableService; import org.ehcache.core.spi.store.Store; import org.ehcache.spi.resilience.StoreAccessException; import org.ehcache.spi.service.PluralService; import org.ehcache.spi.service.Service; import org.ehcache.spi.service.ServiceConfiguration; +import java.util.Set; import java.util.function.Function; /** @@ -112,7 +115,7 @@ public interface LowerCachingTier extends ConfigurationChangeSupport { * {@link Service} interface for providing {@link LowerCachingTier} instances. */ @PluralService - interface Provider extends Service { + interface Provider extends ResourceRankableService { /** * Creates a new {@link LowerCachingTier} instance using the provided configuration @@ -124,7 +127,7 @@ interface Provider extends Service { * * @return the new lower caching tier */ - LowerCachingTier createCachingTier(Store.Configuration storeConfig, ServiceConfiguration... serviceConfigs); + LowerCachingTier createCachingTier(Set> resourceTypes, Store.Configuration storeConfig, ServiceConfiguration... serviceConfigs); /** * Releases a {@link LowerCachingTier}. diff --git a/ehcache-core/src/main/java/org/ehcache/core/store/StoreSupport.java b/ehcache-core/src/main/java/org/ehcache/core/store/StoreSupport.java index 5194f6741c..1d6f7aa855 100644 --- a/ehcache-core/src/main/java/org/ehcache/core/store/StoreSupport.java +++ b/ehcache-core/src/main/java/org/ehcache/core/store/StoreSupport.java @@ -18,6 +18,7 @@ import org.ehcache.config.ResourceType; import org.ehcache.core.spi.ServiceLocator; +import org.ehcache.core.spi.store.ResourceRankableService; import org.ehcache.core.spi.store.Store; import org.ehcache.core.spi.store.WrapperStore; import org.ehcache.spi.service.ServiceProvider; @@ -26,6 +27,7 @@ import java.util.ArrayList; import java.util.Collection; +import java.util.Collections; import java.util.Comparator; import java.util.List; import java.util.Optional; @@ -60,6 +62,20 @@ private static class Tuple { } } + public static T select(Class serviceType, + ServiceProvider serviceProvider, Set> resourceTypes, Collection> serviceConfigs) { + return trySelect(serviceType, serviceProvider, resourceTypes, serviceConfigs).orElseThrow(() -> { + Class enclosingClass = serviceType.getEnclosingClass(); + String type = enclosingClass == null ? serviceType.getSimpleName() : enclosingClass.getSimpleName() + "." + serviceType.getSimpleName(); + StringBuilder sb = new StringBuilder("No " + type + " types found to handle configured resource types "); + sb.append(resourceTypes); + sb.append(" from "); + sb.append(serviceProvider.getServicesOfType(serviceType).stream().map(p -> p.getClass().getName()) + .collect(Collectors.joining(", ", "{", "}"))); + return new IllegalStateException(sb.toString()); + }); + } + /** * Chooses a {@link org.ehcache.core.spi.store.Store.Provider Store.Provider} from those * available through the {@link ServiceLocator} that best supports the resource types and @@ -77,14 +93,13 @@ private static class Tuple { * @throws IllegalStateException if no suitable {@code Store.Provider} is available or if * multiple {@code Store.Provider} implementations return the same top ranking */ - public static Store.Provider selectStoreProvider( - ServiceProvider serviceProvider, Set> resourceTypes, Collection> serviceConfigs) { + public static Optional trySelect(Class serviceType, + ServiceProvider serviceProvider, Set> resourceTypes, Collection> serviceConfigs) { - Collection storeProviders = serviceProvider.getServicesOfType(Store.Provider.class); - List filteredStoreProviders = storeProviders.stream().filter(provider -> !(provider instanceof WrapperStore.Provider)).collect(Collectors.toList()); + Collection storeProviders = serviceProvider.getServicesOfType(serviceType); int highRank = 0; - List rankingProviders = new ArrayList<>(); - for (Store.Provider provider : filteredStoreProviders) { + List rankingProviders = new ArrayList<>(); + for (T provider : storeProviders) { int rank = provider.rank(resourceTypes, serviceConfigs); if (rank > highRank) { highRank = rank; @@ -96,33 +111,18 @@ public static Store.Provider selectStoreProvider( } if (rankingProviders.isEmpty()) { - StringBuilder sb = new StringBuilder("No Store.Provider found to handle configured resource types "); - sb.append(resourceTypes); - sb.append(" from "); - formatStoreProviders(filteredStoreProviders, sb); - throw new IllegalStateException(sb.toString()); + return Optional.empty(); } else if (rankingProviders.size() > 1) { - StringBuilder sb = new StringBuilder("Multiple Store.Providers found to handle configured resource types "); + Class enclosingClass = serviceType.getEnclosingClass(); + String type = enclosingClass == null ? serviceType.getSimpleName() : enclosingClass.getSimpleName() + "." + serviceType.getSimpleName(); + StringBuilder sb = new StringBuilder("Multiple " + type + " types found to handle configured resource types "); sb.append(resourceTypes); sb.append(": "); - formatStoreProviders(rankingProviders, sb); + sb.append(rankingProviders.stream().map(p -> p.getClass().getName()) + .collect(Collectors.joining(", ", "{", "}"))); throw new IllegalStateException(sb.toString()); + } else { + return Optional.of(rankingProviders.get(0)); } - - return rankingProviders.get(0); - } - - private static void formatStoreProviders(final Collection storeProviders, final StringBuilder sb) { - sb.append('{'); - boolean prependSeparator = false; - for (final Store.Provider provider : storeProviders) { - if (prependSeparator) { - sb.append(", "); - } else { - prependSeparator = true; - } - sb.append(provider.getClass().getName()); - } - sb.append('}'); } } diff --git a/ehcache-core/src/test/java/org/ehcache/core/store/StoreSupportTest.java b/ehcache-core/src/test/java/org/ehcache/core/store/StoreSupportTest.java index ec93741041..a5488c4f6e 100644 --- a/ehcache-core/src/test/java/org/ehcache/core/store/StoreSupportTest.java +++ b/ehcache-core/src/test/java/org/ehcache/core/store/StoreSupportTest.java @@ -79,7 +79,7 @@ public void testSelectStoreProvider() throws Exception { ); final ServiceLocator serviceLocator = dependencySet().with(storeProviders).build(); - final Store.Provider selectedProvider = StoreSupport.selectStoreProvider(serviceLocator, + final Store.Provider selectedProvider = StoreSupport.select(Store.Provider.class, serviceLocator, Collections.>singleton(anyResourceType), Collections.>emptyList()); @@ -105,13 +105,13 @@ public void testSelectStoreProviderMultiple() throws Exception { final ServiceLocator serviceLocator = dependencySet().with(storeProviders).build(); try { - StoreSupport.selectStoreProvider(serviceLocator, + StoreSupport.select(Store.Provider.class, serviceLocator, Collections.>singleton(anyResourceType), Collections.>emptyList()); fail(); } catch (IllegalStateException e) { // expected - assertThat(e.getMessage(), startsWith("Multiple Store.Providers ")); + assertThat(e.getMessage(), startsWith("Multiple Store.Provider types")); } for (final TestBaseProvider provider : storeProviders) { @@ -122,7 +122,7 @@ public void testSelectStoreProviderMultiple() throws Exception { @Test public void testSelectStoreProviderNoProviders() throws Exception { try { - StoreSupport.selectStoreProvider(dependencySet().build(), + StoreSupport.select(Store.Provider.class, dependencySet().build(), Collections.>singleton(anyResourceType), Collections.>emptyList()); fail(); @@ -162,7 +162,7 @@ public int getTierHeight() { final ServiceLocator serviceLocator = dependencySet().with(storeProviders).build(); try { - StoreSupport.selectStoreProvider(serviceLocator, + StoreSupport.select(Store.Provider.class, serviceLocator, Collections.>singleton(otherResourceType), Collections.>emptyList()); fail(); diff --git a/ehcache-impl/src/main/java/org/ehcache/config/builders/UserManagedCacheBuilder.java b/ehcache-impl/src/main/java/org/ehcache/config/builders/UserManagedCacheBuilder.java index c4cd118f38..f39eb46e20 100644 --- a/ehcache-impl/src/main/java/org/ehcache/config/builders/UserManagedCacheBuilder.java +++ b/ehcache-impl/src/main/java/org/ehcache/config/builders/UserManagedCacheBuilder.java @@ -80,7 +80,6 @@ import java.util.concurrent.atomic.AtomicReference; import static org.ehcache.config.ResourceType.Core.DISK; -import static org.ehcache.config.ResourceType.Core.OFFHEAP; import static org.ehcache.config.builders.ResourcePoolsBuilder.newResourcePoolsBuilder; import static org.ehcache.core.spi.ServiceLocator.dependencySet; import static org.ehcache.core.spi.service.ServiceUtils.findSingletonAmongst; @@ -286,7 +285,7 @@ public void close() throws Exception { Store.Provider storeProvider = StoreSupport.selectWrapperStoreProvider(serviceLocator, serviceConfigsList); if (storeProvider == null) { - storeProvider = StoreSupport.selectStoreProvider(serviceLocator, resources, serviceConfigsList); + storeProvider = StoreSupport.select(Store.Provider.class, serviceLocator, resources, serviceConfigsList); } Store.Configuration storeConfig = new StoreConfigurationImpl<>(keyType, valueType, evictionAdvisor, classLoader, diff --git a/ehcache-impl/src/main/java/org/ehcache/impl/internal/store/disk/OffHeapDiskStore.java b/ehcache-impl/src/main/java/org/ehcache/impl/internal/store/disk/OffHeapDiskStore.java index 84a56c9370..c235ea40d0 100644 --- a/ehcache-impl/src/main/java/org/ehcache/impl/internal/store/disk/OffHeapDiskStore.java +++ b/ehcache-impl/src/main/java/org/ehcache/impl/internal/store/disk/OffHeapDiskStore.java @@ -317,11 +317,6 @@ public int rank(final Set> resourceTypes, final Collection authorityResource, Collection> serviceConfigs) { - return authorityResource.equals(getResourceType()) ? 1 : 0; - } - @Override public OffHeapDiskStore createStore(Configuration storeConfig, ServiceConfiguration... serviceConfigs) { OffHeapDiskStore store = createStoreInternal(storeConfig, new ThreadLocalStoreEventDispatcher<>(storeConfig.getDispatcherConcurrency()), serviceConfigs); @@ -461,7 +456,7 @@ public void stop() { } @Override - public AuthoritativeTier createAuthoritativeTier(Configuration storeConfig, ServiceConfiguration... serviceConfigs) { + public AuthoritativeTier createAuthoritativeTier(Set> resourceTypes, Configuration storeConfig, ServiceConfiguration... serviceConfigs) { OffHeapDiskStore authoritativeTier = createStoreInternal(storeConfig, new ThreadLocalStoreEventDispatcher<>(storeConfig .getDispatcherConcurrency()), serviceConfigs); diff --git a/ehcache-impl/src/main/java/org/ehcache/impl/internal/store/heap/OnHeapStore.java b/ehcache-impl/src/main/java/org/ehcache/impl/internal/store/heap/OnHeapStore.java index a6262b2000..7ade15083e 100644 --- a/ehcache-impl/src/main/java/org/ehcache/impl/internal/store/heap/OnHeapStore.java +++ b/ehcache-impl/src/main/java/org/ehcache/impl/internal/store/heap/OnHeapStore.java @@ -1673,11 +1673,6 @@ public int rank(Set> resourceTypes, Collection> resourceTypes, Collection> serviceConfigs) { - return rank(resourceTypes, serviceConfigs); - } - @Override public OnHeapStore createStore(Configuration storeConfig, ServiceConfiguration... serviceConfigs) { OnHeapStore store = createStoreInternal(storeConfig, new DefaultStoreEventDispatcher<>(storeConfig.getDispatcherConcurrency()), serviceConfigs); @@ -1762,7 +1757,7 @@ public void stop() { } @Override - public CachingTier createCachingTier(Configuration storeConfig, ServiceConfiguration... serviceConfigs) { + public CachingTier createCachingTier(Set> resourceTypes, Configuration storeConfig, ServiceConfiguration... serviceConfigs) { OnHeapStore cachingTier = createStoreInternal(storeConfig, NullStoreEventDispatcher.nullStoreEventDispatcher(), serviceConfigs); this.tierOperationStatistics.put(cachingTier, new OperationStatistic[] { @@ -1790,7 +1785,7 @@ public void initCachingTier(CachingTier resource) { } @Override - public HigherCachingTier createHigherCachingTier(Configuration storeConfig, ServiceConfiguration... serviceConfigs) { + public HigherCachingTier createHigherCachingTier(Set> resourceTypes, Configuration storeConfig, ServiceConfiguration... serviceConfigs) { OnHeapStore higherCachingTier = createStoreInternal(storeConfig, new DefaultStoreEventDispatcher<>(storeConfig .getDispatcherConcurrency()), serviceConfigs); diff --git a/ehcache-impl/src/main/java/org/ehcache/impl/internal/store/loaderwriter/LoaderWriterStoreProvider.java b/ehcache-impl/src/main/java/org/ehcache/impl/internal/store/loaderwriter/LoaderWriterStoreProvider.java index ba9a3b5e53..08298e583d 100644 --- a/ehcache-impl/src/main/java/org/ehcache/impl/internal/store/loaderwriter/LoaderWriterStoreProvider.java +++ b/ehcache-impl/src/main/java/org/ehcache/impl/internal/store/loaderwriter/LoaderWriterStoreProvider.java @@ -15,7 +15,6 @@ */ package org.ehcache.impl.internal.store.loaderwriter; -import org.ehcache.config.ResourceType; import org.ehcache.core.spi.store.AbstractWrapperStoreProvider; import org.ehcache.core.spi.store.Store; import org.ehcache.spi.loaderwriter.CacheLoaderWriter; @@ -30,7 +29,6 @@ import org.ehcache.spi.service.ServiceProvider; import java.util.Collection; -import java.util.Set; import static org.ehcache.core.spi.service.ServiceUtils.findSingletonAmongst; @@ -82,11 +80,6 @@ public void stop() { super.stop(); } - @Override - public int rank(Set> resourceTypes, Collection> serviceConfigs) { - throw new UnsupportedOperationException("Its a Wrapper store provider, does not support regular ranking"); - } - @Override public int wrapperStoreRank(Collection> serviceConfigs) { CacheLoaderWriterConfiguration loaderWriterConfiguration = findSingletonAmongst(CacheLoaderWriterConfiguration.class, serviceConfigs); diff --git a/ehcache-impl/src/main/java/org/ehcache/impl/internal/store/offheap/OffHeapStore.java b/ehcache-impl/src/main/java/org/ehcache/impl/internal/store/offheap/OffHeapStore.java index 8e6f17f6af..acfe834cf7 100644 --- a/ehcache-impl/src/main/java/org/ehcache/impl/internal/store/offheap/OffHeapStore.java +++ b/ehcache-impl/src/main/java/org/ehcache/impl/internal/store/offheap/OffHeapStore.java @@ -142,11 +142,6 @@ public int rank(final Set> resourceTypes, final Collection authorityResource, Collection> serviceConfigs) { - return authorityResource.equals(ResourceType.Core.OFFHEAP) ? 1 : 0; - } - @Override public OffHeapStore createStore(Configuration storeConfig, ServiceConfiguration... serviceConfigs) { OffHeapStore store = createStoreInternal(storeConfig, new ThreadLocalStoreEventDispatcher<>(storeConfig.getDispatcherConcurrency()), serviceConfigs); @@ -230,7 +225,7 @@ public void stop() { } @Override - public AuthoritativeTier createAuthoritativeTier(Configuration storeConfig, ServiceConfiguration... serviceConfigs) { + public AuthoritativeTier createAuthoritativeTier(Set> resourceTypes, Configuration storeConfig, ServiceConfiguration... serviceConfigs) { OffHeapStore authoritativeTier = createStoreInternal(storeConfig, new ThreadLocalStoreEventDispatcher<>(storeConfig .getDispatcherConcurrency()), serviceConfigs); @@ -253,7 +248,7 @@ public void initAuthoritativeTier(AuthoritativeTier resource) { } @Override - public LowerCachingTier createCachingTier(Configuration storeConfig, ServiceConfiguration... serviceConfigs) { + public LowerCachingTier createCachingTier(Set> resourceTypes, Configuration storeConfig, ServiceConfiguration... serviceConfigs) { OffHeapStore lowerCachingTier = createStoreInternal(storeConfig, NullStoreEventDispatcher.nullStoreEventDispatcher(), serviceConfigs); tierOperationStatistics.put(lowerCachingTier, new OperationStatistic[] { diff --git a/ehcache-impl/src/main/java/org/ehcache/impl/internal/store/tiering/CompoundCachingTier.java b/ehcache-impl/src/main/java/org/ehcache/impl/internal/store/tiering/CompoundCachingTier.java index 3bab1b3d3e..e199a13201 100644 --- a/ehcache-impl/src/main/java/org/ehcache/impl/internal/store/tiering/CompoundCachingTier.java +++ b/ehcache-impl/src/main/java/org/ehcache/impl/internal/store/tiering/CompoundCachingTier.java @@ -35,7 +35,7 @@ import java.util.AbstractMap; import java.util.ArrayList; import java.util.Collection; -import java.util.EnumSet; +import java.util.Collections; import java.util.HashMap; import java.util.HashSet; import java.util.List; @@ -44,9 +44,11 @@ import java.util.concurrent.ConcurrentMap; import java.util.function.Function; -import static java.util.Collections.unmodifiableSet; -import static org.ehcache.config.ResourceType.Core.HEAP; -import static org.ehcache.config.ResourceType.Core.OFFHEAP; +import static java.util.Arrays.asList; +import static java.util.Collections.singleton; +import static java.util.Comparator.comparingInt; +import static org.ehcache.core.store.StoreSupport.select; +import static org.ehcache.core.store.StoreSupport.trySelect; /** * A {@link CachingTier} implementation supporting a cache hierarchy. @@ -250,24 +252,19 @@ public static class Provider implements CachingTier.Provider { private final ConcurrentMap, Map.Entry> providersMap = new ConcurrentWeakIdentityHashMap<>(); @Override - public CachingTier createCachingTier(Store.Configuration storeConfig, ServiceConfiguration... serviceConfigs) { + public CachingTier createCachingTier(Set> resourceTypes, Store.Configuration storeConfig, ServiceConfiguration... serviceConfigs) { if (serviceProvider == null) { throw new RuntimeException("ServiceProvider is null."); } - Collection higherProviders = serviceProvider.getServicesOfType(HigherCachingTier.Provider.class); - if (higherProviders.size() != 1) { - throw new IllegalStateException("Cannot handle multiple higher tier providers"); - } - HigherCachingTier.Provider higherProvider = higherProviders.iterator().next(); - HigherCachingTier higherCachingTier = higherProvider.createHigherCachingTier(storeConfig, serviceConfigs); + Set> upperResources = singleton(Collections.max(resourceTypes, comparingInt(ResourceType::getTierHeight))); + Set> lowerResources = singleton(Collections.min(resourceTypes, comparingInt(ResourceType::getTierHeight))); - Collection lowerProviders = serviceProvider.getServicesOfType(LowerCachingTier.Provider.class); - if (lowerProviders.size() != 1) { - throw new IllegalStateException("Cannot handle multiple lower tier providers"); - } - LowerCachingTier.Provider lowerProvider = lowerProviders.iterator().next(); - LowerCachingTier lowerCachingTier = lowerProvider.createCachingTier(storeConfig, serviceConfigs); + HigherCachingTier.Provider higherProvider = select(HigherCachingTier.Provider.class, serviceProvider, upperResources, asList(serviceConfigs)); + HigherCachingTier higherCachingTier = higherProvider.createHigherCachingTier(upperResources, storeConfig, serviceConfigs); + + LowerCachingTier.Provider lowerProvider = select(LowerCachingTier.Provider.class, serviceProvider, lowerResources, asList(serviceConfigs)); + LowerCachingTier lowerCachingTier = lowerProvider.createCachingTier(lowerResources, storeConfig, serviceConfigs); CompoundCachingTier compoundCachingTier = new CompoundCachingTier<>(higherCachingTier, lowerCachingTier); StatisticsService statisticsService = serviceProvider.getService(StatisticsService.class); @@ -304,9 +301,17 @@ public void initCachingTier(CachingTier resource) { } @Override - public int rankCachingTier(Set> resourceTypes, Collection> serviceConfigs) { - return resourceTypes.equals(unmodifiableSet(EnumSet.of(HEAP, OFFHEAP))) ? 2 : 0; - + public int rank(Set> resourceTypes, Collection> serviceConfigs) { + if (resourceTypes.size() != 2) { + return 0; + } else { + Set> upperResources = singleton(Collections.max(resourceTypes, comparingInt(ResourceType::getTierHeight))); + Set> lowerResources = singleton(Collections.min(resourceTypes, comparingInt(ResourceType::getTierHeight))); + + return trySelect(HigherCachingTier.Provider.class, serviceProvider, upperResources, serviceConfigs).map(a -> a.rank(upperResources, serviceConfigs)) + .flatMap(ar -> trySelect(LowerCachingTier.Provider.class, serviceProvider, lowerResources, serviceConfigs).map(a -> a.rank(lowerResources, serviceConfigs)).map(cr -> ar + cr)) + .orElse(0); + } } @Override diff --git a/ehcache-impl/src/main/java/org/ehcache/impl/internal/store/tiering/TieredStore.java b/ehcache-impl/src/main/java/org/ehcache/impl/internal/store/tiering/TieredStore.java index 5568d84b5e..bb0ff3be1b 100644 --- a/ehcache-impl/src/main/java/org/ehcache/impl/internal/store/tiering/TieredStore.java +++ b/ehcache-impl/src/main/java/org/ehcache/impl/internal/store/tiering/TieredStore.java @@ -23,6 +23,7 @@ import org.ehcache.core.exceptions.StorePassThroughException; import org.ehcache.core.spi.service.StatisticsService; import org.ehcache.core.spi.store.Store; +import org.ehcache.core.store.StoreSupport; import org.ehcache.spi.resilience.StoreAccessException; import org.ehcache.core.spi.store.events.StoreEventSource; import org.ehcache.core.spi.store.tiering.AuthoritativeTier; @@ -37,7 +38,6 @@ import java.util.ArrayList; import java.util.Arrays; import java.util.Collection; -import java.util.Collections; import java.util.HashMap; import java.util.HashSet; import java.util.List; @@ -51,6 +51,9 @@ import java.util.function.Function; import java.util.function.Supplier; +import static java.util.Collections.singleton; +import static org.ehcache.core.store.StoreSupport.trySelect; + /** * A {@link Store} implementation supporting a tiered caching model. */ @@ -411,43 +414,25 @@ public static class Provider implements Store.Provider { public int rank(final Set> resourceTypes, final Collection> serviceConfigs) { if (resourceTypes.size() == 1) { return 0; + } else { + Set> cachingResources = new HashSet<>(resourceTypes); + Set> authorityResources = getAuthorityResources(resourceTypes); + cachingResources.removeAll(authorityResources); + + return trySelect(AuthoritativeTier.Provider.class, serviceProvider, authorityResources, serviceConfigs).map(a -> a.rank(authorityResources, serviceConfigs)) + .flatMap(ar -> trySelect(CachingTier.Provider.class, serviceProvider, cachingResources, serviceConfigs).map(a -> a.rank(cachingResources, serviceConfigs)).map(cr -> ar + cr)) + .orElse(0); } - ResourceType authorityResource = getAuthorityResource(resourceTypes); - int authorityRank = 0; - Collection authorityProviders = serviceProvider.getServicesOfType(AuthoritativeTier.Provider.class); - for (AuthoritativeTier.Provider authorityProvider : authorityProviders) { - int newRank = authorityProvider.rankAuthority(authorityResource, serviceConfigs); - if (newRank > authorityRank) { - authorityRank = newRank; - } - } - if (authorityRank == 0) { - return 0; - } - Set> cachingResources = new HashSet<>(resourceTypes); - cachingResources.remove(authorityResource); - int cachingTierRank = 0; - Collection cachingTierProviders = serviceProvider.getServicesOfType(CachingTier.Provider.class); - for (CachingTier.Provider cachingTierProvider : cachingTierProviders) { - int newRank = cachingTierProvider.rankCachingTier(cachingResources, serviceConfigs); - if (newRank > cachingTierRank) { - cachingTierRank = newRank; - } - } - if (cachingTierRank == 0) { - return 0; - } - return authorityRank + cachingTierRank; } - private ResourceType getAuthorityResource(Set> resourceTypes) { + private Set> getAuthorityResources(Set> resourceTypes) { ResourceType authorityResource = null; for (ResourceType resourceType : resourceTypes) { if (authorityResource == null || authorityResource.getTierHeight() > resourceType.getTierHeight()) { authorityResource = resourceType; } } - return authorityResource; + return singleton(authorityResource); } @Override @@ -460,18 +445,18 @@ public Store createStore(Configuration storeConfig, ServiceCo + resourcePools.getResourceTypeSet()); } - ResourceType authorityResource = getAuthorityResource(resourcePools.getResourceTypeSet()); - AuthoritativeTier.Provider authoritativeTierProvider = getAuthoritativeTierProvider(authorityResource, enhancedServiceConfigs); + Set> authorityResources = getAuthorityResources(resourcePools.getResourceTypeSet()); + AuthoritativeTier.Provider authoritativeTierProvider = getAuthoritativeTierProvider(authorityResources, enhancedServiceConfigs); Set> cachingResources = new HashSet<>(resourcePools.getResourceTypeSet()); - cachingResources.remove(authorityResource); + cachingResources.removeAll(authorityResources); CachingTier.Provider cachingTierProvider = getCachingTierProvider(cachingResources, enhancedServiceConfigs); final ServiceConfiguration[] configurations = enhancedServiceConfigs.toArray(new ServiceConfiguration[enhancedServiceConfigs.size()]); - CachingTier cachingTier = cachingTierProvider.createCachingTier(storeConfig, configurations); - AuthoritativeTier authoritativeTier = authoritativeTierProvider.createAuthoritativeTier(storeConfig, configurations); + CachingTier cachingTier = cachingTierProvider.createCachingTier(cachingResources, storeConfig, configurations); + AuthoritativeTier authoritativeTier = authoritativeTierProvider.createAuthoritativeTier(authorityResources, storeConfig, configurations); TieredStore store = new TieredStore<>(cachingTier, authoritativeTier); StatisticsService statisticsService = serviceProvider.getService(StatisticsService.class); @@ -484,35 +469,17 @@ public Store createStore(Configuration storeConfig, ServiceCo } private CachingTier.Provider getCachingTierProvider(Set> cachingResources, List> enhancedServiceConfigs) { - CachingTier.Provider cachingTierProvider = null; - Collection cachingTierProviders = serviceProvider.getServicesOfType(CachingTier.Provider.class); - for (CachingTier.Provider provider : cachingTierProviders) { - if (provider.rankCachingTier(cachingResources, enhancedServiceConfigs) != 0) { - cachingTierProvider = provider; - break; - } - } + CachingTier.Provider cachingTierProvider = StoreSupport.select(CachingTier.Provider.class, serviceProvider, cachingResources, enhancedServiceConfigs); if (cachingTierProvider == null) { throw new AssertionError("No CachingTier.Provider found although ranking found one for " + cachingResources); } return cachingTierProvider; } - AuthoritativeTier.Provider getAuthoritativeTierProvider(ResourceType authorityResource, List> enhancedServiceConfigs) { - AuthoritativeTier.Provider authoritativeTierProvider = null; - Collection authorityProviders = serviceProvider.getServicesOfType(AuthoritativeTier.Provider.class); - int highestRank = 0; - for (AuthoritativeTier.Provider provider : authorityProviders) { - int rank = provider.rankAuthority(authorityResource, enhancedServiceConfigs); - if (rank != 0) { - if (highestRank < rank) { - authoritativeTierProvider = provider; - highestRank = rank; - } - } - } + AuthoritativeTier.Provider getAuthoritativeTierProvider(Set> authorityResources, List> enhancedServiceConfigs) { + AuthoritativeTier.Provider authoritativeTierProvider = StoreSupport.select(AuthoritativeTier.Provider.class, serviceProvider, authorityResources, enhancedServiceConfigs); if (authoritativeTierProvider == null) { - throw new AssertionError("No AuthoritativeTier.Provider found although ranking found one for " + authorityResource); + throw new AssertionError("No AuthoritativeTier.Provider found although ranking found one for " + authorityResources); } return authoritativeTierProvider; } diff --git a/ehcache-impl/src/test/java/org/ehcache/impl/internal/store/disk/OffHeapDiskStoreTest.java b/ehcache-impl/src/test/java/org/ehcache/impl/internal/store/disk/OffHeapDiskStoreTest.java index 01ba84eb90..b7247b98b7 100644 --- a/ehcache-impl/src/test/java/org/ehcache/impl/internal/store/disk/OffHeapDiskStoreTest.java +++ b/ehcache-impl/src/test/java/org/ehcache/impl/internal/store/disk/OffHeapDiskStoreTest.java @@ -324,8 +324,8 @@ public void testStoreInitFailsWithoutLocalPersistenceService() throws Exception @SuppressWarnings("unchecked") public void testAuthoritativeRank() throws Exception { OffHeapDiskStore.Provider provider = new OffHeapDiskStore.Provider(); - assertThat(provider.rankAuthority(ResourceType.Core.DISK, EMPTY_LIST), is(1)); - assertThat(provider.rankAuthority(new UnmatchedResourceType(), EMPTY_LIST), is(0)); + assertThat(provider.rank(singleton(ResourceType.Core.DISK), EMPTY_LIST), is(1)); + assertThat(provider.rank(singleton(new UnmatchedResourceType()), EMPTY_LIST), is(0)); } @Test diff --git a/ehcache-impl/src/test/java/org/ehcache/impl/internal/store/heap/OnHeapStoreProviderTest.java b/ehcache-impl/src/test/java/org/ehcache/impl/internal/store/heap/OnHeapStoreProviderTest.java index ebfae715fc..1c80ad4d14 100644 --- a/ehcache-impl/src/test/java/org/ehcache/impl/internal/store/heap/OnHeapStoreProviderTest.java +++ b/ehcache-impl/src/test/java/org/ehcache/impl/internal/store/heap/OnHeapStoreProviderTest.java @@ -18,21 +18,18 @@ import org.ehcache.config.ResourcePool; import org.ehcache.config.ResourceType; -import org.ehcache.core.internal.statistics.DefaultStatisticsService; -import org.ehcache.core.spi.ServiceLocator; import org.ehcache.core.spi.store.Store; import org.ehcache.impl.internal.util.UnmatchedResourceType; import org.ehcache.spi.service.ServiceConfiguration; import org.junit.Test; import java.util.Arrays; -import java.util.Collection; import java.util.Collections; import java.util.HashSet; import static java.util.Collections.EMPTY_LIST; +import static java.util.Collections.singleton; import static org.hamcrest.MatcherAssert.assertThat; -import static org.hamcrest.Matchers.hasSize; import static org.hamcrest.Matchers.is; /** @@ -80,8 +77,8 @@ public int getTierHeight() { public void testRankCachingTier() throws Exception { OnHeapStore.Provider provider = new OnHeapStore.Provider(); - assertThat(provider.rankCachingTier(Collections.>singleton(ResourceType.Core.HEAP), EMPTY_LIST), is(1)); - assertThat(provider.rankCachingTier(Collections.>singleton(new UnmatchedResourceType()), EMPTY_LIST), is(0)); + assertThat(provider.rank(singleton(ResourceType.Core.HEAP), EMPTY_LIST), is(1)); + assertThat(provider.rank(singleton(new UnmatchedResourceType()), EMPTY_LIST), is(0)); } private void assertRank(final Store.Provider provider, final int expectedRank, final ResourceType... resources) { diff --git a/ehcache-impl/src/test/java/org/ehcache/impl/internal/store/offheap/OffHeapStoreTest.java b/ehcache-impl/src/test/java/org/ehcache/impl/internal/store/offheap/OffHeapStoreTest.java index 20b2449444..198863007c 100644 --- a/ehcache-impl/src/test/java/org/ehcache/impl/internal/store/offheap/OffHeapStoreTest.java +++ b/ehcache-impl/src/test/java/org/ehcache/impl/internal/store/offheap/OffHeapStoreTest.java @@ -41,6 +41,7 @@ import java.util.HashSet; import static java.util.Collections.EMPTY_LIST; +import static java.util.Collections.singleton; import static org.ehcache.impl.internal.spi.TestServiceProvider.providerContaining; import static org.hamcrest.MatcherAssert.assertThat; import static org.hamcrest.Matchers.is; @@ -100,8 +101,8 @@ protected OffHeapValueHolderPortability createValuePortability(Serialize public void testRankAuthority() throws Exception { OffHeapStore.Provider provider = new OffHeapStore.Provider(); - assertThat(provider.rankAuthority(ResourceType.Core.OFFHEAP, EMPTY_LIST), is(1)); - assertThat(provider.rankAuthority(new UnmatchedResourceType(), EMPTY_LIST), is(0)); + assertThat(provider.rank(singleton(ResourceType.Core.OFFHEAP), EMPTY_LIST), is(1)); + assertThat(provider.rank(singleton(new UnmatchedResourceType()), EMPTY_LIST), is(0)); } @Test diff --git a/ehcache-impl/src/test/java/org/ehcache/impl/internal/store/tiering/CompoundCachingTierTest.java b/ehcache-impl/src/test/java/org/ehcache/impl/internal/store/tiering/CompoundCachingTierTest.java index 02b6061e4c..9a899bbeaa 100644 --- a/ehcache-impl/src/test/java/org/ehcache/impl/internal/store/tiering/CompoundCachingTierTest.java +++ b/ehcache-impl/src/test/java/org/ehcache/impl/internal/store/tiering/CompoundCachingTierTest.java @@ -16,10 +16,13 @@ package org.ehcache.impl.internal.store.tiering; import org.ehcache.config.ResourceType; +import org.ehcache.core.spi.ServiceLocator; import org.ehcache.core.spi.store.Store; import org.ehcache.core.spi.store.tiering.CachingTier; import org.ehcache.core.spi.store.tiering.HigherCachingTier; import org.ehcache.core.spi.store.tiering.LowerCachingTier; +import org.ehcache.impl.internal.store.heap.OnHeapStore; +import org.ehcache.impl.internal.store.offheap.OffHeapStore; import org.ehcache.impl.internal.util.UnmatchedResourceType; import org.junit.Test; import org.mockito.ArgumentCaptor; @@ -290,11 +293,21 @@ public void testInvalidateAllCoversBothTiers() throws Exception { @SuppressWarnings("unchecked") public void testRankCachingTier() throws Exception { CompoundCachingTier.Provider provider = new CompoundCachingTier.Provider(); - HashSet> resourceTypes = new HashSet<>(EnumSet.of(ResourceType.Core.HEAP, ResourceType.Core.OFFHEAP)); - assertThat(provider.rankCachingTier(resourceTypes, EMPTY_LIST), is(2)); - resourceTypes.clear(); - resourceTypes.add(new UnmatchedResourceType()); - assertThat(provider.rankCachingTier(resourceTypes, EMPTY_LIST), is(0)); + ServiceLocator serviceLocator = ServiceLocator.dependencySet() + .with(new OnHeapStore.Provider()) + .with(new OffHeapStore.Provider()) + .with(provider).build(); + serviceLocator.startAllServices(); + try { + HashSet> resourceTypes = new HashSet<>(EnumSet.of(ResourceType.Core.HEAP, ResourceType.Core.OFFHEAP)); + assertThat(provider.rank(resourceTypes, EMPTY_LIST), is(2)); + + resourceTypes.clear(); + resourceTypes.add(new UnmatchedResourceType()); + assertThat(provider.rank(resourceTypes, EMPTY_LIST), is(0)); + } finally { + serviceLocator.stopAllServices(); + } } } diff --git a/ehcache-impl/src/test/java/org/ehcache/impl/internal/store/tiering/TieredStoreSPITest.java b/ehcache-impl/src/test/java/org/ehcache/impl/internal/store/tiering/TieredStoreSPITest.java index ee7f57748c..ba9d6caf3e 100755 --- a/ehcache-impl/src/test/java/org/ehcache/impl/internal/store/tiering/TieredStoreSPITest.java +++ b/ehcache-impl/src/test/java/org/ehcache/impl/internal/store/tiering/TieredStoreSPITest.java @@ -153,7 +153,7 @@ private Store newStore(Long capacity, EvictionAdvisor tieredStore = new TieredStore<>(onHeapStore, diskStore); provider.registerStore(tieredStore, new CachingTier.Provider() { @Override - public CachingTier createCachingTier(final Store.Configuration storeConfig, final ServiceConfiguration... serviceConfigs) { + public CachingTier createCachingTier(Set> resourceTypes, final Store.Configuration storeConfig, final ServiceConfiguration... serviceConfigs) { throw new UnsupportedOperationException("Implement me!"); } @@ -168,7 +168,7 @@ public void initCachingTier(final CachingTier resource) { } @Override - public int rankCachingTier(Set> resourceTypes, Collection> serviceConfigs) { + public int rank(Set> resourceTypes, Collection> serviceConfigs) { throw new UnsupportedOperationException("Implement me!"); } @@ -183,7 +183,7 @@ public void stop() { } }, new AuthoritativeTier.Provider() { @Override - public AuthoritativeTier createAuthoritativeTier(final Store.Configuration storeConfig, final ServiceConfiguration... serviceConfigs) { + public AuthoritativeTier createAuthoritativeTier(Set> resourceTypes, final Store.Configuration storeConfig, final ServiceConfiguration... serviceConfigs) { throw new UnsupportedOperationException("Implement me!"); } @@ -198,7 +198,7 @@ public void initAuthoritativeTier(final AuthoritativeTier resource) { } @Override - public int rankAuthority(ResourceType authorityResource, Collection> serviceConfigs) { + public int rank(Set> authorityResources, Collection> serviceConfigs) { throw new UnsupportedOperationException("Implement me!"); } @@ -325,7 +325,7 @@ private ResourcePools buildResourcePools(Comparable capacityConstraint) { public static class FakeCachingTierProvider implements CachingTier.Provider { @Override @SuppressWarnings("unchecked") - public CachingTier createCachingTier(Store.Configuration storeConfig, ServiceConfiguration... serviceConfigs) { + public CachingTier createCachingTier(Set> resourceTypes, Store.Configuration storeConfig, ServiceConfiguration... serviceConfigs) { return mock(CachingTier.class); } @@ -340,7 +340,7 @@ public void initCachingTier(CachingTier resource) { } @Override - public int rankCachingTier(Set> resourceTypes, Collection> serviceConfigs) { + public int rank(Set> resourceTypes, Collection> serviceConfigs) { throw new UnsupportedOperationException(); } @@ -358,7 +358,7 @@ public void stop() { public static class FakeAuthoritativeTierProvider implements AuthoritativeTier.Provider { @Override @SuppressWarnings("unchecked") - public AuthoritativeTier createAuthoritativeTier(Store.Configuration storeConfig, ServiceConfiguration... serviceConfigs) { + public AuthoritativeTier createAuthoritativeTier(Set> resourceTypes, Store.Configuration storeConfig, ServiceConfiguration... serviceConfigs) { return mock(AuthoritativeTier.class); } @@ -373,7 +373,7 @@ public void initAuthoritativeTier(AuthoritativeTier resource) { } @Override - public int rankAuthority(ResourceType authorityResource, Collection> serviceConfigs) { + public int rank(Set> authorityResource, Collection> serviceConfigs) { throw new UnsupportedOperationException(); } diff --git a/ehcache-impl/src/test/java/org/ehcache/impl/internal/store/tiering/TieredStoreTest.java b/ehcache-impl/src/test/java/org/ehcache/impl/internal/store/tiering/TieredStoreTest.java index 26be3f3c21..619b5a9ba7 100644 --- a/ehcache-impl/src/test/java/org/ehcache/impl/internal/store/tiering/TieredStoreTest.java +++ b/ehcache-impl/src/test/java/org/ehcache/impl/internal/store/tiering/TieredStoreTest.java @@ -864,15 +864,16 @@ public void testReleaseStoreFlushes() throws Exception { .thenReturn(new HashSet<>(Arrays.asList(ResourceType.Core.HEAP, ResourceType.Core.OFFHEAP))); OnHeapStore.Provider onHeapStoreProvider = mock(OnHeapStore.Provider.class); - Set> singleton = Collections.>singleton( ResourceType.Core.HEAP); - when(onHeapStoreProvider.rankCachingTier(eq(singleton), any(Collection.class))).thenReturn(1); - when(onHeapStoreProvider.createCachingTier(any(Store.Configuration.class), + Set> cachingResources = Collections.>singleton( ResourceType.Core.HEAP); + when(onHeapStoreProvider.rank(eq(cachingResources), any(Collection.class))).thenReturn(1); + when(onHeapStoreProvider.createCachingTier(eq(cachingResources), any(Store.Configuration.class), ArgumentMatchers.any())) .thenReturn(stringCachingTier); OffHeapStore.Provider offHeapStoreProvider = mock(OffHeapStore.Provider.class); - when(offHeapStoreProvider.rankAuthority(eq(ResourceType.Core.OFFHEAP), any(Collection.class))).thenReturn(1); - when(offHeapStoreProvider.createAuthoritativeTier( + Set> authorityResources = Collections.>singleton( ResourceType.Core.OFFHEAP); + when(offHeapStoreProvider.rank(eq(authorityResources), any(Collection.class))).thenReturn(1); + when(offHeapStoreProvider.createAuthoritativeTier(eq(authorityResources), any(Store.Configuration.class), ArgumentMatchers.any())) .thenReturn(stringAuthoritativeTier); @@ -940,14 +941,14 @@ public void testGetAuthoritativeTierProvider() { provider.start(serviceProvider); AuthoritativeTier.Provider provider1 = mock(AuthoritativeTier.Provider.class); - when(provider1.rankAuthority(any(ResourceType.class), any())).thenReturn(1); + when(provider1.rank(any(Set.class), any())).thenReturn(1); AuthoritativeTier.Provider provider2 = mock(AuthoritativeTier.Provider.class); - when(provider2.rankAuthority(any(ResourceType.class), any())).thenReturn(2); + when(provider2.rank(any(Set.class), any())).thenReturn(2); when(serviceProvider.getServicesOfType(AuthoritativeTier.Provider.class)).thenReturn(Arrays.asList(provider1, provider2)); - assertSame(provider.getAuthoritativeTierProvider(mock(ResourceType.class), Collections.emptyList()), provider2); + assertSame(provider.getAuthoritativeTierProvider(mock(Set.class), Collections.emptyList()), provider2); } private void assertRank(final Store.Provider provider, final int expectedRank, final ResourceType... resources) { diff --git a/ehcache-impl/src/test/java/org/ehcache/impl/internal/store/tiering/TieredStoreWith3TiersSPITest.java b/ehcache-impl/src/test/java/org/ehcache/impl/internal/store/tiering/TieredStoreWith3TiersSPITest.java index 8e06d8b3d4..2f2fab98a5 100755 --- a/ehcache-impl/src/test/java/org/ehcache/impl/internal/store/tiering/TieredStoreWith3TiersSPITest.java +++ b/ehcache-impl/src/test/java/org/ehcache/impl/internal/store/tiering/TieredStoreWith3TiersSPITest.java @@ -166,7 +166,7 @@ private Store newStore(Long capacity, EvictionAdvisor CachingTier createCachingTier(final Store.Configuration storeConfig, final ServiceConfiguration... serviceConfigs) { + public CachingTier createCachingTier(Set> resourceTypes, final Store.Configuration storeConfig, final ServiceConfiguration... serviceConfigs) { throw new UnsupportedOperationException("Implement me!"); } @@ -183,7 +183,7 @@ public void initCachingTier(final CachingTier resource) { } @Override - public int rankCachingTier(Set> resourceTypes, Collection> serviceConfigs) { + public int rank(Set> resourceTypes, Collection> serviceConfigs) { throw new UnsupportedOperationException("Implement me!"); } @@ -198,7 +198,7 @@ public void stop() { } }, new AuthoritativeTier.Provider() { @Override - public AuthoritativeTier createAuthoritativeTier(final Store.Configuration storeConfig, final ServiceConfiguration... serviceConfigs) { + public AuthoritativeTier createAuthoritativeTier(Set> resourceTypes, final Store.Configuration storeConfig, final ServiceConfiguration... serviceConfigs) { throw new UnsupportedOperationException("Implement me!"); } @@ -213,7 +213,7 @@ public void initAuthoritativeTier(final AuthoritativeTier resource) { } @Override - public int rankAuthority(ResourceType authorityResource, Collection> serviceConfigs) { + public int rank(Set> authorityResources, Collection> serviceConfigs) { throw new UnsupportedOperationException("Implement me!"); } @@ -351,7 +351,7 @@ private ResourcePools buildResourcePools(Long capacityConstraint) { public static class FakeCachingTierProvider implements CachingTier.Provider { @Override @SuppressWarnings("unchecked") - public CachingTier createCachingTier(Store.Configuration storeConfig, ServiceConfiguration... serviceConfigs) { + public CachingTier createCachingTier(Set> resourceTypes, Store.Configuration storeConfig, ServiceConfiguration... serviceConfigs) { return mock(CachingTier.class); } @@ -366,7 +366,7 @@ public void initCachingTier(CachingTier resource) { } @Override - public int rankCachingTier(Set> resourceTypes, Collection> serviceConfigs) { + public int rank(Set> resourceTypes, Collection> serviceConfigs) { throw new UnsupportedOperationException(); } @@ -384,7 +384,7 @@ public void stop() { public static class FakeAuthoritativeTierProvider implements AuthoritativeTier.Provider { @Override @SuppressWarnings("unchecked") - public AuthoritativeTier createAuthoritativeTier(Store.Configuration storeConfig, ServiceConfiguration... serviceConfigs) { + public AuthoritativeTier createAuthoritativeTier(Set> resourceTypes, Store.Configuration storeConfig, ServiceConfiguration... serviceConfigs) { return mock(AuthoritativeTier.class); } @@ -399,7 +399,7 @@ public void initAuthoritativeTier(AuthoritativeTier resource) { } @Override - public int rankAuthority(ResourceType authorityResource, Collection> serviceConfigs) { + public int rank(Set> authorityResources, Collection> serviceConfigs) { throw new UnsupportedOperationException(); } diff --git a/ehcache-transactions/src/jakarta/java/org/ehcache/transactions/xa/internal/XAStore.java b/ehcache-transactions/src/jakarta/java/org/ehcache/transactions/xa/internal/XAStore.java index ae145f9592..d8fd383d6f 100644 --- a/ehcache-transactions/src/jakarta/java/org/ehcache/transactions/xa/internal/XAStore.java +++ b/ehcache-transactions/src/jakarta/java/org/ehcache/transactions/xa/internal/XAStore.java @@ -768,11 +768,6 @@ public static class Provider implements WrapperStore.Provider { private volatile TransactionManagerProvider transactionManagerProvider; private final Map, CreatedStoreRef> createdStores = new ConcurrentWeakIdentityHashMap<>(); - @Override - public int rank(final Set> resourceTypes, final Collection> serviceConfigs) { - throw new UnsupportedOperationException("Its a Wrapper store provider, does not support regular ranking"); - } - @Override public Store createStore(Configuration storeConfig, ServiceConfiguration... serviceConfigs) { Set supportedTypes = EnumSet.allOf(ResourceType.Core.class); @@ -792,7 +787,7 @@ public Store createStore(Configuration storeConfig, ServiceCo List> serviceConfigList = Arrays.asList(serviceConfigs); - Store.Provider underlyingStoreProvider = StoreSupport.selectStoreProvider(serviceProvider, + Store.Provider underlyingStoreProvider = StoreSupport.select(Store.Provider.class, serviceProvider, storeConfig.getResourcePools().getResourceTypeSet(), serviceConfigList); String uniqueXAResourceId = xaServiceConfiguration.getUniqueXAResourceId(); diff --git a/ehcache-transactions/src/main/java/org/ehcache/transactions/xa/internal/XAStore.java b/ehcache-transactions/src/main/java/org/ehcache/transactions/xa/internal/XAStore.java index 21dd1acd09..8e4d165362 100644 --- a/ehcache-transactions/src/main/java/org/ehcache/transactions/xa/internal/XAStore.java +++ b/ehcache-transactions/src/main/java/org/ehcache/transactions/xa/internal/XAStore.java @@ -769,11 +769,6 @@ public static class Provider implements WrapperStore.Provider { private volatile TransactionManagerProvider transactionManagerProvider; private final Map, CreatedStoreRef> createdStores = new ConcurrentWeakIdentityHashMap<>(); - @Override - public int rank(final Set> resourceTypes, final Collection> serviceConfigs) { - throw new UnsupportedOperationException("Its a Wrapper store provider, does not support regular ranking"); - } - @Override public Store createStore(Configuration storeConfig, ServiceConfiguration... serviceConfigs) { Set supportedTypes = EnumSet.allOf(ResourceType.Core.class); @@ -793,7 +788,7 @@ public Store createStore(Configuration storeConfig, ServiceCo List> serviceConfigList = Arrays.asList(serviceConfigs); - Store.Provider underlyingStoreProvider = StoreSupport.selectStoreProvider(serviceProvider, + Store.Provider underlyingStoreProvider = StoreSupport.select(Store.Provider.class, serviceProvider, storeConfig.getResourcePools().getResourceTypeSet(), serviceConfigList); String uniqueXAResourceId = xaServiceConfiguration.getUniqueXAResourceId();