/* * Hibernate Search, full-text search for your domain model * * License: GNU Lesser General Public License (LGPL), version 2.1 or later * See the lgpl.txt file in the root directory or <http://www.gnu.org/licenses/lgpl-2.1.html>. */ package org.hibernate.search.store; import java.io.Serializable; import java.util.Collections; import java.util.HashSet; import java.util.Properties; import java.util.Set; import org.hibernate.search.filter.FullTextFilterImplementor; import org.hibernate.search.spi.BuildContext; /** * Recommended parent class to create custom {@link ShardIdentifierProvider} implementations. Sub-classes must provide a * no-arg constructor. * * @hsearch.experimental The exact method signatures are likely to change in future. * * @author Sanne Grinovero */ public abstract class ShardIdentifierProviderTemplate implements ShardIdentifierProvider { private volatile Set<String> knownShards = Collections.emptySet(); @Override public final void initialize(Properties properties, BuildContext buildContext) { Set<String> initialShardNames = loadInitialShardNames( properties, buildContext ); knownShards = Collections.unmodifiableSet( new HashSet<String>( initialShardNames ) ); } protected abstract Set<String> loadInitialShardNames(Properties properties, BuildContext buildContext); protected final void addShard(final String shardName) { if ( ! knownShards.contains( shardName ) ) { addShardSynchronized( shardName ); } } private synchronized void addShardSynchronized(final String shardName) { HashSet<String> newCopy = new HashSet<String>( knownShards ); newCopy.add( shardName ); knownShards = Collections.unmodifiableSet( newCopy ); } @Override public final Set<String> getAllShardIdentifiers() { return knownShards; } /** * Potentially suited to be overridden if you are able to narrow down the shard * selection based on the active FullTextFilters. */ @Override public Set<String> getShardIdentifiersForQuery(FullTextFilterImplementor[] fullTextFilters) { return getAllShardIdentifiers(); } /** * Override this method if the mapping to a specific shard can be inferred just from the pair (id, type). * The default implementation will perform delete and purge operations on all known indexes. */ @Override public Set<String> getShardIdentifiersForDeletion(Class<?> entity, Serializable id, String idInString) { return getAllShardIdentifiers(); } }