/* * Copyright (C) 2014 Indeed 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 com.indeed.imhotep.service; import com.indeed.util.core.io.Closeables2; import com.indeed.util.core.reference.SharedReference; import com.indeed.flamdex.api.DocIdStream; import com.indeed.flamdex.api.FlamdexOutOfMemoryException; import com.indeed.flamdex.api.FlamdexReader; import com.indeed.flamdex.api.IntTermDocIterator; import com.indeed.flamdex.api.IntTermIterator; import com.indeed.flamdex.api.IntValueLookup; import com.indeed.flamdex.api.StringTermDocIterator; import com.indeed.flamdex.api.StringTermIterator; import com.indeed.flamdex.api.StringValueLookup; import com.indeed.imhotep.ImhotepStatusDump; import org.apache.log4j.Logger; import java.util.Collection; import java.util.List; import java.util.Set; /** * @author jplaisance */ public class CachedFlamdexReaderReference implements FlamdexReader, MetricCache { private static final Logger log = Logger.getLogger(CachedFlamdexReaderReference.class); private final SharedReference<? extends CachedFlamdexReader> reference; private final CachedFlamdexReader reader; private boolean closed = false; private final Exception constructorStackTrace; public CachedFlamdexReaderReference(final SharedReference<? extends CachedFlamdexReader> reference) { constructorStackTrace = new Exception(); this.reference = reference; this.reader = reference.get(); } @Override public Collection<String> getIntFields() { return reader.getIntFields(); } @Override public Collection<String> getStringFields() { return reader.getStringFields(); } @Override public int getNumDocs() { return reader.getNumDocs(); } @Override public String getDirectory() { return reader.getDirectory(); } @Override public DocIdStream getDocIdStream() { return reader.getDocIdStream(); } @Override public IntTermIterator getIntTermIterator(final String field) { return reader.getIntTermIterator(field); } @Override public StringTermIterator getStringTermIterator(final String field) { return reader.getStringTermIterator(field); } @Override public IntTermDocIterator getIntTermDocIterator(final String field) { return reader.getIntTermDocIterator(field); } @Override public StringTermDocIterator getStringTermDocIterator(final String field) { return reader.getStringTermDocIterator(field); } @Override public long getIntTotalDocFreq(final String field) { return reader.getIntTotalDocFreq(field); } @Override public long getStringTotalDocFreq(final String field) { return reader.getStringTotalDocFreq(field); } @Override public Collection<String> getAvailableMetrics() { return reader.getAvailableMetrics(); } @Override public IntValueLookup getMetric(final String metric) throws FlamdexOutOfMemoryException { return reader.getMetric(metric); } public StringValueLookup getStringLookup(final String field) throws FlamdexOutOfMemoryException { return reader.getStringLookup(field); } @Override public long memoryRequired(final String metric) { return reader.memoryRequired(metric); } @Override public List<ImhotepStatusDump.MetricDump> getMetricDump() { return reader.getMetricDump(); } @Override public Set<String> getLoadedMetrics() { return reader.getLoadedMetrics(); } @Override public void close() { if (!closed) { closed = true; Closeables2.closeQuietly(reference, log); } } protected void finalize() throws Throwable { if (!closed) { log.error(getClass().getSimpleName()+" was not closed!!!!! stack trace at construction:", constructorStackTrace); close(); } } }