package net.sourceforge.pain.logic.event.guitool.event;
import net.sourceforge.pain.logic.event.guitool.*;
import net.sourceforge.pain.db.*;
import net.sourceforge.pain.*;
import net.sourceforge.pain.util.*;
public class DbBrowseEvent extends GuiEventHandler {
public void processEvent() {
String[] data = (String[]) packet.data;
String action = data[0];
if (action.equals("retrieve")) {
retrieve(data);
} else {
send(new String[]{"Unknown action: '" + action + "'"});
}
}
private void retrieve(String[] data) {
if (data.length != 2) {
send(new String[]{"Illegal number of action params: " + data.length});
return;
}
String oidStr = data[1];
Object oid;
try {
if (oidStr.equalsIgnoreCase("root")) {
DbObject obj = Core.getDB().getRoot();
if (obj == null) {
send(new String[]{"Database has no ROOT object"});
return;
} else {
oid = obj.getOid();
}
} else {
oid = new DbOid(oidStr);
}
} catch (Exception e) {
send(new String[]{"Illegal Object ID: '" + oidStr + "'"});
return;
}
DbObject obj = Core.getDB().getObject(oid);
if (obj == null) {
send(new String[]{"Object not found! OID: '" + oidStr + "'"});
return;
}
try {
DbClass dbclass = obj.getDbClass();
int fieldCount = dbclass.getNumberOfFields();
Object[] result = new Object[2 + 3 * fieldCount];
result[0] = oid.toString();
result[1] = dbclass.getClassName();
for (int i = 0, j = 2; i < fieldCount; i++, j += 3) {
result[j] = dbclass.getFieldName(i);
byte fieldType = dbclass.getFieldType(i);
result[j + 1] = new Integer(fieldType);
result[j + 2] = getFieldValue(obj, fieldType, i);
Log.debug("field:" + dbclass.getFieldName(i));
}
send(result);
} catch (Exception e) {
Log.error(e.getMessage(), e);
send(new String[]{"Unexpected Error!: '" + e.getMessage() + "'"});
}
}
private Object getFieldValue(DbObject obj, int type, int i) {
switch (type) {
case DbType.BOOLEAN:
return "" + obj.getBoolean(i);
case DbType.BYTE:
return "" + obj.getByte(i);
case DbType.CHAR:
return "" + obj.getChar(i);
case DbType.DOUBLE:
return "" + obj.getDouble(i);
case DbType.FLOAT:
return "" + obj.getFloat(i);
case DbType.INT:
return "" + obj.getInt(i);
case DbType.LONG:
return "" + obj.getLong(i);
case DbType.SHORT:
return "" + obj.getShort(i);
case DbType.STRING:
return obj.getString(i);
case DbType.REFERENCE:
DbObject ref = obj.getReference(i);
return ref == null ? null : ref.getOid().toString();
case DbType.ARRAY_OF_BYTE:
return obj.getByteArray(i);
case DbType.ARRAY_OF_CHAR:
return obj.getCharArray(i);
case DbType.ARRAY_OF_INT:
return obj.getIntArray(i);
case DbType.ARRAY_OF_STRING:
return obj.getStringArray(i);
case DbType.LINKED_LIST:
return refsToIds(obj.getList(i).toArray());
case DbType.ARRAY_LIST:
return refsToIds(obj.getList(i).toArray());
case DbType.INT_KEY_MAP:
return new Object[]{obj.getIntKeyMap(i).keySet().toArray(), refsToIds(obj.getIntKeyMap(i).values().toArray())};
case DbType.STRING_KEY_MAP:
return new Object[]{obj.getStringKeyMap(i).keySet().toArray(), refsToIds(obj.getStringKeyMap(i).values().toArray())};
case DbType.REFERENCE_SET:
return refsToIds(obj.getRefSet(i).toArray());
case DbType.STRING_SET:
return obj.getStringSet(i).toArray();
case DbType.STRING_MAP:
return new Object[]{obj.getStringMap(i).keySet().toArray(), obj.getStringMap(i).entrySet().toArray()};
default:
return "Unknown field type!:" + type;
}
}
private static Object[] refsToIds(Object[] objects) {
if (objects == null) {
return null;
}
Object[] result = new Object[objects.length];
for (int i = 0; i < objects.length; i++) {
DbObject obj = (DbObject) objects[i];
result[i] = obj == null ? null : obj.getOid();
}
return result;
}
}