blob: 22d8d7c24cab9ecafe8bb8d61dc8476dfdb1ef59 [file] [log] [blame]
/*
* Licensed to the Apache Software Foundation (ASF) under one or more
* contributor license agreements. 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. For additional information regarding
* copyright in this work, please see the NOTICE file in the top level
* directory of this distribution.
*/
/* Created on Jul 16, 2003 */
package org.apache.roller.weblogger.business.search.operations;
import java.io.IOException;
import java.util.List;
import org.apache.commons.logging.Log;
import org.apache.commons.logging.LogFactory;
import org.apache.lucene.analysis.miscellaneous.LimitTokenCountAnalyzer;
import org.apache.lucene.document.Document;
import org.apache.lucene.document.Field;
import org.apache.lucene.document.SortedDocValuesField;
import org.apache.lucene.document.StringField;
import org.apache.lucene.document.TextField;
import org.apache.lucene.index.IndexWriter;
import org.apache.lucene.index.IndexWriterConfig;
import org.apache.lucene.util.BytesRef;
import org.apache.roller.weblogger.business.search.FieldConstants;
import org.apache.roller.weblogger.business.search.IndexManagerImpl;
import org.apache.roller.weblogger.config.WebloggerConfig;
import org.apache.roller.weblogger.pojos.WeblogCategory;
import org.apache.roller.weblogger.pojos.WeblogEntry;
import org.apache.roller.weblogger.pojos.WeblogEntryComment;
/**
* This is the base class for all index operation. These operations include:<br>
* SearchOperation<br>
* AddWeblogOperation<br>
* RemoveWeblogOperation<br>
* RebuildUserIndexOperation
*
* @author Mindaugas Idzelis (min@idzelis.com)
*/
public abstract class IndexOperation implements Runnable {
private static Log mLogger = LogFactory.getFactory().getInstance(
IndexOperation.class);
// ~ Instance fields
// ========================================================
protected IndexManagerImpl manager;
private IndexWriter writer;
// ~ Constructors
// ===========================================================
public IndexOperation(IndexManagerImpl manager) {
this.manager = manager;
}
// ~ Methods
// ================================================================
protected Document getDocument(WeblogEntry data) {
// Actual comment content is indexed only if search.index.comments
// is true or absent from the (static) configuration properties.
// If false in the configuration, comments are treated as if empty.
boolean indexComments = WebloggerConfig.getBooleanProperty(
"search.index.comments", true);
String commentContent = "";
String commentEmail = "";
String commentName = "";
if (indexComments) {
List<WeblogEntryComment> comments = data.getComments();
if (comments != null) {
StringBuilder commentEmailBld = new StringBuilder();
StringBuilder commentContentBld = new StringBuilder();
StringBuilder commentNameBld = new StringBuilder();
for (WeblogEntryComment comment : comments) {
if (comment.getContent() != null) {
commentContentBld.append(comment.getContent());
commentContentBld.append(",");
}
if (comment.getEmail() != null) {
commentEmailBld.append(comment.getEmail());
commentEmailBld.append(",");
}
if (comment.getName() != null) {
commentNameBld.append(comment.getName());
commentNameBld.append(",");
}
}
commentEmail = commentEmailBld.toString();
commentContent = commentContentBld.toString();
commentName = commentNameBld.toString();
}
}
Document doc = new Document();
// keyword
doc.add(new StringField(FieldConstants.ID, data.getId(),
Field.Store.YES));
// keyword
doc.add(new StringField(FieldConstants.WEBSITE_HANDLE, data
.getWebsite().getHandle(), Field.Store.YES));
// text, don't index deleted/disabled users of a group blog
if (data.getCreator() != null) {
doc.add(new TextField(FieldConstants.USERNAME, data.getCreator()
.getUserName().toLowerCase(), Field.Store.YES));
}
// text
doc.add(new TextField(FieldConstants.TITLE, data.getTitle(),
Field.Store.YES));
// keyword needs to be in lower case as we are used in a term
doc.add(new StringField(FieldConstants.LOCALE, data.getLocale()
.toLowerCase(), Field.Store.YES));
// index the entry text, but don't store it
doc.add(new TextField(FieldConstants.CONTENT, data.getText(),
Field.Store.NO));
// keyword
doc.add(new StringField(FieldConstants.UPDATED, data.getUpdateTime()
.toString(), Field.Store.YES));
// keyword
if (data.getPubTime() != null) {
// SearchOperation sorts results by date
doc.add(new SortedDocValuesField(FieldConstants.PUBLISHED, new BytesRef(data.getPubTime().toString())));
}
// index Category, needs to be in lower case as it is used in a term
WeblogCategory categorydata = data.getCategory();
if (categorydata != null) {
doc.add(new StringField(FieldConstants.CATEGORY, categorydata
.getName().toLowerCase(), Field.Store.YES));
}
// index Comments, unstored
doc.add(new TextField(FieldConstants.C_CONTENT, commentContent,
Field.Store.NO));
// keyword
doc.add(new StringField(FieldConstants.C_EMAIL, commentEmail,
Field.Store.YES));
// keyword
doc.add(new StringField(FieldConstants.C_NAME, commentName,
Field.Store.YES));
return doc;
}
/**
* Begin writing.
*
* @return the index writer
*/
protected IndexWriter beginWriting() {
try {
LimitTokenCountAnalyzer analyzer = new LimitTokenCountAnalyzer(
IndexManagerImpl.getAnalyzer(),
WebloggerConfig.getIntProperty("lucene.analyzer.maxTokenCount"));
IndexWriterConfig config = new IndexWriterConfig(analyzer);
writer = new IndexWriter(manager.getIndexDirectory(), config);
} catch (IOException e) {
mLogger.error("ERROR creating writer", e);
}
return writer;
}
/**
* End writing.
*/
protected void endWriting() {
if (writer != null) {
try {
writer.close();
} catch (IOException e) {
mLogger.error("ERROR closing writer", e);
}
}
}
/**
* @see java.lang.Runnable#run()
*/
@Override
public void run() {
doRun();
}
protected abstract void doRun();
}