/*
* Copyright 2014 Ruediger Moeller.
*
* Licensed 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 org.nustaq.serialization.minbin;
import java.util.Iterator;
/**
* Date: 12.04.2014
* Time: 22:12
* To change this template use File | Settings | File Templates.
*/
public class MBTags {
public static class NullTagSer extends MinBin.TagSerializer {
@Override
public void writeTag(Object data, MBOut out) {
}
@Override
public Object readTag(MBIn in) {
return null;
}
@Override
public Class getClassEncoded() {
return Object.class;
}
}
public static class StringTagSer extends MinBin.TagSerializer {
@Override
public void writeTag(Object data, MBOut out) {
String s = (String) data;
boolean isAsc = s.length() < 64;
if ( isAsc ) {
for (int i = 0; i < s.length(); i++) {
if (s.charAt(i) >= 127) {
isAsc = false;
break;
}
}
}
if (isAsc) {
byte[] strBytes = s.getBytes();
out.writeOut((byte) (MinBin.INT_8|MinBin.ARRAY_MASK));
out.writeIntPacked(strBytes.length);
out.writeRaw(strBytes, 0, strBytes.length);
} else {
final char[] chars = s.toCharArray();
out.writeArray(chars, 0, chars.length);
}
}
@Override
public Object readTag(MBIn in) {
Object arr = in.readArray();
if (arr instanceof byte[]) {
byte[] ba = (byte[]) arr;
return new String(ba, 0, 0, ba.length);
} else if (arr instanceof char[]) {
char[] ca = (char[]) arr;
return new String(ca, 0, ca.length);
}
return null;
}
@Override
public Class getClassEncoded() {
return String.class;
}
}
public static class DoubleTagSer extends MinBin.TagSerializer {
//fixme: very slow
@Override
public void writeTag(Object data, MBOut out) {
double d = ((Double) data).doubleValue();
{
byte[] bytes = Double.toString(d).getBytes();
out.writeArray(bytes, 0, bytes.length);
}
}
@Override
public Object readTag(MBIn in) {
byte ba[] = (byte[]) in.readArray();
return Double.parseDouble(new String(ba, 0, 0, ba.length));
}
@Override
public Class getClassEncoded() {
return Double.class;
}
}
public static class FloatTagSer extends MinBin.TagSerializer {
//fixme: very slow
@Override
public void writeTag(Object data, MBOut out) {
byte[] bytes = Float.toString((Float) data).getBytes();
out.writeArray(bytes, 0, bytes.length);
}
@Override
public Object readTag(MBIn in) {
byte ba[] = (byte[]) in.readArray();
return Float.parseFloat(new String(ba, 0, 0, ba.length));
}
@Override
public Class getClassEncoded() {
return Float.class;
}
}
public static class DoubleArrTagSer extends MinBin.TagSerializer {
@Override
public void writeTag(Object data, MBOut out) {
double d[] = (double[]) data;
out.writeIntPacked(((double[]) data).length);
for (int i = 0; i < d.length; i++) {
byte[] bytes = Double.toString(d[i]).getBytes();
out.writeArray(bytes, 0, bytes.length);
}
}
@Override
public Object readTag(MBIn in) {
int len = (int) in.readInt();
double res[] = new double[len];
for (int i = 0; i < len; i++) {
byte ba[] = (byte[]) in.readArray();
res[i] = Double.parseDouble(new String(ba, 0, 0, ba.length));
}
return res;
}
@Override
public Class getClassEncoded() {
return double[].class;
}
}
public static class FloatArrTagSer extends MinBin.TagSerializer {
@Override
public void writeTag(Object data, MBOut out) {
float d[] = (float[]) data;
out.writeIntPacked(((double[]) data).length);
for (int i = 0; i < d.length; i++) {
byte[] bytes = Float.toString(d[i]).getBytes();
out.writeArray(bytes, 0, bytes.length);
}
}
@Override
public Object readTag(MBIn in) {
int len = (int) in.readInt();
float res[] = new float[len];
for (int i = 0; i < len; i++) {
byte ba[] = (byte[]) in.readArray();
res[i] = Float.parseFloat(new String(ba, 0, 0, ba.length));
}
return res;
}
@Override
public Class getClassEncoded() {
return float[].class;
}
}
public static class MBObjectTagSer extends MinBin.TagSerializer {
/**
* tag is already written. break down the given object into more tags or primitives
*
* @param data
* @param out
*/
@Override
public void writeTag(Object data, MBOut out) {
MBObject ob = (MBObject) data;
out.writeObject(ob.getTypeInfo());
out.writeIntPacked(ob.size());
for (Iterator iterator = ob.keyIterator(); iterator.hasNext(); ) {
String next = (String) iterator.next();
out.writeTag(next);
out.writeObject(ob.get(next));
}
}
/**
* tag is already read, reconstruct the object
*
* @param in
* @return
*/
@Override
public Object readTag(MBIn in) {
Object typeInfo = in.readObject();
int len = (int) in.readInt();
if ( len == -1 ) { // read to end marker
len = Integer.MAX_VALUE;
}
MBObject obj = new MBObject(typeInfo);
for ( int i=0; i < len; i++ ) {
Object key = in.readObject();
if (MinBin.END_MARKER == key)
break;
obj.put((String) key,in.readObject());
}
return obj;
}
/**
* @return the class this tag serializer is responsible for
*/
@Override
public Class getClassEncoded() {
return MBObject.class;
}
}
public static class MBSequenceTagSer extends MinBin.TagSerializer {
/**
* tag is already written. break down the given object into more tags or primitives
*
* @param data
* @param out
*/
@Override
public void writeTag(Object data, MBOut out) {
MBSequence ob = (MBSequence) data;
out.writeTag(ob.getTypeInfo());
out.writeIntPacked(ob.size());
for (int i = 0; i < ob.size(); i++) {
Object o = ob.get(i);
out.writeObject(o);
}
}
/**
* tag is already read, reconstruct the object
*
* @param in
* @return
*/
@Override
public Object readTag(MBIn in) {
Object typeInfo = in.readObject();
int len = (int) in.readInt();
if ( len == -1 ) { // read to end marker
len = Integer.MAX_VALUE;
}
MBSequence obj = new MBSequence(typeInfo);
for ( int i=0; i < len; i++ ) {
Object o = in.readObject();
if ( MinBin.END_MARKER == o)
break;
obj.add(o);
}
return obj;
}
/**
* @return the class this tag serializer is responsible for
*/
@Override
public Class getClassEncoded() {
return MBSequence.class;
}
}
public static class BigBoolTagSer extends MinBin.TagSerializer {
@Override
public void writeTag(Object data, MBOut out) {
out.writeInt(MinBin.INT_8,((Boolean)data)?1:0);
}
@Override
public Object readTag(MBIn in) {
return in.readInt() == 0 ? Boolean.FALSE:Boolean.TRUE;
}
@Override
public Class getClassEncoded() {
return Boolean.class;
}
}
public static class RefTagSer extends MinBin.TagSerializer {
@Override
public void writeTag(Object data, MBOut out) {
out.writeInt(MinBin.INT_32, ((Number)data).intValue());
}
@Override
public Object readTag(MBIn in) {
return (int)in.readInt();
}
@Override
public Class getClassEncoded() {
return null;
}
}
}