package com.alimama.mdrill.editlog;
import static com.alimama.mdrill.editlog.defined.FSEditLogOpCodes.OP_ADD;
import java.io.ByteArrayInputStream;
import java.io.ByteArrayOutputStream;
import java.io.DataInputStream;
import java.io.DataOutputStream;
import java.io.IOException;
import java.io.InputStream;
import java.io.ObjectInputStream;
import java.io.ObjectOutputStream;
import java.io.OutputStream;
import java.nio.ByteBuffer;
import java.util.ArrayList;
import java.util.Collection;
import java.util.Date;
import java.util.HashMap;
import java.util.Iterator;
import java.util.LinkedHashMap;
import java.util.Map;
import org.apache.solr.common.SolrDocument;
import org.apache.solr.common.SolrDocumentList;
import org.apache.solr.common.SolrInputDocument;
import org.apache.solr.common.SolrInputField;
import org.apache.solr.common.util.NamedList;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import com.alimama.mdrill.editlog.read.FSEditLogOp;
import com.esotericsoftware.kryo.Kryo;
import com.esotericsoftware.kryo.ObjectBuffer;
public class AddOp extends FSEditLogOp {
public static Logger LOG = LoggerFactory.getLogger(AddOp.class);
SolrInputDocument doc=new SolrInputDocument();
public SolrInputDocument getDoc() {
return doc;
}
public void setDoc(SolrInputDocument doc) {
this.doc = doc;
}
public AddOp() {
super(OP_ADD);
}
@Override
public String toString() {
StringBuilder builder = new StringBuilder();
builder.append("AddOp ");
return builder.toString();
}
public static void main(String[] args) {
for(int k=0;k<1000;k++)
{
SolrInputDocument dd=new SolrInputDocument();
dd.addField("a", 1);
dd.addField("b", 1.0);
dd.addField("c", "1123");
dd.addField("d", 1l);
dd.addField("c", "333");
dd.addField("c", "1111000000000000000000001111");
dd.addField("e", "4");
dd.addField("d"+k, k);
byte[] bytes=ser(dd);
System.out.println(serialize(dd).length+"=="+bytes.length);
SolrInputDocument aaa=dec(bytes);
System.out.println(aaa.toString());
System.out.println("#######################");
}
}
/**
* 序列化
*
* @param object
* @return
*/
public static byte[] serialize(Object object) {
ObjectOutputStream oos = null;
ByteArrayOutputStream baos = null;
try {
// 序列化
baos = new ByteArrayOutputStream();
oos = new ObjectOutputStream(baos);
oos.writeObject(object);
byte[] bytes = baos.toByteArray();
return bytes;
} catch (Exception e) {
}
return null;
}
/**
* 反序列化
*
* @param bytes
* @return
*/
public static Object unserialize(byte[] bytes) {
ByteArrayInputStream bais = null;
try {
// 反序列化
bais = new ByteArrayInputStream(bytes);
ObjectInputStream ois = new ObjectInputStream(bais);
return ois.readObject();
} catch (Exception e) {
}
return null;
}
public static byte[] ser(SolrInputDocument doc)
{
synchronized (buffer) {
ObjectBuffer buffer=new ObjectBuffer(KROY);
return buffer.writeClassAndObject(doc);
}
}
public static SolrInputDocument dec(byte[] buff)
{
synchronized (buffer) {
return (SolrInputDocument) buffer.readClassAndObject(buff);
}
}
private static Kryo KROY=new Kryo();
private static ObjectBuffer buffer=null;
static{
KROY.register(byte[].class);
KROY.register(String[].class);
KROY.register(ArrayList.class);
KROY.register(HashMap.class);
KROY.register(LinkedHashMap.class);
KROY.register(SolrInputField.class);
KROY.register(SolrInputDocument.class);
KROY.register(Collection.class);
KROY.register(NamedList.class);
KROY.register(SolrDocumentList.class);
KROY.register(SolrDocument.class);
KROY.register(Map.class);
KROY.register(Iterator.class);
KROY.register(Iterable.class);
KROY.register(Date.class);
KROY.register(ByteBuffer.class);
buffer=new ObjectBuffer(KROY);
}
@Override
public void writeFields(DataOutputStream out) throws IOException {
byte[] data = null;
try {
data = ser(doc);
} catch (Throwable e) {
data = null;
}
if (data == null || data.length == 0) {
out.writeInt(0);
} else {
out.writeInt(data.length);
out.write(data, 0, data.length);
}
}
@Override
public void readFields(DataInputStream in, int logVersion)
throws IOException {
int len = in.readInt();
if (len <= 0) {
this.doc = null;
return;
}
byte[] b = new byte[len];
in.read(b, 0, len);
try {
this.doc = dec(b);
} catch (Throwable e) {
LOG.error("dec", e);
this.doc = null;
}
}
}