com.bizosys.hsearch.index.DocTeaser.java Source code

Java tutorial

Introduction

Here is the source code for com.bizosys.hsearch.index.DocTeaser.java

Source

/*
* Copyright 2010 Bizosys Technologies Limited
*
* Licensed to the Bizosys Technologies Limited (Bizosys) under one
* or more contributor license agreements.  See the NOTICE file
* distributed with this work for additional information
* regarding copyright ownership.  The Bizosys 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 com.bizosys.hsearch.index;

import java.io.IOException;
import java.io.Writer;
import java.util.List;

import org.apache.commons.lang.StringEscapeUtils;

import com.bizosys.hsearch.common.HDocument;
import com.bizosys.hsearch.filter.IStorable;
import com.bizosys.hsearch.filter.Storable;
import com.bizosys.hsearch.hbase.NV;
import com.bizosys.hsearch.schema.IOConstants;
import com.bizosys.oneline.ApplicationFault;
import com.bizosys.oneline.SystemFault;

/**
 * Documents could be coming as structured or unstructured in a unified platform.
 * So showing multiple document format results requires a standard way of accessing
 * the result display section. Teaser fields standardizes this. 
 * @author bizosys
 *
 */
public class DocTeaser implements IStorable {

    /**
     * The Document ID
     */
    public String id = null;

    /**
     * Where is this document located
     */
    public String url = null;

    /**
     * The title of the document
     */
    public String title = null;

    /**
     * Cached Text
     */
    public String cacheText = null;

    /**
     * The body text of the document
     */
    public String preview = null;

    public DocTeaser() {
    }

    /**
     * Formulates the document teaser from the supplied Fields of a document. 
     * @param aDoc
     */
    public DocTeaser(HDocument aDoc) throws ApplicationFault {
        this.id = aDoc.key;
        if (null != aDoc.url)
            this.url = StringEscapeUtils.escapeXml(aDoc.url);
        if (null != aDoc.title)
            this.title = StringEscapeUtils.escapeXml(aDoc.title);
        if (null != aDoc.cacheText)
            this.cacheText = StringEscapeUtils.escapeXml(aDoc.cacheText);
        if (null != aDoc.preview) {
            this.preview = StringEscapeUtils.escapeXml(aDoc.preview);
        }
    }

    public DocTeaser(byte[] data) throws ApplicationFault, SystemFault {
        this.fromBytes(data, 0);
    }

    public DocTeaser(byte[] id, byte[] data) throws ApplicationFault, SystemFault {
        this.id = Storable.getString(id);
        this.fromBytes(data, 0);
    }

    public void toNVs(List<NV> nvs) throws ApplicationFault, SystemFault {
        byte[] data = toBytes();
        nvs.add(new NV(IOConstants.TEASER_BYTES, IOConstants.TEASER_BYTES, new Storable(data)));
    }

    public void setUrl(String url) {
        if (null == url)
            this.url = null;
        else
            this.url = url;
    }

    public String getUrl() {
        return url;
    }

    public void setCacheText(String bodyText) {
        if (null != bodyText)
            bodyText = bodyText.trim();
        if (null == bodyText)
            this.cacheText = null;
        else
            this.cacheText = bodyText;
    }

    public String getCachedText() {
        return this.cacheText;
    }

    public void setPreview(String preview) {
        this.preview = preview;
    }

    public String getPreview() {
        return this.preview;
    }

    public void setTitle(String title) {
        this.title = title;
    }

    public String getTitle() {
        return this.title;
    }

    public byte[] toBytes() {

        int idLen = 0, urlLen = 0, titleLen = 0, cacheTextLen = 0, previewLen = 0;
        byte[] idB = null, urlB = null, titleB = null, cacheTextB = null, previewB = null;
        if (null != this.id) {
            idB = Storable.putString(this.id);
            idLen = (null == idB) ? 0 : idB.length;
        }

        if (null != this.url) {
            urlB = Storable.putString(this.url);
            urlLen = (null == urlB) ? 0 : urlB.length;
        }

        if (null != this.title) {
            titleB = Storable.putString(this.title);
            titleLen = (null == titleB) ? 0 : titleB.length;
        }

        if (null != this.preview) {
            previewB = Storable.putString(this.preview);
            previewLen = (null == previewB) ? 0 : previewB.length;
        }

        if (null != this.cacheText) {
            cacheTextB = Storable.putString(this.cacheText);
            cacheTextLen = (null == cacheTextB) ? 0 : cacheTextB.length;
        }

        int dataSize = 14 + idLen + urlLen + titleLen + previewLen + cacheTextLen;
        byte[] data = new byte[dataSize];
        int index = 0;
        data[index++] = (byte) (idLen >> 8 & 0xff);
        data[index++] = (byte) (idLen & 0xff);

        data[index++] = (byte) (urlLen >> 8 & 0xff);
        data[index++] = (byte) (urlLen & 0xff);

        data[index++] = (byte) (titleLen >> 8 & 0xff);
        data[index++] = (byte) (titleLen & 0xff);

        data[index++] = (byte) (previewLen >> 24);
        data[index++] = (byte) (previewLen >> 16);
        data[index++] = (byte) (previewLen >> 8);
        data[index++] = (byte) (previewLen);

        data[index++] = (byte) (cacheTextLen >> 24);
        data[index++] = (byte) (cacheTextLen >> 16);
        data[index++] = (byte) (cacheTextLen >> 8);
        data[index++] = (byte) (cacheTextLen);

        if (idLen > 0) {
            System.arraycopy(idB, 0, data, index, idLen);
            index = index + idLen;
        }

        if (urlLen > 0) {
            System.arraycopy(urlB, 0, data, index, urlLen);
            index = index + urlLen;
        }

        if (titleLen > 0) {
            System.arraycopy(titleB, 0, data, index, titleLen);
            index = index + titleLen;
        }

        if (previewLen > 0) {
            System.arraycopy(previewB, 0, data, index, previewLen);
            index = index + previewLen;
        }

        if (cacheTextLen > 0) {
            System.arraycopy(cacheTextB, 0, data, index, cacheTextLen);
            index = index + cacheTextLen;
        }

        return data;
    }

    /**
     * Clean up the entire set.
     */
    public void cleanup() {
        this.id = null;
        this.url = null;
        this.title = null;
        this.cacheText = null;
        this.preview = null;
    }

    public void toXml(Writer pw) throws IOException {
        if (null == pw)
            return;
        if (null != id) {
            pw.append('<').append(IOConstants.TEASER_ID).append('>');
            pw.append(id);
            pw.append("</").append(IOConstants.TEASER_ID).append('>');
        }

        if (null != url) {
            pw.append('<').append(IOConstants.TEASER_URL).append("><![CDATA[");
            pw.append(url.toString());
            pw.append("]]></").append(IOConstants.TEASER_URL).append('>');
        }

        if (null != title) {
            pw.append('<').append(IOConstants.TEASER_TITLE).append("><![CDATA[");
            pw.append(title.toString());
            pw.append("]]></").append(IOConstants.TEASER_TITLE).append('>');
        }

        if (null != cacheText) {
            pw.append('<').append(IOConstants.TEASER_CACHE).append("><![CDATA[");
            pw.append(cacheText.toString());
            pw.append("]]></").append(IOConstants.TEASER_CACHE).append('>');
        }

        if (null != preview) {
            pw.append('<').append(IOConstants.TEASER_PREVIEW).append("><![CDATA[");
            pw.append(preview);
            pw.append("]]></").append(IOConstants.TEASER_PREVIEW).append('>');
        }
    }

    public String getId() {
        if (null == id)
            return "";
        return this.id;
    }

    @Override
    public String toString() {
        StringBuilder sb = new StringBuilder('\n');
        if (null != id)
            sb.append("] , Id : [").append(id);
        if (null != url)
            sb.append("] , Url : [").append(url);
        if (null != title)
            sb.append("] , Title : [").append(title);
        if (null != cacheText)
            sb.append("] , Body :[").append(cacheText);
        if (null != preview)
            sb.append("] , Preview :[").append(preview);
        sb.append(']');
        return sb.toString();
    }

    public int fromBytes(byte[] data, int bytePos) {
        if (null == data)
            return bytePos;
        if (data.length < 14)
            return bytePos;

        //Read a short.
        int idLen = Storable.getShort(bytePos, data);
        bytePos = bytePos + 2;

        int urlLen = Storable.getShort(bytePos, data);
        bytePos = bytePos + 2;

        int titleLen = Storable.getShort(bytePos, data);
        bytePos = bytePos + 2;

        int previewLen = Storable.getInt(bytePos, data);
        bytePos = bytePos + 4;

        int cacheLen = Storable.getInt(bytePos, data);
        bytePos = bytePos + 4;

        if (idLen > 0) {
            byte[] idB = new byte[idLen];
            System.arraycopy(data, bytePos, idB, 0, idLen);
            this.id = new String(idB);
            bytePos = bytePos + idLen;
        }

        if (urlLen > 0) {
            byte[] urlB = new byte[urlLen];
            System.arraycopy(data, bytePos, urlB, 0, urlLen);
            this.url = new String(urlB);
            bytePos = bytePos + urlLen;
        }

        if (titleLen > 0) {
            byte[] titleB = new byte[titleLen];
            System.arraycopy(data, bytePos, titleB, 0, titleLen);
            this.title = new String(titleB);
            bytePos = bytePos + titleLen;
        }

        if (previewLen > 0) {
            byte[] previewB = new byte[previewLen];
            System.arraycopy(data, bytePos, previewB, 0, previewLen);
            this.preview = new String(previewB);
            bytePos = bytePos + previewLen;
        }

        if (cacheLen > 0) {
            byte[] cacheB = new byte[cacheLen];
            System.arraycopy(data, bytePos, cacheB, 0, cacheLen);
            this.cacheText = new String(cacheB);
            bytePos = bytePos + cacheLen;
        }
        return bytePos;
    }
}