From 9dd6c580682bf86e3d27b355e841605e89ae6e33 Mon Sep 17 00:00:00 2001 From: Sam Bosley Date: Mon, 1 Oct 2012 12:00:25 -0700 Subject: [PATCH] Support for BigInteger properties (stored/parsed as strings) --- .../todoroo/andlib/data/AbstractDatabase.java | 5 ++++ .../todoroo/andlib/data/AbstractModel.java | 6 +++++ api/src/com/todoroo/andlib/data/Property.java | 25 +++++++++++++++++++ .../todoroo/andlib/data/TodorooCursor.java | 10 ++++++++ .../astrid/backup/TasksXmlExporter.java | 21 ++++++++++++++++ .../astrid/backup/TasksXmlImporter.java | 10 ++++++++ .../service/Astrid2To3UpgradeHelper.java | 9 +++++++ 7 files changed, 86 insertions(+) diff --git a/api/src/com/todoroo/andlib/data/AbstractDatabase.java b/api/src/com/todoroo/andlib/data/AbstractDatabase.java index f24952551..c0edb834f 100644 --- a/api/src/com/todoroo/andlib/data/AbstractDatabase.java +++ b/api/src/com/todoroo/andlib/data/AbstractDatabase.java @@ -6,6 +6,7 @@ package com.todoroo.andlib.data; import java.lang.reflect.Field; +import java.math.BigInteger; import java.util.ArrayList; import android.content.ContentValues; @@ -366,6 +367,10 @@ abstract public class AbstractDatabase { public String visitString(Property property, Void data) { return String.format("%s TEXT", property.getColumnName()); } + + public String visitBigInteger(Property property, Void data) { + return String.format("%s TEXT", property.getColumnName()); + } } } diff --git a/api/src/com/todoroo/andlib/data/AbstractModel.java b/api/src/com/todoroo/andlib/data/AbstractModel.java index afb935ac4..83b211a40 100644 --- a/api/src/com/todoroo/andlib/data/AbstractModel.java +++ b/api/src/com/todoroo/andlib/data/AbstractModel.java @@ -8,6 +8,7 @@ package com.todoroo.andlib.data; import java.lang.reflect.Array; import java.lang.reflect.Field; import java.lang.reflect.Modifier; +import java.math.BigInteger; import java.util.ArrayList; import java.util.Arrays; import java.util.HashMap; @@ -478,6 +479,11 @@ public abstract class AbstractModel implements Parcelable, Cloneable { store.put(property.getColumnName(), (String) value); return null; } + + public Void visitBigInteger(Property property, Object value) { + store.put(property.getColumnName(), ((BigInteger) value).toString()); + return null; + } } // --- parcelable helpers diff --git a/api/src/com/todoroo/andlib/data/Property.java b/api/src/com/todoroo/andlib/data/Property.java index 358995c71..9386940a7 100644 --- a/api/src/com/todoroo/andlib/data/Property.java +++ b/api/src/com/todoroo/andlib/data/Property.java @@ -10,6 +10,8 @@ import static com.todoroo.andlib.sql.SqlConstants.LEFT_PARENTHESIS; import static com.todoroo.andlib.sql.SqlConstants.RIGHT_PARENTHESIS; import static com.todoroo.andlib.sql.SqlConstants.SPACE; +import java.math.BigInteger; + import com.todoroo.andlib.sql.Criterion; import com.todoroo.andlib.sql.Field; import com.todoroo.andlib.sql.Operator; @@ -101,6 +103,8 @@ public abstract class Property extends Field implements Cloneable { public RETURN visitDouble(Property property, PARAMETER data); public RETURN visitString(Property property, PARAMETER data); + + public RETURN visitBigInteger(Property property, PARAMETER data); } // --- children @@ -239,6 +243,27 @@ public abstract class Property extends Field implements Cloneable { } } + public static class BigIntegerProperty extends Property { + + public BigIntegerProperty(Table table, String name) { + super(table, name); + } + + public BigIntegerProperty(Table table, String name, boolean nullable) { + super(table, name, nullable); + } + + protected BigIntegerProperty(Table table, String name, String expression) { + super(table, name, expression); + } + + @Override + public RETURN accept( + PropertyVisitor visitor, PARAMETER data) { + return visitor.visitBigInteger(this, data); + } + } + public String getColumnName() { if (hasAlias()) return alias; diff --git a/api/src/com/todoroo/andlib/data/TodorooCursor.java b/api/src/com/todoroo/andlib/data/TodorooCursor.java index a0158a3e4..5cab8f1b6 100644 --- a/api/src/com/todoroo/andlib/data/TodorooCursor.java +++ b/api/src/com/todoroo/andlib/data/TodorooCursor.java @@ -5,6 +5,7 @@ */ package com.todoroo.andlib.data; +import java.math.BigInteger; import java.util.WeakHashMap; import android.database.Cursor; @@ -129,9 +130,18 @@ public class TodorooCursor extends CursorWrapper { return cursor.getString(column); } + public Object visitBigInteger(Property property, + TodorooCursor cursor) { + int column = columnIndex(property, cursor); + if(property.nullable && cursor.isNull(column)) + return null; + return new BigInteger(cursor.getString(column)); + } + private int columnIndex(Property property, TodorooCursor cursor) { return cursor.getColumnIndexFromCache(property.getColumnName()); } + } } diff --git a/astrid/plugin-src/com/todoroo/astrid/backup/TasksXmlExporter.java b/astrid/plugin-src/com/todoroo/astrid/backup/TasksXmlExporter.java index f5d83b1f3..6cb10e801 100644 --- a/astrid/plugin-src/com/todoroo/astrid/backup/TasksXmlExporter.java +++ b/astrid/plugin-src/com/todoroo/astrid/backup/TasksXmlExporter.java @@ -8,6 +8,7 @@ package com.todoroo.astrid.backup; import java.io.File; import java.io.FileOutputStream; import java.io.IOException; +import java.math.BigInteger; import org.xmlpull.v1.XmlSerializer; @@ -316,6 +317,26 @@ public class TasksXmlExporter { return null; } + @Override + public Void visitBigInteger(Property property, + AbstractModel data) { + try { + BigInteger value = data.getValue(property); + if(value == null) + return null; + xml.attribute(null, property.name, value.toString()); + } catch (UnsupportedOperationException e) { + // didn't read this value, do nothing + } catch (IllegalArgumentException e) { + throw new RuntimeException(e); + } catch (IllegalStateException e) { + throw new RuntimeException(e); + } catch (IOException e) { + throw new RuntimeException(e); + } + return null; + } + } private void onFinishExport(final String outputFile) { diff --git a/astrid/plugin-src/com/todoroo/astrid/backup/TasksXmlImporter.java b/astrid/plugin-src/com/todoroo/astrid/backup/TasksXmlImporter.java index 1fa31c684..8b52da7db 100644 --- a/astrid/plugin-src/com/todoroo/astrid/backup/TasksXmlImporter.java +++ b/astrid/plugin-src/com/todoroo/astrid/backup/TasksXmlImporter.java @@ -7,6 +7,7 @@ package com.todoroo.astrid.backup; import java.io.FileReader; import java.io.IOException; +import java.math.BigInteger; import java.util.Date; import java.util.LinkedHashSet; import java.util.StringTokenizer; @@ -385,6 +386,15 @@ public class TasksXmlImporter { data.setValue(property, value); return null; } + + @Override + public Void visitBigInteger(Property property, + AbstractModel data) { + String value = xpp.getAttributeValue(null, property.name); + if(value != null) + data.setValue(property, new BigInteger(value)); + return null; + } } } diff --git a/astrid/src/com/todoroo/astrid/service/Astrid2To3UpgradeHelper.java b/astrid/src/com/todoroo/astrid/service/Astrid2To3UpgradeHelper.java index 33bd5366e..013887c05 100644 --- a/astrid/src/com/todoroo/astrid/service/Astrid2To3UpgradeHelper.java +++ b/astrid/src/com/todoroo/astrid/service/Astrid2To3UpgradeHelper.java @@ -5,6 +5,7 @@ */ package com.todoroo.astrid.service; +import java.math.BigInteger; import java.util.Date; import java.util.HashMap; import java.util.Map.Entry; @@ -314,6 +315,14 @@ public class Astrid2To3UpgradeHelper { Log.d("upgrade", "wrote " + value + " to -> " + property + " of model id " + data.cursor.getLong(1)); return null; } + + @Override + public Void visitBigInteger(Property property, UpgradeVisitorContainer data) { + BigInteger value = new BigInteger(data.cursor.getString(data.columnIndex)); + data.model.setValue(property, value); + Log.d("upgrade", "wrote " + value + " to -> " + property + " of model id " + data.cursor.getLong(1)); + return null; + } } /**