/** * galaxy inc. * meetup client for android */ package com.galaxy.picasa.sync; import java.io.IOException; import java.io.InputStream; import java.io.InputStreamReader; import java.util.Map; import android.content.ContentValues; import android.text.TextUtils; import android.text.format.Time; import android.util.JsonReader; import android.util.JsonToken; import android.util.Log; import com.android.gallery3d.common.Utils; /** * * @author sihai * */ public abstract class PicasaJsonReaderParser { int entryCount; private final PicasaApi.EntryHandler mHandler; int totalCount; protected PicasaJsonReaderParser(PicasaApi.EntryHandler entryhandler) { mHandler = (PicasaApi.EntryHandler) Utils.checkNotNull(entryhandler); } protected abstract Map<String, ObjectField> getEntryFieldMap(); protected abstract void handleComplexValue(JsonReader jsonreader, int i, ContentValues contentvalues) throws IOException; protected static ObjectField newObjectField(com.android.gallery3d.common.EntrySchema.ColumnInfo columninfo) { byte byte0; switch(columninfo.type) { case 0: byte0 = 0; break; case 1: byte0 = 1; break; case 2: Log.e("gp.PicasaAPI", (new StringBuilder("unexpected column ")).append(columninfo.name).append(" of type ").append(columninfo.type).toString()); byte0 = 11; break; case 3: byte0 = 3; break; case 4: byte0 = 4; break; case 5: byte0 = 5; break; case 6: byte0 = 6; break; default: Log.e("gp.PicasaAPI", (new StringBuilder("unexpected column ")).append(columninfo.name).append(" of type ").append(columninfo.type).toString()); byte0 = 11; break; } return new ObjectField(columninfo.name, byte0); } private void parseFeed(JsonReader jsonreader) throws IOException { String s = null; entryCount = 0; totalCount = -1; jsonreader.beginObject(); while (jsonreader.hasNext()) { String s1 = jsonreader.nextName(); if (s1.equals("gd$etag")) s = jsonreader.nextString(); else if (s1.equals("openSearch$totalResults")) totalCount = Integer.parseInt(parseObject(jsonreader, "$t")); else if (s1.equals("entry")) { jsonreader.beginArray(); while (jsonreader.hasNext()) { ContentValues contentvalues = new ContentValues(); parseObject(jsonreader, getEntryFieldMap(), contentvalues); mHandler.handleEntry(contentvalues); entryCount = 1 + entryCount; } jsonreader.endArray(); } else { jsonreader.skipValue(); } } jsonreader.endObject(); Log.v("gp.PicasaAPI", (new StringBuilder(" etag: --> ")).append(s) .append(",entryCount=").append(entryCount).toString()); } private static void parsePrimitiveValue(JsonReader jsonreader, ObjectField objectfield, ContentValues contentvalues) throws IOException { String s = objectfield.columnName; switch (objectfield.type) { case 0: contentvalues.put(s, jsonreader.nextString()); break; case 1: BooleanObjectField booleanobjectfield = (BooleanObjectField) objectfield; int j; if (Boolean.parseBoolean(jsonreader.nextString())) j = booleanobjectfield.onValue; else j = booleanobjectfield.offValue; contentvalues.put(s, Integer.valueOf(j)); break; case 3: contentvalues.put(s, Integer.valueOf(jsonreader.nextInt())); break; case 4: contentvalues.put(s, Long.valueOf(jsonreader.nextLong())); break; case 5: contentvalues .put(s, Float.valueOf((float) jsonreader.nextDouble())); break; case 6: contentvalues.put(s, Double.valueOf(jsonreader.nextDouble())); break; case 10: String s1; s1 = jsonreader.nextString(); if (!TextUtils.isEmpty(s1)) { try { Time time = new Time(); time.parse3339(s1); contentvalues.put(s, Long.valueOf(time.toMillis(true))); } catch (Exception e) { Log.w("gp.PicasaAPI", "parseAtomTimestamp", e); } } break; case 2: case 7: case 8: case 9: default: try { throw new RuntimeException((new StringBuilder( "unexpected type: ")).append(objectfield.type).append(" for ") .append(s).toString()); } catch (Exception exception1) { Log.e("gp.PicasaAPI", "error parsing value", exception1); } jsonreader.skipValue(); break; } } public final void parse(InputStream inputstream) throws IOException { JsonReader jsonreader; jsonreader = new JsonReader(new InputStreamReader(inputstream, "UTF-8")); jsonreader.beginObject(); while (jsonreader.hasNext()) { if (jsonreader.nextName().equals("feed")) { parseFeed(jsonreader); } else { jsonreader.skipValue(); } } jsonreader.endObject(); } protected final String parseObject(JsonReader jsonreader, String s) throws IOException { jsonreader.beginObject(); String s1; do { boolean flag = jsonreader.hasNext(); s1 = null; if (!flag) break; if (s.equals(jsonreader.nextName())) { if (jsonreader.peek() == JsonToken.BEGIN_OBJECT) s1 = parseObject(jsonreader, "$t"); else s1 = jsonreader.nextString(); for (; jsonreader.hasNext(); jsonreader.skipValue()) jsonreader.nextName(); break; } jsonreader.skipValue(); } while (true); jsonreader.endObject(); return s1; } protected final void parseObject(JsonReader jsonreader, Map map, ContentValues contentvalues) throws IOException { jsonreader.beginObject(); do if (jsonreader.hasNext()) { ObjectField objectfield = (ObjectField) map.get(jsonreader .nextName()); if (objectfield != null) { if (objectfield.type >= 12) switch (objectfield.type) { default: handleComplexValue(jsonreader, objectfield.type, contentvalues); break; case 12: // '\f' parseObject(jsonreader, ((NestedObjectField) objectfield).map, contentvalues); break; } else if (jsonreader.peek() == JsonToken.BEGIN_OBJECT) { jsonreader.beginObject(); if (jsonreader.hasNext()) { Utils.assertTrue(jsonreader.nextName().equals("$t")); parsePrimitiveValue(jsonreader, objectfield, contentvalues); boolean flag; if (!jsonreader.hasNext()) flag = true; else flag = false; Utils.assertTrue(flag); } jsonreader.endObject(); } else { parsePrimitiveValue(jsonreader, objectfield, contentvalues); } } else { jsonreader.skipValue(); } } else { jsonreader.endObject(); return; } while (true); } protected static final class BooleanObjectField extends ObjectField { final int offValue = 2; final int onValue = 1; BooleanObjectField(String s, int i, int j) { super(s, 1); } } protected static final class NestedObjectField extends ObjectField { final Map map; NestedObjectField(Map map1) { super(12); map = map1; } } protected static class ObjectField { final String columnName; final int type; ObjectField(int i) { columnName = null; type = i; boolean flag; if (i > 10) flag = true; else flag = false; Utils.assertTrue(flag); } ObjectField(String s, int i) { columnName = s; type = i; boolean flag; if (i <= 10) flag = true; else flag = false; Utils.assertTrue(flag); } } }