/* * 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.exoplatform.services.jcr.impl.core.query.lucene; import org.apache.lucene.analysis.TokenStream; import org.apache.lucene.document.AbstractField; import org.apache.lucene.document.Field; import org.slf4j.Logger; import org.slf4j.LoggerFactory; import java.io.IOException; import java.io.Reader; public class TextFieldExtractor extends AbstractField { /** * The serial version UID. */ private static final long serialVersionUID = -2707986404659820071L; /** * The logger instance for this class. */ private static final Logger log = LoggerFactory.getLogger("exo.jcr.component.core.TextFieldExtractor"); /** * The reader from where to read the text extract. */ private final Reader reader; /** * The extract as obtained lazily from {@link #reader}. */ volatile private String extract; /** * Creates a new <code>TextFieldExtractor</code> with the given * <code>name</code>. * * @param name the name of the field. * @param reader the reader where to obtain the string from. * @param store when set <code>true</code> the string value is stored in the * index. * @param withOffsets when set <code>true</code> a term vector with offsets * is written into the index. */ public TextFieldExtractor(String name, Reader reader, boolean store, boolean withOffsets) { super(name, store ? Field.Store.YES : Field.Store.NO, Field.Index.ANALYZED, withOffsets ? Field.TermVector.WITH_OFFSETS : Field.TermVector.NO); this.reader = reader; } /** * @return the string value of this field. */ public String stringValue() { if (extract == null) { synchronized (this) { if (extract == null) { StringBuilder textExtract = new StringBuilder(); char[] buffer = new char[1024]; int len; try { while ((len = reader.read(buffer)) > -1) { textExtract.append(buffer, 0, len); } } catch (IOException e) { log.warn("Exception reading value for field: " + e.getMessage()); log.debug("Dump:", e); } finally { try { reader.close(); } catch (IOException e) { log.error(e.getLocalizedMessage(), e); } } extract = textExtract.toString(); } } } return extract; } /** * @return always <code>null</code>. */ public Reader readerValue() { return null; } /** * @return always <code>null</code>. */ public byte[] binaryValue() { return null; } /** * @return always <code>null</code>. */ public TokenStream tokenStreamValue() { return null; } /** * Disposes this field and closes the underlying reader. * * @throws IOException if an error occurs while closing the reader. */ public void dispose() throws IOException { reader.close(); } }