com.jaeksoft.searchlib.schema.SchemaField.java Source code

Java tutorial

Introduction

Here is the source code for com.jaeksoft.searchlib.schema.SchemaField.java

Source

/**   
 * License Agreement for OpenSearchServer
 *
 * Copyright (C) 2008-2013 Emmanuel Keller / Jaeksoft
 * 
 * http://www.open-search-server.com
 * 
 * This file is part of OpenSearchServer.
 *
 * OpenSearchServer is free software: you can redistribute it and/or
 * modify it under the terms of the GNU General Public License as published by
 * the Free Software Foundation, either version 3 of the License, or
 *  (at your option) any later version.
 *
 * OpenSearchServer 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 OpenSearchServer. 
 *  If not, see <http://www.gnu.org/licenses/>.
 **/

package com.jaeksoft.searchlib.schema;

import java.io.IOException;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.List;

import javax.xml.xpath.XPathExpressionException;

import org.apache.commons.collections.CollectionUtils;
import org.apache.commons.lang3.StringUtils;
import org.w3c.dom.DOMException;
import org.w3c.dom.Node;
import org.w3c.dom.NodeList;
import org.xml.sax.SAXException;

import com.jaeksoft.searchlib.SearchLibException;
import com.jaeksoft.searchlib.util.DomUtils;
import com.jaeksoft.searchlib.util.XPathParser;
import com.jaeksoft.searchlib.util.XmlWriter;
import com.jaeksoft.searchlib.web.servlet.restv1.ServletTransaction;

public class SchemaField extends AbstractField<SchemaField> {

    /**
     * 
     */
    private static final long serialVersionUID = -2134622919973613819L;

    private String indexAnalyzer;

    private List<String> copyOf;

    private Stored stored;

    private Indexed indexed;

    private TermVector termVector;

    public SchemaField() {
        super("");
        indexAnalyzer = null;
        stored = Stored.NO;
        indexed = Indexed.YES;
        termVector = TermVector.NO;
        copyOf = null;
    }

    public SchemaField(String name, Stored stored, Indexed indexed, TermVector termVector, String analyzer,
            String... copyOf) {
        super(name);
        this.indexAnalyzer = analyzer == null ? null : analyzer.intern();
        this.stored = stored;
        this.indexed = indexed;
        this.termVector = termVector;
        this.copyOf = copyOf != null && copyOf.length > 0 ? Arrays.asList(copyOf) : null;
    }

    public SchemaField(SchemaField field) {
        super();
        copyFrom(field);
    }

    @Override
    public void copyFrom(SchemaField sourceField) {
        super.copyFrom(sourceField);
        SchemaField sc = (SchemaField) sourceField;
        this.stored = sc.stored;
        this.indexed = sc.indexed;
        this.termVector = sc.termVector;
        this.indexAnalyzer = sc.indexAnalyzer;
        this.copyOf = sc.copyOf != null && sc.copyOf.size() > 0 ? new ArrayList<String>(sc.copyOf) : null;
    }

    private SchemaField(String name, String stored, String indexed, String termVector, String indexAnalyzer) {
        this(name, Stored.fromValue(stored), Indexed.fromValue(indexed), TermVector.fromValue(termVector),
                indexAnalyzer);
    }

    private SchemaField(String name, String stored, String indexed, String termVector, String indexAnalyzer,
            String... copyOf) {
        this(name, stored, indexed, termVector, indexAnalyzer);
        this.copyOf = copyOf != null && copyOf.length > 0 ? Arrays.asList(copyOf) : null;
    }

    private SchemaField(String name, String stored, String indexed, String termVector, String indexAnalyzer,
            List<String> copyOf) {
        this(name, stored, indexed, termVector, indexAnalyzer);
        this.copyOf = copyOf != null && copyOf.size() > 0 ? new ArrayList<String>(copyOf) : null;
    }

    final public org.apache.lucene.document.Field getLuceneField(String value, Float boost) {
        try {
            org.apache.lucene.document.Field field = new org.apache.lucene.document.Field(name, value,
                    stored.luceneStore, indexed.getLuceneIndex(indexAnalyzer), termVector.luceneTermVector);
            if (boost != null)
                field.setBoost(boost);
            return field;
        } catch (java.lang.NullPointerException e) {
            throw new NullPointerException("Error on field " + name);
        }
    }

    @Override
    public SchemaField duplicate() {
        return new SchemaField(this);
    }

    @Override
    public String toString() {
        return this.getClass().getName() + "/" + this.name + "/";
    }

    public boolean checkStored(Stored... storedList) {
        for (Stored st : storedList)
            if (stored == st)
                return true;
        return false;
    }

    public boolean checkIndexed(Indexed... indexedList) {
        for (Indexed idx : indexedList)
            if (indexed == idx)
                return true;
        return false;
    }

    public Stored getStored() {
        return stored;
    }

    public void setStored(Stored stored) {
        this.stored = stored;
    }

    public Indexed getIndexed() {
        return indexed;
    }

    public void setIndexed(Indexed indexed) {
        this.indexed = indexed;
    }

    public TermVector getTermVector() {
        return termVector;
    }

    public void setTermVector(TermVector termVector) {
        this.termVector = termVector;
    }

    public String getIndexAnalyzer() {
        return indexAnalyzer;
    }

    public void setIndexAnalyzer(String indexAnalyzer) {
        this.indexAnalyzer = StringUtils.isEmpty(indexAnalyzer) ? null : indexAnalyzer.intern();
    }

    /**
     * Construit une liste de champs bas sur le fichier de config XML
     * 
     * @param analyzers
     * @param document
     * @param xPath
     * @throws XPathExpressionException
     * @throws XPathExpressionException
     * @throws DOMException
     * @throws IOException
     */
    public static SchemaFieldList fromXmlConfig(XPathParser xpp, Node parentNode) throws XPathExpressionException {
        SchemaFieldList fieldList = new SchemaFieldList();
        if (parentNode == null)
            return fieldList;
        NodeList nodes = xpp.getNodeList(parentNode, "field");
        if (nodes == null)
            return fieldList;
        for (int i = 0; i < nodes.getLength(); i++) {
            Node node = nodes.item(i);
            String name = XPathParser.getAttributeString(node, "name");
            String indexAnalyzer = XPathParser.getAttributeString(node, "analyzer");
            String stored = XPathParser.getAttributeString(node, "stored");
            String indexed = XPathParser.getAttributeString(node, "indexed");
            String termVector = XPathParser.getAttributeString(node, "termVector");
            List<String> copyOfList = null;
            List<Node> nodeList = DomUtils.getNodes(node, "copyOf");
            if (nodeList != null) {
                copyOfList = new ArrayList<String>(nodeList.size());
                for (Node no : nodeList)
                    copyOfList.add(DomUtils.getAttributeText(no, "field"));
            }
            fieldList.put(new SchemaField(name, stored, indexed, termVector, indexAnalyzer, copyOfList));
        }
        fieldList.setDefaultField(XPathParser.getAttributeString(parentNode, "default"));
        fieldList.setUniqueField(XPathParser.getAttributeString(parentNode, "unique"));
        return fieldList;
    }

    /**
     * @return the copyOf
     */
    public List<String> getCopyOf() {
        return copyOf;
    }

    public void addCopyOf(String field) {
        if (field == null)
            return;
        if (field.length() == 0)
            return;
        if (copyOf == null)
            copyOf = new ArrayList<String>(1);
        copyOf.add(field);
    }

    public void removeCopyOf(String field) {
        if (copyOf == null)
            return;
        copyOf.remove(field);
        if (copyOf.size() == 0)
            copyOf = null;
    }

    /**
     * @param copyOf
     *            the copyOf to set
     */
    public void setCopyOf(List<String> copyOf) {
        if (CollectionUtils.isEmpty(copyOf)) {
            this.copyOf = null;
        } else {
            this.copyOf = new ArrayList<String>(copyOf.size());
            for (String cf : copyOf)
                this.copyOf.add(cf.intern());
            setStored(Stored.NO);
        }
    }

    public static SchemaField fromHttpRequest(ServletTransaction transaction) throws SearchLibException {
        String name = transaction.getParameterString("field.name");
        if (name == null)
            throw new SearchLibException("No field name");
        String indexAnalyzer = transaction.getParameterString("field.analyzer");
        String stored = transaction.getParameterString("field.stored");
        String indexed = transaction.getParameterString("field.indexed");
        String termVector = transaction.getParameterString("field.termVector");
        String[] copyOf = transaction.getParameterValues("field.copyOf");
        return new SchemaField(name, stored, indexed, termVector, indexAnalyzer, copyOf);
    }

    @Override
    public void writeXmlConfig(XmlWriter writer) throws SAXException {
        writer.startElement("field", "name", name, "analyzer", indexAnalyzer, "indexed", getIndexed().getValue(),
                "stored", getStored().getValue(), "termVector", getTermVector().getValue());
        if (copyOf != null) {
            for (String f : copyOf) {
                writer.startElement("copyOf", "field", f);
                writer.endElement();
            }
        }
        writer.endElement();
    }

    public boolean valid() throws SearchLibException {
        if (name == null || name.trim().length() == 0)
            throw new SearchLibException("Field name cannot be empty!");
        if (termVector != TermVector.NO && indexed != Indexed.YES)
            throw new SearchLibException("TermVector request Indexed to be set to yes!");
        return true;
    }

}