java-org.hwo/src/org/hwo/serialize/DatabaseObject.java

218 lines
5.2 KiB
Java

package org.hwo.serialize;
import java.lang.reflect.*;
import java.util.ArrayList;
import java.util.List;
public class DatabaseObject {
//OBJECT
//[4] String ObjectID ("OBJT")
//[2] Short NameLen
//[NameLen] String Name
//[2] Short NumFields
private static final String OBJECT_ID = "OBJT";
private List<DatabaseField> fields;
private String name;
private int sizeInBytes;
public DatabaseObject(String name) {
this.name = name;
this.fields = new ArrayList<DatabaseField>();
}
public void addField(DatabaseField field) {
if(fields.contains(field))
return;
fields.add(field);
}
public void addField(String name, byte value) {
DatabaseField temp = new DatabaseField(DatabaseField.BYTE, name, value, false);
if(temp != null)
addField(temp);
}
public void addField(String name, short value) {
DatabaseField temp = new DatabaseField(DatabaseField.SHORT, name, value, false);
if(temp != null)
addField(temp);
}
public void addField(String name, int value) {
DatabaseField temp = new DatabaseField(DatabaseField.INT, name, value, false);
if(temp != null)
addField(temp);
}
public void addField(String name, long value) {
DatabaseField temp = new DatabaseField(DatabaseField.LONG, name, value, false);
if(temp != null)
addField(temp);
}
public void addField(String name, String value) {
DatabaseField temp = new DatabaseField(DatabaseField.STRING, name, value, false);
if(temp != null)
addField(temp);
}
public void addField(String name, DatabaseObject value) {
DatabaseField temp = new DatabaseField(DatabaseField.OBJECT, name, value, false);
if(temp != null)
addField(temp);
}
public void addField(String name, float value) {
DatabaseField temp = new DatabaseField(DatabaseField.FLOAT, name, value, false);
if(temp != null)
addField(temp);
}
public void addField(String name, List<?> value){
DatabaseField temp;
Object check = value.get(0);
if(check instanceof Byte)
temp = new DatabaseField(DatabaseField.BYTE, name, value, true);
else if(check instanceof Short)
temp = new DatabaseField(DatabaseField.SHORT, name, value, true);
else if(check instanceof Integer)
temp = new DatabaseField(DatabaseField.INT, name, value, true);
else if(check instanceof Long)
temp = new DatabaseField(DatabaseField.LONG, name, value, true);
else if(check instanceof Float)
temp = new DatabaseField(DatabaseField.FLOAT, name, value, true);
else
return;
if(temp != null)
addField(temp);
}
public void removeField(DatabaseField field) {
if(fields.contains(field))
return;
int index = fields.indexOf(field);
fields.remove(index);
}
public DatabaseField getField(String name) {
for(DatabaseField f : fields)
if(f.getName().equals(name))
return f;
return null;
}
public <T>T getValue(String name){
DatabaseField f = getField(name);
if(f != null)
return f.getValue();
return null;
}
public String getName() {
return this.name;
}
public int getSizeInBytes() {
if(this.sizeInBytes <= 0) {
this.sizeInBytes = 8 + this.name.length();
for(int i = 0; i < this.fields.size(); i++)
this.sizeInBytes += this.fields.get(i).getSizeInBytes();
}
return this.sizeInBytes;
}
public String toString(int indendation) {
String indend = new String();
String result = new String();
for(int i = 0; i < indendation; i++)
indend += " ";
result += indend + "Object: " + this.name + "\n";
result += indend + "Fields: " + "\n";
for(DatabaseField f : this.fields) {
result += f.toString(indendation + 5);
}
return result;
}
public String toString() {
return toString(0);
}
public void print(int indendation) {
System.out.print(this.toString(indendation));
}
public void print() {
print(0);
}
public byte[] serialize() {
List<Byte> bytes = new ArrayList<Byte>();
BinaryParser.writeBytes(bytes, OBJECT_ID); //Object ID
BinaryParser.writeBytes(bytes, (short)this.name.length()); //Name Length
BinaryParser.writeBytes(bytes, this.name); // Name
BinaryParser.writeBytes(bytes, (short)this.fields.size()); //Field Count
for(DatabaseField f : this.fields) {
byte[] temp = f.serialize();
for(byte b : temp)
bytes.add(b);
}
byte[] result = new byte[bytes.size()];
for(int i = 0; i < bytes.size(); i++)
result[i] = bytes.get(i);
this.sizeInBytes = result.length;
bytes = null;
return result;
}
//@SuppressWarnings("unused")
public static DatabaseObject deserialize(byte[] src, int ptr) {
String tObjId = BinaryParser.readString(src, 4, ptr);
ptr += 4;
if(!tObjId.equals(OBJECT_ID))
return null;
short tNameLen = BinaryParser.readShort(src, ptr);
ptr += 2;
String tName = BinaryParser.readString(src, tNameLen, ptr);
ptr += tNameLen;
short tFieldCount = BinaryParser.readShort(src, ptr);
ptr += 2;
DatabaseObject result = new DatabaseObject(tName);
DatabaseField field = null;
int fieldSize = 0;
for(short i = 0; i < tFieldCount; i++) {
field = DatabaseField.deserialize(src, ptr);
if(field != null) {
ptr += field.getSizeInBytes();
fieldSize += field.getSizeInBytes();
result.addField(field);
}
}
result.sizeInBytes = 8 + tNameLen + fieldSize;
return result;
}
}