Java tutorial
/* * 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; } }