package org.kvj.lima1.sync.controller.data; import java.util.ArrayList; import java.util.HashMap; import java.util.Iterator; import java.util.List; import java.util.Map; import org.json.JSONArray; import org.json.JSONException; import org.json.JSONObject; public class SchemaInfo { private static final String TAG = "SchemaInfo"; public Map<String, TableInfo> tables = new HashMap<String, TableInfo>(); int revision = 0; private void parseTableData(JSONObject data, TableInfo info) throws JSONException { JSONArray texts = data.optJSONArray("texts"); if (null != texts) { // Have texts for (int i = 0; i < texts.length(); i++) { // Copy info.texts.add(texts.getString(i)); } } JSONArray numbers = data.optJSONArray("numbers"); if (null != numbers) { // Have numbers for (int i = 0; i < numbers.length(); i++) { // Copy info.numbers.add(numbers.getString(i)); } } JSONArray indexes = data.optJSONArray("indexes"); if (null != indexes) { // Have indexes for (int i = 0; i < indexes.length(); i++) { // Copy JSONArray index = indexes.getJSONArray(i); List<String> oneIndex = new ArrayList<String>(); for (int j = 0; j < index.length(); j++) { // Copy oneIndex.add(index.getString(j)); } if (!oneIndex.isEmpty()) { // Have index info.indexes.add(oneIndex); } } } // Log.i(TAG, "parseTableData: " + info.texts + ", " + info.numbers + // ", " + info.indexes); } private int parseSchema(JSONObject schema, Map<String, TableInfo> infos) throws JSONException { @SuppressWarnings("unchecked") Iterator<String> keys = schema.keys(); while (keys.hasNext()) { // String key = keys.next(); if (!key.startsWith("_")) { // Not a reserved word JSONObject table = schema.getJSONObject(key); TableInfo tinfo = infos.get(key); if (null == tinfo) { // tinfo = new TableInfo(); infos.put(key, tinfo); } parseTableData(table, tinfo); } } if (schema.has("_fkeys")) { // Have foreign keys JSONArray fks = schema.getJSONArray("_fkeys"); for (int i = 0; i < fks.length(); i++) { // Process JSONObject fkey = fks.getJSONObject(i); String[] pk = fkey.getString("pk").split("\\."); String[] fk = fkey.getString("fk").split("\\."); TableInfo pkInfo = infos.get(pk[0]); TableInfo fkInfo = infos.get(fk[0]); if (null != pkInfo && null != fkInfo) { // Both exists FKey key = new FKey(); key.table = fk[0]; key.field = fk[1]; pkInfo.fkeys.add(key); } } } if (schema.has("_upgrades")) { // Have upgrades JSONArray upgrades = schema.getJSONArray("_upgrades"); for (int i = 0; i < upgrades.length(); i++) { // Upgrade schema parseSchema(upgrades.getJSONObject(i), infos); } return upgrades.length(); } return 0; } void parseSchema(JSONObject schema) throws JSONException { tables.clear(); Map<String, TableInfo> infos = new HashMap<String, TableInfo>(); parseSchema(schema, infos); tables.putAll(infos); revision = schema.optInt("_rev"); // Log.i(TAG, "parseSchema: " + tables); } @Override public String toString() { return "SchemaInfo: " + revision + ": " + tables.keySet().size(); } }