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; } }