forked from LupusNobilis/java-org.hwo
218 lines
5.2 KiB
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;
|
|
}
|
|
|
|
}
|