Java tutorial
/* * Hibernate, Relational Persistence for Idiomatic Java * * Copyright (c) 2010, Red Hat, Inc. and/or its affiliates or third-party contributors as * indicated by the @author tags or express copyright attribution * statements applied by the authors. All third-party contributions are * distributed under license by Red Hat, Inc. * * This copyrighted material is made available to anyone wishing to use, modify, * copy, or redistribute it subject to the terms and conditions of the GNU * Lesser General Public License, as published by the Free Software Foundation. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY * or FITNESS FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public License * for more details. * * You should have received a copy of the GNU Lesser General Public License * along with this distribution; if not, write to: * Free Software Foundation, Inc. * 51 Franklin Street, Fifth Floor * Boston, MA 02110-1301 USA */ package org.hibernate.search.reader.impl; import org.apache.lucene.index.IndexReader; import org.apache.lucene.index.MultiReader; import org.hibernate.search.SearchException; import org.hibernate.search.indexes.spi.ReaderProvider; /** * MultiReader ensuring equals returns true if the underlying readers are the same (and in the same order) * Especially useful when using {@link org.apache.lucene.search.CachingWrapperFilter} * * @author Emmanuel Bernard * @author Sanne Grinovero <sanne@hibernate.org> (C) 2011 Red Hat Inc. */ public class CacheableMultiReader extends MultiReader { // This is package private as the intention of the Lucene team seems to be to not // expose this publically (it's a protected member in Lucene 2.3) final IndexReader[] subReaders; final ReaderProvider[] managers; public CacheableMultiReader(IndexReader[] subReaders, ReaderProvider[] managers) { // don't allow sub readers to be closed: super(subReaders, false); this.subReaders = subReaders; this.managers = managers; } @Override public final void decRef() { avoidUsingThis(); } @Override public final synchronized IndexReader reopen() { avoidUsingThis(); return null; //never reached, make compiler happy } @Override public final void incRef() { avoidUsingThis(); } @Override public boolean equals(Object obj) { // Equality only checks for subReaders as an equal sub-IndexReader is certainly coming from the same ReaderProvider. if (this == obj) return true; if (!(obj instanceof CacheableMultiReader)) return false; CacheableMultiReader that = (CacheableMultiReader) obj; int length = this.subReaders.length; if (length != that.subReaders.length) return false; for (int index = 0; index < length; index++) { if (!this.subReaders[index].equals(that.subReaders[index])) return false; } return true; } @Override public int hashCode() { int result = 0; for (Object reader : this.subReaders) { result = 31 * result + reader.hashCode(); } return result; } private void avoidUsingThis() { throw new SearchException("IndexReader lifecycle should not be managed, please use " + "org.hibernate.search.SearchFactory.closeIndexReader(IndexReader) to close IndexReader instances or pool them."); } }