/* * Copyright (C) 2000 - 2013 TagServlet Ltd * * This file is part of Open BlueDragon (OpenBD) CFML Server Engine. * * OpenBD is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * Free Software Foundation,version 3. * * OpenBD 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 General Public License for more details. * * You should have received a copy of the GNU General Public License * along with OpenBD. If not, see http://www.gnu.org/licenses/ * * Additional permission under GNU GPL version 3 section 7 * * If you modify this Program, or any covered work, by linking or combining * it with any of the JARS listed in the README.txt (or a modified version of * (that library), containing parts covered by the terms of that JAR, the * licensors of this Program grant you additional permission to convey the * resulting work. * README.txt @ http://www.openbluedragon.org/license/README.txt * * http://openbd.org/ * * $Id: DocumentWrap.java 2404 2013-09-22 21:51:40Z alan $ */ package com.bluedragon.search; import java.io.File; import org.apache.lucene.document.Document; import org.apache.lucene.document.Field; import org.apache.lucene.document.IntField; import org.apache.lucene.document.StoredField; import org.apache.lucene.document.StringField; import org.apache.lucene.document.TextField; /** * This is a loose wrapper to the lucene document. Its primary purpose is to ensure all the keys * that CFML requires are consistent. This class stores very little data, with all the real field * data being stored in the actual Lucene document. * * This controls which fields are we are passing through the analyzer and also which ones we are storing in full * */ public class DocumentWrap { public static final String ID = "id"; public static final String URL = "url"; public static final String CONTENTS = "contents"; public static final String SUMMARY = "summary"; public static final String NAME = "name"; public static final String AUTHOR = "author"; public static final String TYPE = "type"; public static final String SIZE = "size"; public static final String CATEGORY = "category"; public static final String CATEGORYTREE = "categorytree"; private Document doc = null; private float score = 0f; /** * Used for create new documents for inserting into an index. The lucene document is created * to be used with the setXXX() methods for setting the various fields */ public DocumentWrap(){ doc = new Document(); } /** * Used when retrieving results from a search * @param doc * @throws Exception */ public DocumentWrap(Document doc) throws Exception { this.doc = doc; checkValidity(); } /** * Makes sure the minimum set of keys are set for this document. used in both indexing and the creation of documents * @throws Exception */ public void checkValidity() throws Exception { if (doc.getField(ID) == null) throw new Exception("Invalid Document, missing " + ID + " field."); } /** * Returns the underlying Lucene document * @return */ public Document getDocument(){ return doc; } public String getId() { return get(ID); } public void setId( String id ){ id = id.replace(File.separatorChar, '/'); doc.add( new StringField( ID, id, Field.Store.YES) ); } public String getAuthor(){ return get(AUTHOR); } public void setAuthor( String author ){ if ( author != null && author.length() > 0 ) doc.add( new StringField( AUTHOR, author, Field.Store.YES) ); } public String getType(){ return get(TYPE); } public void setType( String type ){ if ( type != null ) doc.add( new StringField( TYPE, type, Field.Store.YES) ); } public String getSize() { return get(SIZE); } public void setSize( int size ){ if ( size > 0 ) doc.add( new IntField( SIZE, size, Field.Store.YES) ); } public String getURL() { return get(URL); } public void setURL( String url ){ if ( url != null ) doc.add( new StringField( URL, url, Field.Store.YES ) ); } public void deleteField( String name ){ doc.removeField(name); } public String getName(){ return get(NAME); } public void setName( String name ){ if ( name != null && name.length() > 0 ) doc.add( new StringField( NAME, name, Field.Store.YES) ); } public String getSummary() { return get(SUMMARY); } public void setSummary( String summary ){ if ( summary == null || summary.length() > 0 ) return; int summaryLen = ( summary.length() >= 256 ? 256 : summary.length() ); doc.add( new StoredField( SUMMARY, summary.substring(0,summaryLen) ) ); } public String getCategoryTree(){ return get(CATEGORYTREE); } public void setCategoryTree( String categorytree ){ if ( categorytree != null ) doc.add( new TextField( CATEGORYTREE, categorytree, Field.Store.YES) ); } public String[] getCategories(){ return doc.getValues(CATEGORY); } public void setCategories( String[] categories ){ for ( int x=0; x < categories.length; x++ ){ if ( categories[x].trim().length() > 0 ) doc.add( new TextField( CATEGORY, categories[x].trim(), Field.Store.YES) ); } } public String getAttribute(String attribName){ return get(attribName); } public void setAttribute( String name, String value ){ if ( value != null && value.trim().length() > 0 ) doc.add( new TextField( name.toLowerCase(), value.trim(), Field.Store.YES) ); } public void setContent( String value, boolean bStored ){ doc.add( new TextField( CONTENTS, value, bStored ? Field.Store.YES : Field.Store.NO) ); } protected String get(String key) { String rtn = null; if (doc != null) rtn = doc.get(key); return rtn; } public float getScore() { return score; } public void setScore(float score) { this.score = score; } }