From 3842d434459e7f0be0665054cd5fe037f3659ab2 Mon Sep 17 00:00:00 2001 From: Tim Su Date: Thu, 6 May 2010 01:43:25 -0700 Subject: [PATCH] Moved stuff around into subfolders, started integrating databases. --- .classpath | 5 + .project | 2 +- .settings/org.eclipse.jdt.core.prefs | 282 +++++++++- .settings/org.eclipse.jdt.ui.prefs | 113 ++-- .../astrid/api/AstridApiConstants.java | 123 +++++ .../astrid/api/AstridContentProvider.java | 194 +++++++ .../com/todoroo/astrid/api/EditOperation.java | 84 +++ api-src/com/todoroo/astrid/api/Filter.java | 140 +++++ .../todoroo/astrid/api/FilterCategory.java | 95 ++++ .../todoroo/astrid/api/FilterListHeader.java | 58 ++ .../todoroo/astrid/api/FilterListItem.java | 73 +++ .../com/todoroo/astrid/api/TaskDetail.java | 89 ++++ bzrtogit.sh | 58 -- common-src/com/todoroo/andlib/data | 1 + common-src/com/todoroo/andlib/service | 1 + common-src/com/todoroo/andlib/utility | 1 + common-src/com/todoroo/andlib/widget | 1 + external-src/com/.svn/all-wcprops | 5 + external-src/com/.svn/entries | 31 ++ .../com/thoughtworks/.svn/all-wcprops | 5 + external-src/com/thoughtworks/.svn/entries | 31 ++ .../com/thoughtworks/sql/.svn/all-wcprops | 89 ++++ .../com/thoughtworks/sql/.svn/entries | 504 ++++++++++++++++++ .../.svn/text-base/Constants.java.svn-base | 22 + .../.svn/text-base/Criterion.java.svn-base | 69 +++ .../sql/.svn/text-base/DBObject.java.svn-base | 51 ++ .../.svn/text-base/EqCriterion.java.svn-base | 10 + .../sql/.svn/text-base/Field.java.svn-base | 83 +++ .../sql/.svn/text-base/GroupBy.java.svn-base | 14 + .../sql/.svn/text-base/Join.java.svn-base | 43 ++ .../sql/.svn/text-base/JoinType.java.svn-base | 5 + .../sql/.svn/text-base/Operator.java.svn-base | 57 ++ .../sql/.svn/text-base/Order.java.svn-base | 30 ++ .../.svn/text-base/OrderType.java.svn-base | 5 + .../sql/.svn/text-base/Query.java.svn-base | 153 ++++++ .../sql/.svn/text-base/Table.java.svn-base | 19 + .../text-base/UnaryCriterion.java.svn-base | 75 +++ .../com/thoughtworks/sql/Constants.java | 24 + .../com/thoughtworks/sql/Criterion.java | 75 +++ .../com/thoughtworks/sql/DBObject.java | 52 ++ .../com/thoughtworks/sql/EqCriterion.java | 7 + external-src/com/thoughtworks/sql/Field.java | 86 +++ .../com/thoughtworks/sql/GroupBy.java | 14 + external-src/com/thoughtworks/sql/Join.java | 43 ++ .../com/thoughtworks/sql/JoinType.java | 5 + .../com/thoughtworks/sql/Operator.java | 57 ++ external-src/com/thoughtworks/sql/Order.java | 30 ++ .../com/thoughtworks/sql/OrderType.java | 5 + external-src/com/thoughtworks/sql/Query.java | 163 ++++++ external-src/com/thoughtworks/sql/Table.java | 20 + .../com/thoughtworks/sql/UnaryCriterion.java | 77 +++ .../com/mdt/rtm/ApplicationInfo.java | 0 {src => src-legacy}/com/mdt/rtm/Invoker.java | 0 {src => src-legacy}/com/mdt/rtm/Param.java | 0 {src => src-legacy}/com/mdt/rtm/Prefs.java | 0 {src => src-legacy}/com/mdt/rtm/Service.java | 0 .../com/mdt/rtm/ServiceException.java | 0 .../com/mdt/rtm/ServiceImpl.java | 0 .../com/mdt/rtm/ServiceInternalException.java | 0 .../com/mdt/rtm/data/RtmAuth.java | 0 .../com/mdt/rtm/data/RtmData.java | 0 .../com/mdt/rtm/data/RtmFrob.java | 0 .../com/mdt/rtm/data/RtmList.java | 0 .../com/mdt/rtm/data/RtmLists.java | 0 .../com/mdt/rtm/data/RtmLocation.java | 0 .../com/mdt/rtm/data/RtmTask.java | 0 .../com/mdt/rtm/data/RtmTaskList.java | 0 .../com/mdt/rtm/data/RtmTaskNote.java | 0 .../com/mdt/rtm/data/RtmTaskNotes.java | 0 .../com/mdt/rtm/data/RtmTaskSeries.java | 0 .../com/mdt/rtm/data/RtmTasks.java | 0 .../com/mdt/rtm/data/RtmTimeline.java | 0 .../com/mdt/rtm/data/RtmUser.java | 0 .../astrid/activities/EditPreferences.java | 0 .../astrid/activities/LocaleEditAlerts.java | 0 .../timsu/astrid/activities/SubActivity.java | 0 .../astrid/activities/SyncLoginActivity.java | 0 .../astrid/activities/SyncPreferences.java | 0 .../astrid/activities/TagListSubActivity.java | 0 .../com/timsu/astrid/activities/TagView.java | 0 .../com/timsu/astrid/activities/TaskEdit.java | 0 .../com/timsu/astrid/activities/TaskList.java | 0 .../astrid/activities/TaskListAdapter.java | 0 .../astrid/activities/TaskListNotify.java | 0 .../activities/TaskListSubActivity.java | 0 .../activities/TaskModificationActivity.java | 0 .../TaskModificationTabbedActivity.java | 0 .../appwidget/AstridAppWidgetProvider.java | 0 .../timsu/astrid/data/AbstractController.java | 0 .../com/timsu/astrid/data/AbstractModel.java | 0 .../com/timsu/astrid/data/Identifier.java | 0 .../com/timsu/astrid/data/alerts/Alert.java | 0 .../astrid/data/alerts/AlertController.java | 0 .../timsu/astrid/data/enums/Importance.java | 0 .../astrid/data/enums/RepeatInterval.java | 0 .../timsu/astrid/data/location/GeoPoint.java | 0 .../astrid/data/sync/SyncDataController.java | 0 .../timsu/astrid/data/sync/SyncMapping.java | 0 .../astrid/data/tag/AbstractTagModel.java | 0 .../timsu/astrid/data/tag/TagController.java | 0 .../timsu/astrid/data/tag/TagIdentifier.java | 0 .../astrid/data/tag/TagModelForView.java | 0 .../astrid/data/tag/TagToTaskMapping.java | 0 .../astrid/data/task/AbstractTaskModel.java | 0 .../astrid/data/task/TaskController.java | 0 .../astrid/data/task/TaskIdentifier.java | 0 .../astrid/data/task/TaskModelForEdit.java | 0 .../data/task/TaskModelForHandlers.java | 0 .../astrid/data/task/TaskModelForList.java | 0 .../astrid/data/task/TaskModelForNotify.java | 0 .../data/task/TaskModelForProvider.java | 0 .../data/task/TaskModelForReminder.java | 0 .../astrid/data/task/TaskModelForSync.java | 0 .../astrid/data/task/TaskModelForWidget.java | 0 .../astrid/data/task/TaskModelForXml.java | 0 .../timsu/astrid/provider/TasksProvider.java | 0 .../timsu/astrid/sync/RTMSyncProvider.java | 0 .../astrid/sync/SynchronizationProvider.java | 0 .../astrid/sync/SynchronizationService.java | 0 .../com/timsu/astrid/sync/Synchronizer.java | 0 .../com/timsu/astrid/sync/TaskProxy.java | 0 .../astrid/utilities/AstridUtilities.java | 0 .../timsu/astrid/utilities/BackupService.java | 0 .../com/timsu/astrid/utilities/Constants.java | 0 .../timsu/astrid/utilities/DateUtilities.java | 0 .../astrid/utilities/DialogUtilities.java | 0 .../astrid/utilities/LocaleReceiver.java | 0 .../timsu/astrid/utilities/Notifications.java | 0 .../timsu/astrid/utilities/Preferences.java | 0 .../astrid/utilities/StartupReceiver.java | 0 .../utilities/TaskFieldsVisibility.java | 0 .../astrid/utilities/TasksXmlExporter.java | 0 .../astrid/utilities/TasksXmlImporter.java | 0 .../timsu/astrid/widget/DateControlSet.java | 0 .../astrid/widget/DateWithNullControlSet.java | 0 .../astrid/widget/FilePickerBuilder.java | 0 .../astrid/widget/NNumberPickerDialog.java | 0 .../com/timsu/astrid/widget/NumberPicker.java | 0 .../astrid/widget/NumberPickerButton.java | 0 .../astrid/widget/NumberPickerDialog.java | 0 .../astrid/widget/TimeDurationControlSet.java | 0 src/com/todoroo/astrid/dao/Database.java | 172 ++++++ src/com/todoroo/astrid/dao/MetadataDao.java | 79 +++ src/com/todoroo/astrid/dao/TaskDao.java | 219 ++++++++ src/com/todoroo/astrid/model/Metadata.java | 88 +++ src/com/todoroo/astrid/model/Task.java | 196 +++++++ .../service/AstridDependencyInjector.java | 148 +++++ .../astrid/service/MetadataService.java | 91 ++++ .../todoroo/astrid/service/TaskService.java | 130 +++++ src/com/todoroo/astrid/utility/Constants.java | 10 + 150 files changed, 4285 insertions(+), 127 deletions(-) create mode 100644 api-src/com/todoroo/astrid/api/AstridApiConstants.java create mode 100644 api-src/com/todoroo/astrid/api/AstridContentProvider.java create mode 100644 api-src/com/todoroo/astrid/api/EditOperation.java create mode 100644 api-src/com/todoroo/astrid/api/Filter.java create mode 100644 api-src/com/todoroo/astrid/api/FilterCategory.java create mode 100644 api-src/com/todoroo/astrid/api/FilterListHeader.java create mode 100644 api-src/com/todoroo/astrid/api/FilterListItem.java create mode 100644 api-src/com/todoroo/astrid/api/TaskDetail.java delete mode 100644 bzrtogit.sh create mode 160000 common-src/com/todoroo/andlib/data create mode 160000 common-src/com/todoroo/andlib/service create mode 160000 common-src/com/todoroo/andlib/utility create mode 160000 common-src/com/todoroo/andlib/widget create mode 100644 external-src/com/.svn/all-wcprops create mode 100644 external-src/com/.svn/entries create mode 100644 external-src/com/thoughtworks/.svn/all-wcprops create mode 100644 external-src/com/thoughtworks/.svn/entries create mode 100644 external-src/com/thoughtworks/sql/.svn/all-wcprops create mode 100644 external-src/com/thoughtworks/sql/.svn/entries create mode 100644 external-src/com/thoughtworks/sql/.svn/text-base/Constants.java.svn-base create mode 100644 external-src/com/thoughtworks/sql/.svn/text-base/Criterion.java.svn-base create mode 100644 external-src/com/thoughtworks/sql/.svn/text-base/DBObject.java.svn-base create mode 100644 external-src/com/thoughtworks/sql/.svn/text-base/EqCriterion.java.svn-base create mode 100644 external-src/com/thoughtworks/sql/.svn/text-base/Field.java.svn-base create mode 100644 external-src/com/thoughtworks/sql/.svn/text-base/GroupBy.java.svn-base create mode 100644 external-src/com/thoughtworks/sql/.svn/text-base/Join.java.svn-base create mode 100644 external-src/com/thoughtworks/sql/.svn/text-base/JoinType.java.svn-base create mode 100644 external-src/com/thoughtworks/sql/.svn/text-base/Operator.java.svn-base create mode 100644 external-src/com/thoughtworks/sql/.svn/text-base/Order.java.svn-base create mode 100644 external-src/com/thoughtworks/sql/.svn/text-base/OrderType.java.svn-base create mode 100644 external-src/com/thoughtworks/sql/.svn/text-base/Query.java.svn-base create mode 100644 external-src/com/thoughtworks/sql/.svn/text-base/Table.java.svn-base create mode 100644 external-src/com/thoughtworks/sql/.svn/text-base/UnaryCriterion.java.svn-base create mode 100644 external-src/com/thoughtworks/sql/Constants.java create mode 100644 external-src/com/thoughtworks/sql/Criterion.java create mode 100644 external-src/com/thoughtworks/sql/DBObject.java create mode 100644 external-src/com/thoughtworks/sql/EqCriterion.java create mode 100644 external-src/com/thoughtworks/sql/Field.java create mode 100644 external-src/com/thoughtworks/sql/GroupBy.java create mode 100644 external-src/com/thoughtworks/sql/Join.java create mode 100644 external-src/com/thoughtworks/sql/JoinType.java create mode 100644 external-src/com/thoughtworks/sql/Operator.java create mode 100644 external-src/com/thoughtworks/sql/Order.java create mode 100644 external-src/com/thoughtworks/sql/OrderType.java create mode 100644 external-src/com/thoughtworks/sql/Query.java create mode 100644 external-src/com/thoughtworks/sql/Table.java create mode 100644 external-src/com/thoughtworks/sql/UnaryCriterion.java rename {src => src-legacy}/com/mdt/rtm/ApplicationInfo.java (100%) rename {src => src-legacy}/com/mdt/rtm/Invoker.java (100%) rename {src => src-legacy}/com/mdt/rtm/Param.java (100%) rename {src => src-legacy}/com/mdt/rtm/Prefs.java (100%) rename {src => src-legacy}/com/mdt/rtm/Service.java (100%) rename {src => src-legacy}/com/mdt/rtm/ServiceException.java (100%) rename {src => src-legacy}/com/mdt/rtm/ServiceImpl.java (100%) rename {src => src-legacy}/com/mdt/rtm/ServiceInternalException.java (100%) rename {src => src-legacy}/com/mdt/rtm/data/RtmAuth.java (100%) rename {src => src-legacy}/com/mdt/rtm/data/RtmData.java (100%) rename {src => src-legacy}/com/mdt/rtm/data/RtmFrob.java (100%) rename {src => src-legacy}/com/mdt/rtm/data/RtmList.java (100%) rename {src => src-legacy}/com/mdt/rtm/data/RtmLists.java (100%) rename {src => src-legacy}/com/mdt/rtm/data/RtmLocation.java (100%) rename {src => src-legacy}/com/mdt/rtm/data/RtmTask.java (100%) rename {src => src-legacy}/com/mdt/rtm/data/RtmTaskList.java (100%) rename {src => src-legacy}/com/mdt/rtm/data/RtmTaskNote.java (100%) rename {src => src-legacy}/com/mdt/rtm/data/RtmTaskNotes.java (100%) rename {src => src-legacy}/com/mdt/rtm/data/RtmTaskSeries.java (100%) rename {src => src-legacy}/com/mdt/rtm/data/RtmTasks.java (100%) rename {src => src-legacy}/com/mdt/rtm/data/RtmTimeline.java (100%) rename {src => src-legacy}/com/mdt/rtm/data/RtmUser.java (100%) rename {src => src-legacy}/com/timsu/astrid/activities/EditPreferences.java (100%) rename {src => src-legacy}/com/timsu/astrid/activities/LocaleEditAlerts.java (100%) rename {src => src-legacy}/com/timsu/astrid/activities/SubActivity.java (100%) rename {src => src-legacy}/com/timsu/astrid/activities/SyncLoginActivity.java (100%) rename {src => src-legacy}/com/timsu/astrid/activities/SyncPreferences.java (100%) rename {src => src-legacy}/com/timsu/astrid/activities/TagListSubActivity.java (100%) rename {src => src-legacy}/com/timsu/astrid/activities/TagView.java (100%) rename {src => src-legacy}/com/timsu/astrid/activities/TaskEdit.java (100%) rename {src => src-legacy}/com/timsu/astrid/activities/TaskList.java (100%) rename {src => src-legacy}/com/timsu/astrid/activities/TaskListAdapter.java (100%) rename {src => src-legacy}/com/timsu/astrid/activities/TaskListNotify.java (100%) rename {src => src-legacy}/com/timsu/astrid/activities/TaskListSubActivity.java (100%) rename {src => src-legacy}/com/timsu/astrid/activities/TaskModificationActivity.java (100%) rename {src => src-legacy}/com/timsu/astrid/activities/TaskModificationTabbedActivity.java (100%) rename {src => src-legacy}/com/timsu/astrid/appwidget/AstridAppWidgetProvider.java (100%) rename {src => src-legacy}/com/timsu/astrid/data/AbstractController.java (100%) rename {src => src-legacy}/com/timsu/astrid/data/AbstractModel.java (100%) rename {src => src-legacy}/com/timsu/astrid/data/Identifier.java (100%) rename {src => src-legacy}/com/timsu/astrid/data/alerts/Alert.java (100%) rename {src => src-legacy}/com/timsu/astrid/data/alerts/AlertController.java (100%) rename {src => src-legacy}/com/timsu/astrid/data/enums/Importance.java (100%) rename {src => src-legacy}/com/timsu/astrid/data/enums/RepeatInterval.java (100%) rename {src => src-legacy}/com/timsu/astrid/data/location/GeoPoint.java (100%) rename {src => src-legacy}/com/timsu/astrid/data/sync/SyncDataController.java (100%) rename {src => src-legacy}/com/timsu/astrid/data/sync/SyncMapping.java (100%) rename {src => src-legacy}/com/timsu/astrid/data/tag/AbstractTagModel.java (100%) rename {src => src-legacy}/com/timsu/astrid/data/tag/TagController.java (100%) rename {src => src-legacy}/com/timsu/astrid/data/tag/TagIdentifier.java (100%) rename {src => src-legacy}/com/timsu/astrid/data/tag/TagModelForView.java (100%) rename {src => src-legacy}/com/timsu/astrid/data/tag/TagToTaskMapping.java (100%) rename {src => src-legacy}/com/timsu/astrid/data/task/AbstractTaskModel.java (100%) rename {src => src-legacy}/com/timsu/astrid/data/task/TaskController.java (100%) rename {src => src-legacy}/com/timsu/astrid/data/task/TaskIdentifier.java (100%) rename {src => src-legacy}/com/timsu/astrid/data/task/TaskModelForEdit.java (100%) rename {src => src-legacy}/com/timsu/astrid/data/task/TaskModelForHandlers.java (100%) rename {src => src-legacy}/com/timsu/astrid/data/task/TaskModelForList.java (100%) rename {src => src-legacy}/com/timsu/astrid/data/task/TaskModelForNotify.java (100%) rename {src => src-legacy}/com/timsu/astrid/data/task/TaskModelForProvider.java (100%) rename {src => src-legacy}/com/timsu/astrid/data/task/TaskModelForReminder.java (100%) rename {src => src-legacy}/com/timsu/astrid/data/task/TaskModelForSync.java (100%) rename {src => src-legacy}/com/timsu/astrid/data/task/TaskModelForWidget.java (100%) rename {src => src-legacy}/com/timsu/astrid/data/task/TaskModelForXml.java (100%) rename {src => src-legacy}/com/timsu/astrid/provider/TasksProvider.java (100%) rename {src => src-legacy}/com/timsu/astrid/sync/RTMSyncProvider.java (100%) rename {src => src-legacy}/com/timsu/astrid/sync/SynchronizationProvider.java (100%) rename {src => src-legacy}/com/timsu/astrid/sync/SynchronizationService.java (100%) rename {src => src-legacy}/com/timsu/astrid/sync/Synchronizer.java (100%) rename {src => src-legacy}/com/timsu/astrid/sync/TaskProxy.java (100%) rename {src => src-legacy}/com/timsu/astrid/utilities/AstridUtilities.java (100%) rename {src => src-legacy}/com/timsu/astrid/utilities/BackupService.java (100%) rename {src => src-legacy}/com/timsu/astrid/utilities/Constants.java (100%) rename {src => src-legacy}/com/timsu/astrid/utilities/DateUtilities.java (100%) rename {src => src-legacy}/com/timsu/astrid/utilities/DialogUtilities.java (100%) rename {src => src-legacy}/com/timsu/astrid/utilities/LocaleReceiver.java (100%) rename {src => src-legacy}/com/timsu/astrid/utilities/Notifications.java (100%) rename {src => src-legacy}/com/timsu/astrid/utilities/Preferences.java (100%) rename {src => src-legacy}/com/timsu/astrid/utilities/StartupReceiver.java (100%) rename {src => src-legacy}/com/timsu/astrid/utilities/TaskFieldsVisibility.java (100%) rename {src => src-legacy}/com/timsu/astrid/utilities/TasksXmlExporter.java (100%) rename {src => src-legacy}/com/timsu/astrid/utilities/TasksXmlImporter.java (100%) rename {src => src-legacy}/com/timsu/astrid/widget/DateControlSet.java (100%) rename {src => src-legacy}/com/timsu/astrid/widget/DateWithNullControlSet.java (100%) rename {src => src-legacy}/com/timsu/astrid/widget/FilePickerBuilder.java (100%) rename {src => src-legacy}/com/timsu/astrid/widget/NNumberPickerDialog.java (100%) rename {src => src-legacy}/com/timsu/astrid/widget/NumberPicker.java (100%) rename {src => src-legacy}/com/timsu/astrid/widget/NumberPickerButton.java (100%) rename {src => src-legacy}/com/timsu/astrid/widget/NumberPickerDialog.java (100%) rename {src => src-legacy}/com/timsu/astrid/widget/TimeDurationControlSet.java (100%) create mode 100644 src/com/todoroo/astrid/dao/Database.java create mode 100644 src/com/todoroo/astrid/dao/MetadataDao.java create mode 100644 src/com/todoroo/astrid/dao/TaskDao.java create mode 100644 src/com/todoroo/astrid/model/Metadata.java create mode 100644 src/com/todoroo/astrid/model/Task.java create mode 100644 src/com/todoroo/astrid/service/AstridDependencyInjector.java create mode 100644 src/com/todoroo/astrid/service/MetadataService.java create mode 100644 src/com/todoroo/astrid/service/TaskService.java create mode 100644 src/com/todoroo/astrid/utility/Constants.java diff --git a/.classpath b/.classpath index fa3a4cc20..24a48e061 100644 --- a/.classpath +++ b/.classpath @@ -1,6 +1,11 @@ + + + + + diff --git a/.project b/.project index 15252a590..768ee9bd2 100644 --- a/.project +++ b/.project @@ -1,6 +1,6 @@ - astrid-2.x + astrid-3.x diff --git a/.settings/org.eclipse.jdt.core.prefs b/.settings/org.eclipse.jdt.core.prefs index 2a3a2987b..f5dd01cd3 100644 --- a/.settings/org.eclipse.jdt.core.prefs +++ b/.settings/org.eclipse.jdt.core.prefs @@ -1,4 +1,4 @@ -#Sun May 17 17:33:53 PDT 2009 +#Mon Jan 04 09:25:09 PST 2010 eclipse.preferences.version=1 org.eclipse.jdt.core.compiler.codegen.inlineJsrBytecode=enabled org.eclipse.jdt.core.compiler.codegen.targetPlatform=1.6 @@ -16,38 +16,38 @@ org.eclipse.jdt.core.compiler.problem.deprecationWhenOverridingDeprecatedMethod= org.eclipse.jdt.core.compiler.problem.discouragedReference=warning org.eclipse.jdt.core.compiler.problem.emptyStatement=ignore org.eclipse.jdt.core.compiler.problem.enumIdentifier=error -org.eclipse.jdt.core.compiler.problem.fallthroughCase=warning +org.eclipse.jdt.core.compiler.problem.fallthroughCase=ignore org.eclipse.jdt.core.compiler.problem.fatalOptionalError=enabled -org.eclipse.jdt.core.compiler.problem.fieldHiding=warning +org.eclipse.jdt.core.compiler.problem.fieldHiding=warning org.eclipse.jdt.core.compiler.problem.finalParameterBound=warning org.eclipse.jdt.core.compiler.problem.finallyBlockNotCompletingNormally=warning org.eclipse.jdt.core.compiler.problem.forbiddenReference=error -org.eclipse.jdt.core.compiler.problem.hiddenCatchBlock=warning +org.eclipse.jdt.core.compiler.problem.hiddenCatchBlock=warning org.eclipse.jdt.core.compiler.problem.incompatibleNonInheritedInterfaceMethod=warning org.eclipse.jdt.core.compiler.problem.incompleteEnumSwitch=ignore org.eclipse.jdt.core.compiler.problem.indirectStaticAccess=ignore -org.eclipse.jdt.core.compiler.problem.localVariableHiding=warning +org.eclipse.jdt.core.compiler.problem.localVariableHiding=warning org.eclipse.jdt.core.compiler.problem.methodWithConstructorName=warning -org.eclipse.jdt.core.compiler.problem.missingDeprecatedAnnotation=warning +org.eclipse.jdt.core.compiler.problem.missingDeprecatedAnnotation=ignore org.eclipse.jdt.core.compiler.problem.missingOverrideAnnotation=ignore org.eclipse.jdt.core.compiler.problem.missingSerialVersion=warning org.eclipse.jdt.core.compiler.problem.noEffectAssignment=warning org.eclipse.jdt.core.compiler.problem.noImplicitStringConversion=warning -org.eclipse.jdt.core.compiler.problem.nonExternalizedStringLiteral=ignore +org.eclipse.jdt.core.compiler.problem.nonExternalizedStringLiteral=warning org.eclipse.jdt.core.compiler.problem.nullReference=warning org.eclipse.jdt.core.compiler.problem.overridingPackageDefaultMethod=warning org.eclipse.jdt.core.compiler.problem.parameterAssignment=ignore org.eclipse.jdt.core.compiler.problem.possibleAccidentalBooleanAssignment=error org.eclipse.jdt.core.compiler.problem.potentialNullReference=warning org.eclipse.jdt.core.compiler.problem.rawTypeReference=warning -org.eclipse.jdt.core.compiler.problem.redundantNullCheck=ignore +org.eclipse.jdt.core.compiler.problem.redundantNullCheck=warning org.eclipse.jdt.core.compiler.problem.redundantSuperinterface=ignore org.eclipse.jdt.core.compiler.problem.specialParameterHidingField=disabled -org.eclipse.jdt.core.compiler.problem.staticAccessReceiver=error +org.eclipse.jdt.core.compiler.problem.staticAccessReceiver=warning org.eclipse.jdt.core.compiler.problem.suppressWarnings=enabled -org.eclipse.jdt.core.compiler.problem.syntheticAccessEmulation=ignore +org.eclipse.jdt.core.compiler.problem.syntheticAccessEmulation=warning org.eclipse.jdt.core.compiler.problem.typeParameterHiding=warning -org.eclipse.jdt.core.compiler.problem.uncheckedTypeOperation=warning +org.eclipse.jdt.core.compiler.problem.uncheckedTypeOperation=ignore org.eclipse.jdt.core.compiler.problem.undocumentedEmptyBlock=warning org.eclipse.jdt.core.compiler.problem.unhandledWarningToken=warning org.eclipse.jdt.core.compiler.problem.unnecessaryElse=ignore @@ -60,7 +60,7 @@ org.eclipse.jdt.core.compiler.problem.unusedDeclaredThrownExceptionWhenOverridin org.eclipse.jdt.core.compiler.problem.unusedImport=warning org.eclipse.jdt.core.compiler.problem.unusedLabel=warning org.eclipse.jdt.core.compiler.problem.unusedLocal=warning -org.eclipse.jdt.core.compiler.problem.unusedParameter=ignore +org.eclipse.jdt.core.compiler.problem.unusedParameter=warning org.eclipse.jdt.core.compiler.problem.unusedParameterIncludeDocCommentReference=enabled org.eclipse.jdt.core.compiler.problem.unusedParameterWhenImplementingAbstract=disabled org.eclipse.jdt.core.compiler.problem.unusedParameterWhenOverridingConcrete=disabled @@ -68,3 +68,261 @@ org.eclipse.jdt.core.compiler.problem.unusedPrivateMember=warning org.eclipse.jdt.core.compiler.problem.unusedWarningToken=warning org.eclipse.jdt.core.compiler.problem.varargsArgumentNeedCast=warning org.eclipse.jdt.core.compiler.source=1.6 +org.eclipse.jdt.core.formatter.align_type_members_on_columns=false +org.eclipse.jdt.core.formatter.alignment_for_arguments_in_allocation_expression=16 +org.eclipse.jdt.core.formatter.alignment_for_arguments_in_enum_constant=16 +org.eclipse.jdt.core.formatter.alignment_for_arguments_in_explicit_constructor_call=16 +org.eclipse.jdt.core.formatter.alignment_for_arguments_in_method_invocation=16 +org.eclipse.jdt.core.formatter.alignment_for_arguments_in_qualified_allocation_expression=16 +org.eclipse.jdt.core.formatter.alignment_for_assignment=0 +org.eclipse.jdt.core.formatter.alignment_for_binary_expression=16 +org.eclipse.jdt.core.formatter.alignment_for_compact_if=16 +org.eclipse.jdt.core.formatter.alignment_for_conditional_expression=80 +org.eclipse.jdt.core.formatter.alignment_for_enum_constants=0 +org.eclipse.jdt.core.formatter.alignment_for_expressions_in_array_initializer=16 +org.eclipse.jdt.core.formatter.alignment_for_multiple_fields=16 +org.eclipse.jdt.core.formatter.alignment_for_parameters_in_constructor_declaration=16 +org.eclipse.jdt.core.formatter.alignment_for_parameters_in_method_declaration=16 +org.eclipse.jdt.core.formatter.alignment_for_selector_in_method_invocation=0 +org.eclipse.jdt.core.formatter.alignment_for_superclass_in_type_declaration=16 +org.eclipse.jdt.core.formatter.alignment_for_superinterfaces_in_enum_declaration=16 +org.eclipse.jdt.core.formatter.alignment_for_superinterfaces_in_type_declaration=16 +org.eclipse.jdt.core.formatter.alignment_for_throws_clause_in_constructor_declaration=16 +org.eclipse.jdt.core.formatter.alignment_for_throws_clause_in_method_declaration=16 +org.eclipse.jdt.core.formatter.blank_lines_after_imports=1 +org.eclipse.jdt.core.formatter.blank_lines_after_package=1 +org.eclipse.jdt.core.formatter.blank_lines_before_field=0 +org.eclipse.jdt.core.formatter.blank_lines_before_first_class_body_declaration=0 +org.eclipse.jdt.core.formatter.blank_lines_before_imports=1 +org.eclipse.jdt.core.formatter.blank_lines_before_member_type=1 +org.eclipse.jdt.core.formatter.blank_lines_before_method=1 +org.eclipse.jdt.core.formatter.blank_lines_before_new_chunk=1 +org.eclipse.jdt.core.formatter.blank_lines_before_package=0 +org.eclipse.jdt.core.formatter.blank_lines_between_import_groups=1 +org.eclipse.jdt.core.formatter.blank_lines_between_type_declarations=1 +org.eclipse.jdt.core.formatter.brace_position_for_annotation_type_declaration=end_of_line +org.eclipse.jdt.core.formatter.brace_position_for_anonymous_type_declaration=end_of_line +org.eclipse.jdt.core.formatter.brace_position_for_array_initializer=end_of_line +org.eclipse.jdt.core.formatter.brace_position_for_block=end_of_line +org.eclipse.jdt.core.formatter.brace_position_for_block_in_case=end_of_line +org.eclipse.jdt.core.formatter.brace_position_for_constructor_declaration=end_of_line +org.eclipse.jdt.core.formatter.brace_position_for_enum_constant=end_of_line +org.eclipse.jdt.core.formatter.brace_position_for_enum_declaration=end_of_line +org.eclipse.jdt.core.formatter.brace_position_for_method_declaration=end_of_line +org.eclipse.jdt.core.formatter.brace_position_for_switch=end_of_line +org.eclipse.jdt.core.formatter.brace_position_for_type_declaration=end_of_line +org.eclipse.jdt.core.formatter.comment.clear_blank_lines_in_block_comment=false +org.eclipse.jdt.core.formatter.comment.clear_blank_lines_in_javadoc_comment=false +org.eclipse.jdt.core.formatter.comment.format_block_comments=true +org.eclipse.jdt.core.formatter.comment.format_header=false +org.eclipse.jdt.core.formatter.comment.format_html=true +org.eclipse.jdt.core.formatter.comment.format_javadoc_comments=true +org.eclipse.jdt.core.formatter.comment.format_line_comments=true +org.eclipse.jdt.core.formatter.comment.format_source_code=true +org.eclipse.jdt.core.formatter.comment.indent_parameter_description=true +org.eclipse.jdt.core.formatter.comment.indent_root_tags=true +org.eclipse.jdt.core.formatter.comment.insert_new_line_before_root_tags=insert +org.eclipse.jdt.core.formatter.comment.insert_new_line_for_parameter=insert +org.eclipse.jdt.core.formatter.comment.line_length=80 +org.eclipse.jdt.core.formatter.compact_else_if=true +org.eclipse.jdt.core.formatter.continuation_indentation=2 +org.eclipse.jdt.core.formatter.continuation_indentation_for_array_initializer=2 +org.eclipse.jdt.core.formatter.format_guardian_clause_on_one_line=false +org.eclipse.jdt.core.formatter.indent_body_declarations_compare_to_annotation_declaration_header=true +org.eclipse.jdt.core.formatter.indent_body_declarations_compare_to_enum_constant_header=true +org.eclipse.jdt.core.formatter.indent_body_declarations_compare_to_enum_declaration_header=true +org.eclipse.jdt.core.formatter.indent_body_declarations_compare_to_type_header=true +org.eclipse.jdt.core.formatter.indent_breaks_compare_to_cases=true +org.eclipse.jdt.core.formatter.indent_empty_lines=false +org.eclipse.jdt.core.formatter.indent_statements_compare_to_block=true +org.eclipse.jdt.core.formatter.indent_statements_compare_to_body=true +org.eclipse.jdt.core.formatter.indent_switchstatements_compare_to_cases=true +org.eclipse.jdt.core.formatter.indent_switchstatements_compare_to_switch=false +org.eclipse.jdt.core.formatter.indentation.size=4 +org.eclipse.jdt.core.formatter.insert_new_line_after_annotation_on_local_variable=insert +org.eclipse.jdt.core.formatter.insert_new_line_after_annotation_on_member=insert +org.eclipse.jdt.core.formatter.insert_new_line_after_annotation_on_parameter=do not insert +org.eclipse.jdt.core.formatter.insert_new_line_after_opening_brace_in_array_initializer=do not insert +org.eclipse.jdt.core.formatter.insert_new_line_at_end_of_file_if_missing=do not insert +org.eclipse.jdt.core.formatter.insert_new_line_before_catch_in_try_statement=do not insert +org.eclipse.jdt.core.formatter.insert_new_line_before_closing_brace_in_array_initializer=do not insert +org.eclipse.jdt.core.formatter.insert_new_line_before_else_in_if_statement=do not insert +org.eclipse.jdt.core.formatter.insert_new_line_before_finally_in_try_statement=do not insert +org.eclipse.jdt.core.formatter.insert_new_line_before_while_in_do_statement=do not insert +org.eclipse.jdt.core.formatter.insert_new_line_in_empty_annotation_declaration=insert +org.eclipse.jdt.core.formatter.insert_new_line_in_empty_anonymous_type_declaration=insert +org.eclipse.jdt.core.formatter.insert_new_line_in_empty_block=insert +org.eclipse.jdt.core.formatter.insert_new_line_in_empty_enum_constant=insert +org.eclipse.jdt.core.formatter.insert_new_line_in_empty_enum_declaration=insert +org.eclipse.jdt.core.formatter.insert_new_line_in_empty_method_body=insert +org.eclipse.jdt.core.formatter.insert_new_line_in_empty_type_declaration=insert +org.eclipse.jdt.core.formatter.insert_space_after_and_in_type_parameter=insert +org.eclipse.jdt.core.formatter.insert_space_after_assignment_operator=insert +org.eclipse.jdt.core.formatter.insert_space_after_at_in_annotation=do not insert +org.eclipse.jdt.core.formatter.insert_space_after_at_in_annotation_type_declaration=do not insert +org.eclipse.jdt.core.formatter.insert_space_after_binary_operator=insert +org.eclipse.jdt.core.formatter.insert_space_after_closing_angle_bracket_in_type_arguments=insert +org.eclipse.jdt.core.formatter.insert_space_after_closing_angle_bracket_in_type_parameters=insert +org.eclipse.jdt.core.formatter.insert_space_after_closing_brace_in_block=insert +org.eclipse.jdt.core.formatter.insert_space_after_closing_paren_in_cast=insert +org.eclipse.jdt.core.formatter.insert_space_after_colon_in_assert=insert +org.eclipse.jdt.core.formatter.insert_space_after_colon_in_case=insert +org.eclipse.jdt.core.formatter.insert_space_after_colon_in_conditional=insert +org.eclipse.jdt.core.formatter.insert_space_after_colon_in_for=insert +org.eclipse.jdt.core.formatter.insert_space_after_colon_in_labeled_statement=insert +org.eclipse.jdt.core.formatter.insert_space_after_comma_in_allocation_expression=insert +org.eclipse.jdt.core.formatter.insert_space_after_comma_in_annotation=insert +org.eclipse.jdt.core.formatter.insert_space_after_comma_in_array_initializer=insert +org.eclipse.jdt.core.formatter.insert_space_after_comma_in_constructor_declaration_parameters=insert +org.eclipse.jdt.core.formatter.insert_space_after_comma_in_constructor_declaration_throws=insert +org.eclipse.jdt.core.formatter.insert_space_after_comma_in_enum_constant_arguments=insert +org.eclipse.jdt.core.formatter.insert_space_after_comma_in_enum_declarations=insert +org.eclipse.jdt.core.formatter.insert_space_after_comma_in_explicitconstructorcall_arguments=insert +org.eclipse.jdt.core.formatter.insert_space_after_comma_in_for_increments=insert +org.eclipse.jdt.core.formatter.insert_space_after_comma_in_for_inits=insert +org.eclipse.jdt.core.formatter.insert_space_after_comma_in_method_declaration_parameters=insert +org.eclipse.jdt.core.formatter.insert_space_after_comma_in_method_declaration_throws=insert +org.eclipse.jdt.core.formatter.insert_space_after_comma_in_method_invocation_arguments=insert +org.eclipse.jdt.core.formatter.insert_space_after_comma_in_multiple_field_declarations=insert +org.eclipse.jdt.core.formatter.insert_space_after_comma_in_multiple_local_declarations=insert +org.eclipse.jdt.core.formatter.insert_space_after_comma_in_parameterized_type_reference=insert +org.eclipse.jdt.core.formatter.insert_space_after_comma_in_superinterfaces=insert +org.eclipse.jdt.core.formatter.insert_space_after_comma_in_type_arguments=insert +org.eclipse.jdt.core.formatter.insert_space_after_comma_in_type_parameters=insert +org.eclipse.jdt.core.formatter.insert_space_after_ellipsis=insert +org.eclipse.jdt.core.formatter.insert_space_after_opening_angle_bracket_in_parameterized_type_reference=do not insert +org.eclipse.jdt.core.formatter.insert_space_after_opening_angle_bracket_in_type_arguments=do not insert +org.eclipse.jdt.core.formatter.insert_space_after_opening_angle_bracket_in_type_parameters=do not insert +org.eclipse.jdt.core.formatter.insert_space_after_opening_brace_in_array_initializer=insert +org.eclipse.jdt.core.formatter.insert_space_after_opening_bracket_in_array_allocation_expression=do not insert +org.eclipse.jdt.core.formatter.insert_space_after_opening_bracket_in_array_reference=do not insert +org.eclipse.jdt.core.formatter.insert_space_after_opening_paren_in_annotation=do not insert +org.eclipse.jdt.core.formatter.insert_space_after_opening_paren_in_cast=do not insert +org.eclipse.jdt.core.formatter.insert_space_after_opening_paren_in_catch=do not insert +org.eclipse.jdt.core.formatter.insert_space_after_opening_paren_in_constructor_declaration=do not insert +org.eclipse.jdt.core.formatter.insert_space_after_opening_paren_in_enum_constant=do not insert +org.eclipse.jdt.core.formatter.insert_space_after_opening_paren_in_for=do not insert +org.eclipse.jdt.core.formatter.insert_space_after_opening_paren_in_if=do not insert +org.eclipse.jdt.core.formatter.insert_space_after_opening_paren_in_method_declaration=do not insert +org.eclipse.jdt.core.formatter.insert_space_after_opening_paren_in_method_invocation=do not insert +org.eclipse.jdt.core.formatter.insert_space_after_opening_paren_in_parenthesized_expression=do not insert +org.eclipse.jdt.core.formatter.insert_space_after_opening_paren_in_switch=do not insert +org.eclipse.jdt.core.formatter.insert_space_after_opening_paren_in_synchronized=do not insert +org.eclipse.jdt.core.formatter.insert_space_after_opening_paren_in_while=do not insert +org.eclipse.jdt.core.formatter.insert_space_after_postfix_operator=do not insert +org.eclipse.jdt.core.formatter.insert_space_after_prefix_operator=do not insert +org.eclipse.jdt.core.formatter.insert_space_after_question_in_conditional=insert +org.eclipse.jdt.core.formatter.insert_space_after_question_in_wildcard=do not insert +org.eclipse.jdt.core.formatter.insert_space_after_semicolon_in_for=insert +org.eclipse.jdt.core.formatter.insert_space_after_unary_operator=do not insert +org.eclipse.jdt.core.formatter.insert_space_before_and_in_type_parameter=insert +org.eclipse.jdt.core.formatter.insert_space_before_assignment_operator=insert +org.eclipse.jdt.core.formatter.insert_space_before_at_in_annotation_type_declaration=insert +org.eclipse.jdt.core.formatter.insert_space_before_binary_operator=insert +org.eclipse.jdt.core.formatter.insert_space_before_closing_angle_bracket_in_parameterized_type_reference=do not insert +org.eclipse.jdt.core.formatter.insert_space_before_closing_angle_bracket_in_type_arguments=do not insert +org.eclipse.jdt.core.formatter.insert_space_before_closing_angle_bracket_in_type_parameters=do not insert +org.eclipse.jdt.core.formatter.insert_space_before_closing_brace_in_array_initializer=insert +org.eclipse.jdt.core.formatter.insert_space_before_closing_bracket_in_array_allocation_expression=do not insert +org.eclipse.jdt.core.formatter.insert_space_before_closing_bracket_in_array_reference=do not insert +org.eclipse.jdt.core.formatter.insert_space_before_closing_paren_in_annotation=do not insert +org.eclipse.jdt.core.formatter.insert_space_before_closing_paren_in_cast=do not insert +org.eclipse.jdt.core.formatter.insert_space_before_closing_paren_in_catch=do not insert +org.eclipse.jdt.core.formatter.insert_space_before_closing_paren_in_constructor_declaration=do not insert +org.eclipse.jdt.core.formatter.insert_space_before_closing_paren_in_enum_constant=do not insert +org.eclipse.jdt.core.formatter.insert_space_before_closing_paren_in_for=do not insert +org.eclipse.jdt.core.formatter.insert_space_before_closing_paren_in_if=do not insert +org.eclipse.jdt.core.formatter.insert_space_before_closing_paren_in_method_declaration=do not insert +org.eclipse.jdt.core.formatter.insert_space_before_closing_paren_in_method_invocation=do not insert +org.eclipse.jdt.core.formatter.insert_space_before_closing_paren_in_parenthesized_expression=do not insert +org.eclipse.jdt.core.formatter.insert_space_before_closing_paren_in_switch=do not insert +org.eclipse.jdt.core.formatter.insert_space_before_closing_paren_in_synchronized=do not insert +org.eclipse.jdt.core.formatter.insert_space_before_closing_paren_in_while=do not insert +org.eclipse.jdt.core.formatter.insert_space_before_colon_in_assert=insert +org.eclipse.jdt.core.formatter.insert_space_before_colon_in_case=do not insert +org.eclipse.jdt.core.formatter.insert_space_before_colon_in_conditional=insert +org.eclipse.jdt.core.formatter.insert_space_before_colon_in_default=do not insert +org.eclipse.jdt.core.formatter.insert_space_before_colon_in_for=insert +org.eclipse.jdt.core.formatter.insert_space_before_colon_in_labeled_statement=do not insert +org.eclipse.jdt.core.formatter.insert_space_before_comma_in_allocation_expression=do not insert +org.eclipse.jdt.core.formatter.insert_space_before_comma_in_annotation=do not insert +org.eclipse.jdt.core.formatter.insert_space_before_comma_in_array_initializer=do not insert +org.eclipse.jdt.core.formatter.insert_space_before_comma_in_constructor_declaration_parameters=do not insert +org.eclipse.jdt.core.formatter.insert_space_before_comma_in_constructor_declaration_throws=do not insert +org.eclipse.jdt.core.formatter.insert_space_before_comma_in_enum_constant_arguments=do not insert +org.eclipse.jdt.core.formatter.insert_space_before_comma_in_enum_declarations=do not insert +org.eclipse.jdt.core.formatter.insert_space_before_comma_in_explicitconstructorcall_arguments=do not insert +org.eclipse.jdt.core.formatter.insert_space_before_comma_in_for_increments=do not insert +org.eclipse.jdt.core.formatter.insert_space_before_comma_in_for_inits=do not insert +org.eclipse.jdt.core.formatter.insert_space_before_comma_in_method_declaration_parameters=do not insert +org.eclipse.jdt.core.formatter.insert_space_before_comma_in_method_declaration_throws=do not insert +org.eclipse.jdt.core.formatter.insert_space_before_comma_in_method_invocation_arguments=do not insert +org.eclipse.jdt.core.formatter.insert_space_before_comma_in_multiple_field_declarations=do not insert +org.eclipse.jdt.core.formatter.insert_space_before_comma_in_multiple_local_declarations=do not insert +org.eclipse.jdt.core.formatter.insert_space_before_comma_in_parameterized_type_reference=do not insert +org.eclipse.jdt.core.formatter.insert_space_before_comma_in_superinterfaces=do not insert +org.eclipse.jdt.core.formatter.insert_space_before_comma_in_type_arguments=do not insert +org.eclipse.jdt.core.formatter.insert_space_before_comma_in_type_parameters=do not insert +org.eclipse.jdt.core.formatter.insert_space_before_ellipsis=do not insert +org.eclipse.jdt.core.formatter.insert_space_before_opening_angle_bracket_in_parameterized_type_reference=do not insert +org.eclipse.jdt.core.formatter.insert_space_before_opening_angle_bracket_in_type_arguments=do not insert +org.eclipse.jdt.core.formatter.insert_space_before_opening_angle_bracket_in_type_parameters=do not insert +org.eclipse.jdt.core.formatter.insert_space_before_opening_brace_in_annotation_type_declaration=insert +org.eclipse.jdt.core.formatter.insert_space_before_opening_brace_in_anonymous_type_declaration=insert +org.eclipse.jdt.core.formatter.insert_space_before_opening_brace_in_array_initializer=insert +org.eclipse.jdt.core.formatter.insert_space_before_opening_brace_in_block=insert +org.eclipse.jdt.core.formatter.insert_space_before_opening_brace_in_constructor_declaration=insert +org.eclipse.jdt.core.formatter.insert_space_before_opening_brace_in_enum_constant=insert +org.eclipse.jdt.core.formatter.insert_space_before_opening_brace_in_enum_declaration=insert +org.eclipse.jdt.core.formatter.insert_space_before_opening_brace_in_method_declaration=insert +org.eclipse.jdt.core.formatter.insert_space_before_opening_brace_in_switch=insert +org.eclipse.jdt.core.formatter.insert_space_before_opening_brace_in_type_declaration=insert +org.eclipse.jdt.core.formatter.insert_space_before_opening_bracket_in_array_allocation_expression=do not insert +org.eclipse.jdt.core.formatter.insert_space_before_opening_bracket_in_array_reference=do not insert +org.eclipse.jdt.core.formatter.insert_space_before_opening_bracket_in_array_type_reference=do not insert +org.eclipse.jdt.core.formatter.insert_space_before_opening_paren_in_annotation=do not insert +org.eclipse.jdt.core.formatter.insert_space_before_opening_paren_in_annotation_type_member_declaration=do not insert +org.eclipse.jdt.core.formatter.insert_space_before_opening_paren_in_catch=insert +org.eclipse.jdt.core.formatter.insert_space_before_opening_paren_in_constructor_declaration=do not insert +org.eclipse.jdt.core.formatter.insert_space_before_opening_paren_in_enum_constant=do not insert +org.eclipse.jdt.core.formatter.insert_space_before_opening_paren_in_for=insert +org.eclipse.jdt.core.formatter.insert_space_before_opening_paren_in_if=insert +org.eclipse.jdt.core.formatter.insert_space_before_opening_paren_in_method_declaration=do not insert +org.eclipse.jdt.core.formatter.insert_space_before_opening_paren_in_method_invocation=do not insert +org.eclipse.jdt.core.formatter.insert_space_before_opening_paren_in_parenthesized_expression=do not insert +org.eclipse.jdt.core.formatter.insert_space_before_opening_paren_in_switch=insert +org.eclipse.jdt.core.formatter.insert_space_before_opening_paren_in_synchronized=insert +org.eclipse.jdt.core.formatter.insert_space_before_opening_paren_in_while=insert +org.eclipse.jdt.core.formatter.insert_space_before_parenthesized_expression_in_return=insert +org.eclipse.jdt.core.formatter.insert_space_before_parenthesized_expression_in_throw=insert +org.eclipse.jdt.core.formatter.insert_space_before_postfix_operator=do not insert +org.eclipse.jdt.core.formatter.insert_space_before_prefix_operator=do not insert +org.eclipse.jdt.core.formatter.insert_space_before_question_in_conditional=insert +org.eclipse.jdt.core.formatter.insert_space_before_question_in_wildcard=do not insert +org.eclipse.jdt.core.formatter.insert_space_before_semicolon=do not insert +org.eclipse.jdt.core.formatter.insert_space_before_semicolon_in_for=do not insert +org.eclipse.jdt.core.formatter.insert_space_before_unary_operator=do not insert +org.eclipse.jdt.core.formatter.insert_space_between_brackets_in_array_type_reference=do not insert +org.eclipse.jdt.core.formatter.insert_space_between_empty_braces_in_array_initializer=do not insert +org.eclipse.jdt.core.formatter.insert_space_between_empty_brackets_in_array_allocation_expression=do not insert +org.eclipse.jdt.core.formatter.insert_space_between_empty_parens_in_annotation_type_member_declaration=do not insert +org.eclipse.jdt.core.formatter.insert_space_between_empty_parens_in_constructor_declaration=do not insert +org.eclipse.jdt.core.formatter.insert_space_between_empty_parens_in_enum_constant=do not insert +org.eclipse.jdt.core.formatter.insert_space_between_empty_parens_in_method_declaration=do not insert +org.eclipse.jdt.core.formatter.insert_space_between_empty_parens_in_method_invocation=do not insert +org.eclipse.jdt.core.formatter.join_lines_in_comments=true +org.eclipse.jdt.core.formatter.join_wrapped_lines=true +org.eclipse.jdt.core.formatter.keep_else_statement_on_same_line=false +org.eclipse.jdt.core.formatter.keep_empty_array_initializer_on_one_line=false +org.eclipse.jdt.core.formatter.keep_imple_if_on_one_line=false +org.eclipse.jdt.core.formatter.keep_then_statement_on_same_line=false +org.eclipse.jdt.core.formatter.lineSplit=80 +org.eclipse.jdt.core.formatter.never_indent_block_comments_on_first_column=false +org.eclipse.jdt.core.formatter.never_indent_line_comments_on_first_column=false +org.eclipse.jdt.core.formatter.number_of_blank_lines_at_beginning_of_method_body=0 +org.eclipse.jdt.core.formatter.number_of_empty_lines_to_preserve=1 +org.eclipse.jdt.core.formatter.put_empty_statement_on_new_line=true +org.eclipse.jdt.core.formatter.tabulation.char=space +org.eclipse.jdt.core.formatter.tabulation.size=4 +org.eclipse.jdt.core.formatter.use_tabs_only_for_leading_indentations=false +org.eclipse.jdt.core.formatter.wrap_before_binary_operator=true diff --git a/.settings/org.eclipse.jdt.ui.prefs b/.settings/org.eclipse.jdt.ui.prefs index c2785a51e..94bdf85fb 100644 --- a/.settings/org.eclipse.jdt.ui.prefs +++ b/.settings/org.eclipse.jdt.ui.prefs @@ -1,56 +1,57 @@ -#Thu May 07 20:41:20 PDT 2009 -eclipse.preferences.version=1 -editor_save_participant_org.eclipse.jdt.ui.postsavelistener.cleanup=true -org.eclipse.jdt.ui.javadoc=false -org.eclipse.jdt.ui.text.custom_code_templates= -sp_cleanup.add_default_serial_version_id=true -sp_cleanup.add_generated_serial_version_id=false -sp_cleanup.add_missing_annotations=true -sp_cleanup.add_missing_deprecated_annotations=true -sp_cleanup.add_missing_methods=false -sp_cleanup.add_missing_nls_tags=false -sp_cleanup.add_missing_override_annotations=true -sp_cleanup.add_serial_version_id=false -sp_cleanup.always_use_blocks=true -sp_cleanup.always_use_parentheses_in_expressions=false -sp_cleanup.always_use_this_for_non_static_field_access=false -sp_cleanup.always_use_this_for_non_static_method_access=false -sp_cleanup.convert_to_enhanced_for_loop=false -sp_cleanup.correct_indentation=false -sp_cleanup.format_source_code=false -sp_cleanup.format_source_code_changes_only=false -sp_cleanup.make_local_variable_final=false -sp_cleanup.make_parameters_final=false -sp_cleanup.make_private_fields_final=false -sp_cleanup.make_type_abstract_if_missing_method=false -sp_cleanup.make_variable_declarations_final=true -sp_cleanup.never_use_blocks=false -sp_cleanup.never_use_parentheses_in_expressions=true -sp_cleanup.on_save_use_additional_actions=true -sp_cleanup.organize_imports=true -sp_cleanup.qualify_static_field_accesses_with_declaring_class=false -sp_cleanup.qualify_static_member_accesses_through_instances_with_declaring_class=true -sp_cleanup.qualify_static_member_accesses_through_subtypes_with_declaring_class=true -sp_cleanup.qualify_static_member_accesses_with_declaring_class=false -sp_cleanup.qualify_static_method_accesses_with_declaring_class=false -sp_cleanup.remove_private_constructors=true -sp_cleanup.remove_trailing_whitespaces=true -sp_cleanup.remove_trailing_whitespaces_all=true -sp_cleanup.remove_trailing_whitespaces_ignore_empty=false -sp_cleanup.remove_unnecessary_casts=true -sp_cleanup.remove_unnecessary_nls_tags=false -sp_cleanup.remove_unused_imports=true -sp_cleanup.remove_unused_local_variables=false -sp_cleanup.remove_unused_private_fields=true -sp_cleanup.remove_unused_private_members=false -sp_cleanup.remove_unused_private_methods=true -sp_cleanup.remove_unused_private_types=true -sp_cleanup.sort_members=false -sp_cleanup.sort_members_all=false -sp_cleanup.use_blocks=false -sp_cleanup.use_blocks_only_for_return_and_throw=false -sp_cleanup.use_parentheses_in_expressions=false -sp_cleanup.use_this_for_non_static_field_access=false -sp_cleanup.use_this_for_non_static_field_access_only_if_necessary=true -sp_cleanup.use_this_for_non_static_method_access=false -sp_cleanup.use_this_for_non_static_method_access_only_if_necessary=true +#Thu Jul 02 10:50:56 PDT 2009 +cleanup.add_default_serial_version_id=true +cleanup.add_generated_serial_version_id=false +cleanup.add_missing_annotations=true +cleanup.add_missing_deprecated_annotations=true +cleanup.add_missing_methods=false +cleanup.add_missing_nls_tags=false +cleanup.add_missing_override_annotations=true +cleanup.add_serial_version_id=true +cleanup.always_use_blocks=true +cleanup.always_use_parentheses_in_expressions=false +cleanup.always_use_this_for_non_static_field_access=false +cleanup.always_use_this_for_non_static_method_access=false +cleanup.convert_to_enhanced_for_loop=false +cleanup.correct_indentation=false +cleanup.format_source_code=false +cleanup.format_source_code_changes_only=false +cleanup.make_local_variable_final=true +cleanup.make_parameters_final=false +cleanup.make_private_fields_final=true +cleanup.make_type_abstract_if_missing_method=false +cleanup.make_variable_declarations_final=false +cleanup.never_use_blocks=false +cleanup.never_use_parentheses_in_expressions=true +cleanup.organize_imports=true +cleanup.qualify_static_field_accesses_with_declaring_class=false +cleanup.qualify_static_member_accesses_through_instances_with_declaring_class=true +cleanup.qualify_static_member_accesses_through_subtypes_with_declaring_class=true +cleanup.qualify_static_member_accesses_with_declaring_class=true +cleanup.qualify_static_method_accesses_with_declaring_class=false +cleanup.remove_private_constructors=true +cleanup.remove_trailing_whitespaces=true +cleanup.remove_trailing_whitespaces_all=true +cleanup.remove_trailing_whitespaces_ignore_empty=false +cleanup.remove_unnecessary_casts=true +cleanup.remove_unnecessary_nls_tags=true +cleanup.remove_unused_imports=true +cleanup.remove_unused_local_variables=false +cleanup.remove_unused_private_fields=true +cleanup.remove_unused_private_members=false +cleanup.remove_unused_private_methods=true +cleanup.remove_unused_private_types=true +cleanup.sort_members=false +cleanup.sort_members_all=false +cleanup.use_blocks=false +cleanup.use_blocks_only_for_return_and_throw=false +cleanup.use_parentheses_in_expressions=false +cleanup.use_this_for_non_static_field_access=false +cleanup.use_this_for_non_static_field_access_only_if_necessary=true +cleanup.use_this_for_non_static_method_access=false +cleanup.use_this_for_non_static_method_access_only_if_necessary=true +cleanup_profile=_Astrid +cleanup_settings_version=2 +eclipse.preferences.version=1 +formatter_profile=_Astrid +formatter_settings_version=11 +org.eclipse.jdt.ui.text.custom_code_templates= diff --git a/api-src/com/todoroo/astrid/api/AstridApiConstants.java b/api-src/com/todoroo/astrid/api/AstridApiConstants.java new file mode 100644 index 000000000..b8b73a6ab --- /dev/null +++ b/api-src/com/todoroo/astrid/api/AstridApiConstants.java @@ -0,0 +1,123 @@ +/** + * See the file "LICENSE" for the full license governing this code. + */ +package com.todoroo.astrid.api; + +/** + * Constants for interfacing with Astrid. + * + * @author Tim Su + */ +@SuppressWarnings("nls") +public class AstridApiConstants { + + // --- General Constants + + /** + * Astrid application package name + */ + public static final String PACKAGE = "com.todoroo.astrid"; + + /** + * Permission for reading tasks and receiving to GET_FILTERS intent + */ + public static final String PERMISSION_READ = PACKAGE + ".READ"; + + /** + * Permission for writing and creating tasks + */ + public static final String PERMISSION_WRITE = PACKAGE + ".WRITE"; + + /** + * Extras name for Task id + */ + public static final String EXTRAS_TASK_ID = "task"; + + /** + * Extras name for an array of response items + */ + public static final String EXTRAS_ITEMS = "items"; + + /** + * Extras name for your plug-in name, used for logging errors to LogCat + */ + public static final String EXTRAS_PLUGIN = "plugin"; + + // --- Filters API + + /** + * Action name for broadcast intent requesting filters + */ + public static final String BROADCAST_REQUEST_FILTERS = PACKAGE + ".REQUEST_FILTERS"; + + /** + * Action name for broadcast intent sending filters back to Astrid + */ + public static final String BROADCAST_SEND_FILTERS = PACKAGE + ".SEND_FILTERS"; + + // --- Edit Operations API + + /** + * Action name for broadcast intent requesting task edit operations + */ + public static final String BROADCAST_REQUEST_EDIT_OPERATIONS = PACKAGE + ".REQUEST_EDIT_OPERATIONS"; + + /** + * Action name for broadcast intent sending task edit operations back to Astrid + */ + public static final String BROADCAST_SEND_EDIT_OPERATIONS = PACKAGE + ".SEND_EDIT_OPERATIONS"; + + // --- Task List Details API + + /** + * Action name for broadcast intent requesting task list details for a task + */ + public static final String BROADCAST_REQUEST_DETAILS = PACKAGE + ".REQUEST_DETAILS"; + + /** + * Action name for broadcast intent sending details back to Astrid + */ + public static final String BROADCAST_SEND_DETAILS = PACKAGE + ".SEND_DETAILS"; + + // --- Actions API + + /** + * Action name for intents to be displayed on task context menu + */ + public static final String ACTION_TASK_CONTEXT_MENU = PACKAGE + ".CONTEXT_MENU"; + + /** + * Action name for intents to be displayed on Astrid's task list menu + */ + public static final String ACTION_TASK_LIST_MENU = PACKAGE + ".TASK_LIST_MENU"; + + /** + * Action name for intents to be displayed in Astrid's settings + */ + public static final String ACTION_SETTINGS = PACKAGE + ".SETTINGS"; + + // --- Events API + + /** + * Action name for broadcast intent notifying that task was completed + */ + public static final String BROADCAST_EVENT_TASK_COMPLETED = PACKAGE + ".TASK_COMPLETED"; + + /** + * Action name for broadcast intent notifying that task was created + */ + public static final String BROADCAST_EVENT_TASK_CREATED = PACKAGE + ".TASK_CREATED"; + + // --- SQL Constants + + /** + * Table name for tasks + */ + public static final String TASK_TABLE = "tasks"; + + /** + * Table name for metadata + */ + public static final String METADATA_TABLE = "metadata"; + +} diff --git a/api-src/com/todoroo/astrid/api/AstridContentProvider.java b/api-src/com/todoroo/astrid/api/AstridContentProvider.java new file mode 100644 index 000000000..8e581258a --- /dev/null +++ b/api-src/com/todoroo/astrid/api/AstridContentProvider.java @@ -0,0 +1,194 @@ +/** + * See the file "LICENSE" for the full license governing this code. + */ +package com.todoroo.astrid.api; + +import android.net.Uri; + +/** + * Constants for interfacing with Astrid's Content Providers. + * + * @author Tim Su + */ +@SuppressWarnings("nls") +public class AstridContentProvider { + + /** + * Content Provider + */ + public static final String PROVIDER = "com.todoroo.astrid.provider"; + + // --- methods for generating URI's for accessing Astrid data + + /** + * URI for: + *
    + *
  • Queries on multiple tasks + *
  • Inserting new tasks + *
  • Deleting multiple tasks at a time + *
  • Updating multiple tasks at a time + *
+ * If your selection clause contains metadata columns, you need to use + * allItemsWithMetadataUri instead of this one. + */ + public static Uri allItemsUri() { + return Uri.parse("content://" + PROVIDER + "/items"); + } + + /** + * URI for: + *
    + *
  • Querying on tasks with metadata columns in selection + *
  • Deleting multiple tasks with metadata columns in selection + *
  • Updating multiple tasks with metadata columns in selection + *
+ * If, for example, you have defined metadata key 'tag' and wish to delete + * all tasks where 'tag' = 'deleteme', you would use this URI. For querying + * or insertion, use allItemsUri. + *

+ * For queries, allItemsUri will be more efficient, but will + * not work if your selection clause contains columns not mentioned in your + * projection + * + * @param metadata + * array of metadata columns you wish to select using + * + */ + public static Uri allItemsWithMetadataUri(String[] metadata) { + if(metadata == null || metadata.length == 0) + throw new IllegalArgumentException("You must provide metadata"); + StringBuilder builder = new StringBuilder(); + for(int i = 0; i < metadata.length; i++) + builder.append(escapeUriSubComponent(metadata[i])).append( + SUB_COMPONENT_SEPARATOR); + + return Uri.parse("content://" + PROVIDER + "/itemsWith/" + + escapeUriComponent(builder.toString())); + } + + /** + * URI for: + *

    + *
  • Queries on a single task + *
  • Updating fields for a single task + *
  • Deleting a single task + *
+ * + * @param id + * id of task to fetch + */ + public static Uri singleItemUri(long id) { + return Uri.parse("content://" + PROVIDER + "/" + id); + } + + /** + * URI for: + *
    + *
  • Queries on multiple tasks, grouped by column + *
+ * @param groupBy + * column name to group by + */ + public static Uri groupByUri(String groupBy) { + groupBy = escapeUriComponent(groupBy); + return Uri.parse("content://" + PROVIDER + "/groupby/" + groupBy); + } + + // --- task built-in columns and constnats + + /** + * A task in Astrid represents a single item in a user's task list + * + * @author Tim Su + */ + public static class AstridTask { + + // --- columns + + /** long: Task id */ + public static final String ID = AstridApiConstants.TASK_TABLE + "._id"; + + /** String: name of Task */ + public static final String TITLE = AstridApiConstants.TASK_TABLE + + ".title"; + + /** + * int: Task Urgency setting (see Task.URGENCY_* for + * possible values) + */ + public static final String URGENCY = AstridApiConstants.TASK_TABLE + + ".urgency"; + + /** + * int: Task Importance setting (see Task.IMPORTANCE_* for + * possible values) + */ + public static final String IMPORTANCE = AstridApiConstants.TASK_TABLE + + ".importance"; + + /** int: unixtime Task is due, 0 if not set */ + public static final String DUE_DATE = AstridApiConstants.TASK_TABLE + + ".dueDate"; + + /** int: unixtime Task should be hidden until, 0 if not set */ + public static final String HIDDEN_UNTIL = AstridApiConstants.TASK_TABLE + + ".hiddenUntil"; + + /** int: unixtime Task was created */ + public static final String CREATION_DATE = AstridApiConstants.TASK_TABLE + + ".creationDate"; + + /** int: unixtime Task was completed, 0 if task not completed */ + public static final String COMPLETION_DATE = AstridApiConstants.TASK_TABLE + + ".completionDate"; + + /** int: unixtime Task was deleted, 0 if task not deleted */ + public static final String DELETION_DATE = AstridApiConstants.TASK_TABLE + + ".deletionDate"; + + // --- urgency settings + + public static final int URGENCY_NONE = 0; + public static final int URGENCY_TODAY = 1; + public static final int URGENCY_THIS_WEEK = 2; + public static final int URGENCY_THIS_MONTH = 3; + public static final int URGENCY_WITHIN_THREE_MONTHS = 4; + public static final int URGENCY_WITHIN_SIX_MONTHS = 5; + public static final int URGENCY_WITHIN_A_YEAR = 6; + public static final int URGENCY_SPECIFIC_DAY = 7; + public static final int URGENCY_SPECIFIC_DAY_TIME = 8; + + // --- importance settings + + public static final int IMPORTANCE_DO_OR_DIE = 0; + public static final int IMPORTANCE_MUST_DO = 1; + public static final int IMPORTANCE_SHOULD_DO = 2; + public static final int IMPORTANCE_NONE = 3; + + } + + // --- internal methods + + /** + * Escapes a string for use in a URI. Used internally to pass extra data + * to the content provider. + * @param component + * @return + */ + private static String escapeUriComponent(String component) { + return component.replace("%", "%o").replace("/", "%s"); + } + + private static final String SUB_COMPONENT_SEPARATOR = "|"; + + /** + * Escapes a string for use as part of a URI string. Used internally to pass extra data + * to the content provider. + * @param component + * @return + */ + private static String escapeUriSubComponent(String component) { + return component.replace("$", "$o").replace(SUB_COMPONENT_SEPARATOR, "$s"); + } + +} diff --git a/api-src/com/todoroo/astrid/api/EditOperation.java b/api-src/com/todoroo/astrid/api/EditOperation.java new file mode 100644 index 000000000..779b40689 --- /dev/null +++ b/api-src/com/todoroo/astrid/api/EditOperation.java @@ -0,0 +1,84 @@ +/** + * See the file "LICENSE" for the full license governing this code. + */ +package com.todoroo.astrid.api; + +import android.content.Intent; +import android.os.Parcel; +import android.os.Parcelable; + +/** + * Represents an intent that can be called on a task being edited + * + * @author Tim Su + * + */ +public class EditOperation implements Parcelable { + + /** + * Plugin Id + */ + public String plugin = null; + + /** + * Label + */ + public String text = null; + + /** + * Intent to call when invoking this operation + */ + public Intent intent = null; + + /** + * Create an EditOperation object + * + * @param text + * label to display + * @param intent + * intent to invoke. {@link EXTRAS_TASK_ID} will be passed + */ + public EditOperation(String text, Intent intent) { + super(); + this.text = text; + this.intent = intent; + } + + // --- parcelable helpers + + /** + * {@inheritDoc} + */ + public int describeContents() { + return 0; + } + + /** + * {@inheritDoc} + */ + public void writeToParcel(Parcel dest, int flags) { + dest.writeString(text); + dest.writeParcelable(intent, 0); + } + + /** + * Parcelable creator + */ + public static final Parcelable.Creator CREATOR = new Parcelable.Creator() { + /** + * {@inheritDoc} + */ + public EditOperation createFromParcel(Parcel source) { + return new EditOperation(source.readString(), (Intent)source.readParcelable( + Intent.class.getClassLoader())); + } + + /** + * {@inheritDoc} + */ + public EditOperation[] newArray(int size) { + return new EditOperation[size]; + }; + }; + +} diff --git a/api-src/com/todoroo/astrid/api/Filter.java b/api-src/com/todoroo/astrid/api/Filter.java new file mode 100644 index 000000000..bd2e45c9e --- /dev/null +++ b/api-src/com/todoroo/astrid/api/Filter.java @@ -0,0 +1,140 @@ +/** + * See the file "LICENSE" for the full license governing this code. + */ +package com.todoroo.astrid.api; + +import android.os.Parcel; +import android.os.Parcelable; + +import com.todoroo.astrid.api.AstridContentProvider.AstridTask; + +/** + * A FilterListFilter allows users to display tasks that have + * something in common. + *

+ * A plug-in can expose new FilterListFilters to the system by + * responding to the com.todoroo.astrid.GET_FILTERS broadcast + * intent. + * + * @author Tim Su + * + */ +public class Filter extends FilterListItem { + + /** + * Expanded title of this filter. This is displayed at the top + * of the screen when user is viewing this filter. + *

+ * e.g "Tasks With Notes" + */ + public String title; + + /** + * SQL query for this filter. The query will be appended to the select + * statement after "SELECT fields FROM table %s". Use + * {@link AstridApiConstants.TASK_TABLE} and + * {@link AstridApiConstants.METADATA_TABLE} as table names, + * {@link AstridTask} for field names. + *

+ * Examples: + *

    + *
  • " WHERE completionDate = 0" + *
  • " INNER JOIN " + + * Constants.TABLE_METADATA + " ON metadata.task = tasks.id WHERE + * metadata.namespace = " + NAMESPACE + " AND metadata.key = 'a' AND + * metadata.value = 'b' GROUP BY tasks.id ORDER BY tasks.title" + *
+ */ + public String sqlQuery; + + /** + * SQL query to execute on a task when quick-creating a new task while viewing + * this filter. For example, when a user views tasks tagged 'ABC', the + * tasks they create should also be tagged 'ABC'. If set to null, no + * query will be executed. In this string, $ID will be replaced with the + * task id. + *

+ * Examples: + *

    + *
  • "INSERT INTO " + Constants.TABLE_METADATA + " (task, + * namespace, key, string) VALUES ($ID, " + ... + ")" + *
  • "UPDATE " + Constants.TABLE_TASK + " SET urgency = 0 + * WHERE _id = $ID" + *
+ */ + public String sqlForNewTasks = null; + + /** + * Utility constructor for creating a TaskList object + * + * @param listingTitle + * Title of this item as displayed on the lists page, e.g. Inbox + * @param title + * Expanded title of this filter when user is viewing this + * filter, e.g. Inbox (20 tasks) + * @param sqlQuery + * SQL query for this list (see {@link sqlQuery} for examples). + * @param sqlForNewTasks + * see {@link sqlForNewTasks} + */ + public Filter(String listingTitle, + String title, String sqlQuery, String sqlForNewTasks) { + this.listingTitle = listingTitle; + this.title = title; + this.sqlQuery = sqlQuery; + this.sqlForNewTasks = sqlForNewTasks; + } + + /** + * Blank constructor + */ + public Filter() { + // + } + + // --- parcelable + + /** + * {@inheritDoc} + */ + public int describeContents() { + return 0; + } + + /** + * {@inheritDoc} + */ + @Override + public void writeToParcel(Parcel dest, int flags) { + super.writeToParcel(dest, flags); + dest.writeString(title); + dest.writeString(sqlQuery); + dest.writeString(sqlForNewTasks); + } + + /** + * Parcelable Creator Object + */ + public static final Parcelable.Creator CREATOR = new Parcelable.Creator() { + + /** + * {@inheritDoc} + */ + public Filter createFromParcel(Parcel source) { + Filter item = new Filter(); + item.readFromParcel(source); + item.title = source.readString(); + item.sqlQuery = source.readString(); + item.sqlForNewTasks = source.readString(); + return item; + } + + /** + * {@inheritDoc} + */ + public Filter[] newArray(int size) { + return new Filter[size]; + } + + }; +} diff --git a/api-src/com/todoroo/astrid/api/FilterCategory.java b/api-src/com/todoroo/astrid/api/FilterCategory.java new file mode 100644 index 000000000..a95ffb802 --- /dev/null +++ b/api-src/com/todoroo/astrid/api/FilterCategory.java @@ -0,0 +1,95 @@ +/** + * See the file "LICENSE" for the full license governing this code. + */ +package com.todoroo.astrid.api; + +import android.os.Parcel; +import android.os.Parcelable; + +/** + * A FilterCategory groups common {@link Filter}s and allows + * a user to show/hide all of its children. + * + * @author Tim Su + * + */ +public class FilterCategory extends FilterListItem { + + /** + * {@link Filter}s contained by this category + */ + public Filter[] children; + + /** + * Constructor for creating a new FilterCategory + * + * @param listingTitle + * Title of this item as displayed on the lists page, e.g. Inbox + * @param children + * filters belonging to this category + */ + public FilterCategory(String listingTitle, + Filter[] children) { + this.listingTitle = listingTitle; + this.children = children; + } + + /** + * Blank constructor + */ + public FilterCategory() { + // + } + + // --- parcelable + + /** + * {@inheritDoc} + */ + public int describeContents() { + return 0; + } + + /** + * {@inheritDoc} + */ + @Override + public void writeToParcel(Parcel dest, int flags) { + super.writeToParcel(dest, flags); + dest.writeParcelableArray(children, 0); + } + + /** + * Parcelable creator + */ + public static final Parcelable.Creator CREATOR = new Parcelable.Creator() { + + /** + * {@inheritDoc} + */ + public FilterCategory createFromParcel(Parcel source) { + FilterCategory item = new FilterCategory(); + item.readFromParcel(source); + + Parcelable[] parcelableChildren = source.readParcelableArray( + FilterCategory.class.getClassLoader()); + item.children = new Filter[parcelableChildren.length]; + for(int i = 0; i < item.children.length; i++) { + if(parcelableChildren[i] instanceof FilterListItem) + item.children[i] = (Filter) parcelableChildren[i]; + else + item.children[i] = null; + } + + return item; + } + + /** + * {@inheritDoc} + */ + public FilterCategory[] newArray(int size) { + return new FilterCategory[size]; + } + + }; +} diff --git a/api-src/com/todoroo/astrid/api/FilterListHeader.java b/api-src/com/todoroo/astrid/api/FilterListHeader.java new file mode 100644 index 000000000..b980a49e8 --- /dev/null +++ b/api-src/com/todoroo/astrid/api/FilterListHeader.java @@ -0,0 +1,58 @@ +/** + * See the file "LICENSE" for the full license governing this code. + */ +package com.todoroo.astrid.api; + +import android.os.Parcel; +import android.os.Parcelable; + +/** + * Section Header for Filter List + * + * @author Tim Su + * + */ +public class FilterListHeader extends FilterListItem { + + /** + * Constructor for creating a new FilterListHeader + * + * @param listingTitle + * @param listingIconResource + * @param priority + */ + public FilterListHeader(String listingTitle) { + this.listingTitle = listingTitle; + } + + /** + * Empty constructor + */ + public FilterListHeader() { + // + } + + // --- parcelable + + public int describeContents() { + return 0; + } + + public void writeToParcel(Parcel dest, int flags) { + super.writeToParcel(dest, flags); + } + + public static final Parcelable.Creator CREATOR = new Parcelable.Creator() { + + public FilterListHeader createFromParcel(Parcel source) { + FilterListHeader item = new FilterListHeader(); + item.readFromParcel(source); + return item; + } + + public FilterListHeader[] newArray(int size) { + return new FilterListHeader[size]; + } + + }; +} diff --git a/api-src/com/todoroo/astrid/api/FilterListItem.java b/api-src/com/todoroo/astrid/api/FilterListItem.java new file mode 100644 index 000000000..f0eab9ec8 --- /dev/null +++ b/api-src/com/todoroo/astrid/api/FilterListItem.java @@ -0,0 +1,73 @@ +/** + * See the file "LICENSE" for the full license governing this code. + */ +package com.todoroo.astrid.api; + +import android.content.Intent; +import android.graphics.Bitmap; +import android.os.Parcel; +import android.os.Parcelable; + +/** + * Represents an item displayed by Astrid's FilterListActivity + * + * @author Tim Su + * + */ +abstract public class FilterListItem implements Parcelable { + + /** + * Title of this item displayed on the Filters page + */ + public String listingTitle = null; + + /** + * Bitmap for icon used on listing page. null => no icon + */ + public Bitmap listingIcon = null; + + /** + * Context Menu labels. The context menu will be displayed when users + * long-press on this filter list item. + */ + public String contextMenuLabels[] = new String[0]; + + /** + * Context menu intents. This intent will be started when the corresponding + * content menu label is invoked. This array must be the same size as + * the contextMenuLabels array. + */ + public Intent contextMenuIntents[] = new Intent[0]; + + // --- parcelable helpers + + /** + * {@inheritDoc} + */ + public void writeToParcel(Parcel dest, int flags) { + dest.writeString(listingTitle); + dest.writeParcelable(listingIcon, 0); + + // write array lengths before arrays + dest.writeInt(contextMenuLabels.length); + dest.writeStringArray(contextMenuLabels); + dest.writeInt(contextMenuIntents.length); + dest.writeTypedArray(contextMenuIntents, 0); + } + + /** + * Utility method to read FilterListItem properties from a parcel. + * @param source + */ + public void readFromParcel(Parcel source) { + listingTitle = source.readString(); + listingIcon = source.readParcelable(Bitmap.class.getClassLoader()); + + int length = source.readInt(); + contextMenuLabels = new String[length]; + source.readStringArray(contextMenuLabels); + length = source.readInt(); + contextMenuIntents = new Intent[length]; + source.readTypedArray(contextMenuIntents, Intent.CREATOR); + } +} diff --git a/api-src/com/todoroo/astrid/api/TaskDetail.java b/api-src/com/todoroo/astrid/api/TaskDetail.java new file mode 100644 index 000000000..573a7b35c --- /dev/null +++ b/api-src/com/todoroo/astrid/api/TaskDetail.java @@ -0,0 +1,89 @@ +/** + * See the file "LICENSE" for the full license governing this code. + */ +package com.todoroo.astrid.api; + +import android.os.Parcel; +import android.os.Parcelable; + +/** + * Represents a line of text displayed in the Task List + * + * @author Tim Su + * + */ +public class TaskDetail implements Parcelable { + + /** + * Text of detail + */ + public String text = null; + + /** + * Color to use for text. 0 is default + */ + public int color = 0; + + /** + * Creates a TaskDetail object + * + * @param text + * text to display + * @param color + * color to use for text. Use 0 for default color + */ + public TaskDetail(String text, int color) { + super(); + this.text = text; + this.color = color; + } + + /** + * Convenience constructor to make a TaskDetail with default color + * + * @param text + * text to display + */ + public TaskDetail(String text) { + this(text, 0); + } + + + // --- parcelable helpers + + + /** + * {@inheritDoc} + */ + public int describeContents() { + return 0; + } + + /** + * {@inheritDoc} + */ + public void writeToParcel(Parcel dest, int flags) { + dest.writeString(text); + dest.writeInt(color); + } + + /** + * Parcelable creator + */ + public static final Parcelable.Creator CREATOR = new Parcelable.Creator() { + /** + * {@inheritDoc} + */ + public TaskDetail createFromParcel(Parcel source) { + return new TaskDetail(source.readString(), source.readInt()); + } + + /** + * {@inheritDoc} + */ + public TaskDetail[] newArray(int size) { + return new TaskDetail[size]; + }; + }; + +} diff --git a/bzrtogit.sh b/bzrtogit.sh deleted file mode 100644 index 64c3fb7b6..000000000 --- a/bzrtogit.sh +++ /dev/null @@ -1,58 +0,0 @@ -#!/bin/bash -# BzrToGit - SCM migration tool for going from bzr to git -# Copyright (C) 2009 Henrik Nilsson -# -# This program is free software: you can redistribute it and/or modify -# it under the terms of the GNU General Public License, version 3, as -# published by the Free Software Foundation. -# -# This program is distributed in the hope that it will be useful, -# but WITHOUT ANY WARRANTY; without even the implied warranty of -# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -# GNU General Public License for more details. -# -# You should have received a copy of the GNU General Public License -# along with this program. If not, see . - -keepbzr="no" -for x in $@; do - if [ "$x" = "--keepbzr" ]; then keepbzr="yes" - elif [ "$x" = "--help" ]; then - echo "--keepbzr = Keep the .bzr directory so that it can still be used by bazaar" - echo "--help = Display this list" - exit - else echo "${x}: unknown argument, type --help to see available arguments"; exit 1; fi -done - -rev=1 -git init -while bzr revert -r revno:$rev 2> /dev/null; do - logentry="`bzr log -r $rev`" - committer="`echo "$logentry" | sed -n -e "/^committer:/{s/^committer: //;p;}"`" - timestamp="`echo "$logentry" | sed -n -e "/^timestamp:/{s/^timestamp: //;p;}"`" - export GIT_AUTHOR_DATE="$timestamp" - msg=`echo "$logentry" | sed -e "1,/^message:/d"` - committer_name=`echo "$committer" | sed -e "s/ *<[^<]*\$//;"` - committer_email=`echo "$committer" | sed -e "s/.*//;"` - - if [ "$committer_email" == "tim@todoroo.com" -o \ - "$committer_email" == "dev.astrid" -o \ - "$committer_email" == "timsu@global" -o \ - "$committer_email" == "timsu@ayumi" -o \ - "$committer_email" == "timsu@betaful.com" ]; then - committer_name="Tim Su" - committer_email="tim@todoroo.com" - echo ts hack - fi - - git config user.name "$committer_name" - git config user.email "$committer_email" - ls -a1 | while read x; do - if [ "$x" != ".bzr" ] && [ "$x" != "." ] && [ "$x" != ".." ]; then git add "$x"; fi - done - git commit -a -m "$msg" -# --author="$committer" - let rev+=1 -done - -[ "$keepbzr" != "yes" ] && rm -r .bzr diff --git a/common-src/com/todoroo/andlib/data b/common-src/com/todoroo/andlib/data new file mode 160000 index 000000000..fadb4e8ec --- /dev/null +++ b/common-src/com/todoroo/andlib/data @@ -0,0 +1 @@ +Subproject commit fadb4e8ec3ae20c13639bfce4bda592ca58887b0 diff --git a/common-src/com/todoroo/andlib/service b/common-src/com/todoroo/andlib/service new file mode 160000 index 000000000..7779c960b --- /dev/null +++ b/common-src/com/todoroo/andlib/service @@ -0,0 +1 @@ +Subproject commit 7779c960b5aadf90a14ce5443ae0320887d96d62 diff --git a/common-src/com/todoroo/andlib/utility b/common-src/com/todoroo/andlib/utility new file mode 160000 index 000000000..c76bbfbec --- /dev/null +++ b/common-src/com/todoroo/andlib/utility @@ -0,0 +1 @@ +Subproject commit c76bbfbec66190b074f9fcc1235dd480982d7fe8 diff --git a/common-src/com/todoroo/andlib/widget b/common-src/com/todoroo/andlib/widget new file mode 160000 index 000000000..7d25ec740 --- /dev/null +++ b/common-src/com/todoroo/andlib/widget @@ -0,0 +1 @@ +Subproject commit 7d25ec740e80a4e424bbb6d3934a2a78e799024d diff --git a/external-src/com/.svn/all-wcprops b/external-src/com/.svn/all-wcprops new file mode 100644 index 000000000..3674a4311 --- /dev/null +++ b/external-src/com/.svn/all-wcprops @@ -0,0 +1,5 @@ +K 25 +svn:wc:ra_dav:version-url +V 29 +/svn/!svn/ver/9/trunk/src/com +END diff --git a/external-src/com/.svn/entries b/external-src/com/.svn/entries new file mode 100644 index 000000000..39403209e --- /dev/null +++ b/external-src/com/.svn/entries @@ -0,0 +1,31 @@ +10 + +dir +9 +http://sql-dsl.googlecode.com/svn/trunk/src/com +http://sql-dsl.googlecode.com/svn + + + +2009-09-14T16:21:07.644789Z +9 +skyairmj + + + + + + + + + + + + + + +425b5e3a-bc29-11dd-9cb5-179210ed59e1 + +thoughtworks +dir + diff --git a/external-src/com/thoughtworks/.svn/all-wcprops b/external-src/com/thoughtworks/.svn/all-wcprops new file mode 100644 index 000000000..734e95172 --- /dev/null +++ b/external-src/com/thoughtworks/.svn/all-wcprops @@ -0,0 +1,5 @@ +K 25 +svn:wc:ra_dav:version-url +V 42 +/svn/!svn/ver/9/trunk/src/com/thoughtworks +END diff --git a/external-src/com/thoughtworks/.svn/entries b/external-src/com/thoughtworks/.svn/entries new file mode 100644 index 000000000..125c67e1f --- /dev/null +++ b/external-src/com/thoughtworks/.svn/entries @@ -0,0 +1,31 @@ +10 + +dir +9 +http://sql-dsl.googlecode.com/svn/trunk/src/com/thoughtworks +http://sql-dsl.googlecode.com/svn + + + +2009-09-14T16:21:07.644789Z +9 +skyairmj + + + + + + + + + + + + + + +425b5e3a-bc29-11dd-9cb5-179210ed59e1 + +sql +dir + diff --git a/external-src/com/thoughtworks/sql/.svn/all-wcprops b/external-src/com/thoughtworks/sql/.svn/all-wcprops new file mode 100644 index 000000000..9532b2b6f --- /dev/null +++ b/external-src/com/thoughtworks/sql/.svn/all-wcprops @@ -0,0 +1,89 @@ +K 25 +svn:wc:ra_dav:version-url +V 46 +/svn/!svn/ver/9/trunk/src/com/thoughtworks/sql +END +Join.java +K 25 +svn:wc:ra_dav:version-url +V 56 +/svn/!svn/ver/2/trunk/src/com/thoughtworks/sql/Join.java +END +JoinType.java +K 25 +svn:wc:ra_dav:version-url +V 60 +/svn/!svn/ver/2/trunk/src/com/thoughtworks/sql/JoinType.java +END +Field.java +K 25 +svn:wc:ra_dav:version-url +V 57 +/svn/!svn/ver/9/trunk/src/com/thoughtworks/sql/Field.java +END +EqCriterion.java +K 25 +svn:wc:ra_dav:version-url +V 63 +/svn/!svn/ver/6/trunk/src/com/thoughtworks/sql/EqCriterion.java +END +Query.java +K 25 +svn:wc:ra_dav:version-url +V 57 +/svn/!svn/ver/9/trunk/src/com/thoughtworks/sql/Query.java +END +GroupBy.java +K 25 +svn:wc:ra_dav:version-url +V 59 +/svn/!svn/ver/8/trunk/src/com/thoughtworks/sql/GroupBy.java +END +Table.java +K 25 +svn:wc:ra_dav:version-url +V 57 +/svn/!svn/ver/2/trunk/src/com/thoughtworks/sql/Table.java +END +Operator.java +K 25 +svn:wc:ra_dav:version-url +V 60 +/svn/!svn/ver/6/trunk/src/com/thoughtworks/sql/Operator.java +END +Order.java +K 25 +svn:wc:ra_dav:version-url +V 57 +/svn/!svn/ver/2/trunk/src/com/thoughtworks/sql/Order.java +END +DBObject.java +K 25 +svn:wc:ra_dav:version-url +V 60 +/svn/!svn/ver/2/trunk/src/com/thoughtworks/sql/DBObject.java +END +Constants.java +K 25 +svn:wc:ra_dav:version-url +V 61 +/svn/!svn/ver/6/trunk/src/com/thoughtworks/sql/Constants.java +END +UnaryCriterion.java +K 25 +svn:wc:ra_dav:version-url +V 66 +/svn/!svn/ver/6/trunk/src/com/thoughtworks/sql/UnaryCriterion.java +END +OrderType.java +K 25 +svn:wc:ra_dav:version-url +V 61 +/svn/!svn/ver/2/trunk/src/com/thoughtworks/sql/OrderType.java +END +Criterion.java +K 25 +svn:wc:ra_dav:version-url +V 61 +/svn/!svn/ver/9/trunk/src/com/thoughtworks/sql/Criterion.java +END diff --git a/external-src/com/thoughtworks/sql/.svn/entries b/external-src/com/thoughtworks/sql/.svn/entries new file mode 100644 index 000000000..6edabf455 --- /dev/null +++ b/external-src/com/thoughtworks/sql/.svn/entries @@ -0,0 +1,504 @@ +10 + +dir +9 +http://sql-dsl.googlecode.com/svn/trunk/src/com/thoughtworks/sql +http://sql-dsl.googlecode.com/svn + + + +2009-09-14T16:21:07.644789Z +9 +skyairmj + + + + + + + + + + + + + + +425b5e3a-bc29-11dd-9cb5-179210ed59e1 + +Join.java +file + + + + +2010-05-06T06:36:13.019258Z +c1e5f7f7d7d81ad72b1f07ab99820ab5 +2008-11-27T02:38:24.003892Z +2 +skyairmj + + + + + + + + + + + + + + + + + + + + + +1443 + +JoinType.java +file + + + + +2010-05-06T06:36:13.019258Z +df10b08c524945571f70238293721b11 +2008-11-27T02:38:24.003892Z +2 +skyairmj + + + + + + + + + + + + + + + + + + + + + +89 + +Field.java +file + + + + +2010-05-06T06:36:13.019258Z +4d4527967174e402c342b88b220dcb42 +2009-09-14T16:21:07.644789Z +9 +skyairmj + + + + + + + + + + + + + + + + + + + + + +2649 + +EqCriterion.java +file + + + + +2010-05-06T06:36:13.019258Z +f5df9e0718577c4fff1f1e6c1d3aed5b +2008-11-28T15:27:46.936810Z +6 +skyairmj + + + + + + + + + + + + + + + + + + + + + +247 + +Query.java +file + + + + +2010-05-06T06:36:13.019258Z +645cd8c0ce2c6a4c718b8aae93c33c09 +2009-09-14T16:21:07.644789Z +9 +skyairmj + + + + + + + + + + + + + + + + + + + + + +4347 + +GroupBy.java +file + + + + +2010-05-06T06:36:13.019258Z +207373b4f7bb84163e84a848ffe64f1c +2008-12-04T13:44:00.210147Z +8 +skyairmj + + + + + + + + + + + + + + + + + + + + + +335 + +Table.java +file + + + + +2010-05-06T06:36:13.019258Z +459da435c7835c3324e249cd05c96013 +2008-11-27T02:38:24.003892Z +2 +skyairmj + + + + + + + + + + + + + + + + + + + + + +455 + +Operator.java +file + + + + +2010-05-06T06:36:13.029258Z +c7825d746fdfaf34522c6c4883de0cca +2008-11-28T15:27:46.936810Z +6 +skyairmj + + + + + + + + + + + + + + + + + + + + + +2137 + +Order.java +file + + + + +2010-05-06T06:36:13.029258Z +15d650e70ceca0ebf670feff4b7c65fb +2008-11-27T02:38:24.003892Z +2 +skyairmj + + + + + + + + + + + + + + + + + + + + + +740 + +DBObject.java +file + + + + +2010-05-06T06:36:13.029258Z +0911aae9fbf364ab5ac3286f2edcab7c +2008-11-27T02:38:24.003892Z +2 +skyairmj + + + + + + + + + + + + + + + + + + + + + +1456 + +Constants.java +file + + + + +2010-05-06T06:36:13.029258Z +1e42cd9e9b62c0ef16b66de997b7d53b +2008-11-28T15:27:46.936810Z +6 +skyairmj + + + + + + + + + + + + + + + + + + + + + +818 + +UnaryCriterion.java +file + + + + +2010-05-06T06:36:13.029258Z +2047998a7b77e8ca3b4c4bb4049025cd +2008-11-28T15:27:46.936810Z +6 +skyairmj + + + + + + + + + + + + + + + + + + + + + +2328 + +OrderType.java +file + + + + +2010-05-06T06:36:13.029258Z +07e3e9d757d9b3dfb87cfa71e2d9daac +2008-11-27T02:38:24.003892Z +2 +skyairmj + + + + + + + + + + + + + + + + + + + + + +76 + +Criterion.java +file + + + + +2010-05-06T06:36:13.029258Z +39757450b5a87a9501ab77fe3c5f9f16 +2009-09-14T16:21:07.644789Z +9 +skyairmj + + + + + + + + + + + + + + + + + + + + + +2222 + diff --git a/external-src/com/thoughtworks/sql/.svn/text-base/Constants.java.svn-base b/external-src/com/thoughtworks/sql/.svn/text-base/Constants.java.svn-base new file mode 100644 index 000000000..89f8cb778 --- /dev/null +++ b/external-src/com/thoughtworks/sql/.svn/text-base/Constants.java.svn-base @@ -0,0 +1,22 @@ +package com.thoughtworks.sql; + +public class Constants { + static final String SELECT = "SELECT"; + static final String SPACE = " "; + static final String AS = "AS"; + static final String COMMA = ","; + static final String FROM = "FROM"; + static final String ON = "ON"; + static final String JOIN = "JOIN"; + static final String ALL = "*"; + static final String LEFT_PARENTHESIS = "("; + static final String RIGHT_PARENTHESIS = ")"; + static final String AND = "AND"; + static final String BETWEEN = "BETWEEN"; + static final String LIKE = "LIKE"; + static final String OR = "OR"; + static final String ORDER_BY = "ORDER BY"; + static final String GROUP_BY = "GROUP BY"; + static final String WHERE = "WHERE"; + public static final String EXISTS = "EXISTS"; +} diff --git a/external-src/com/thoughtworks/sql/.svn/text-base/Criterion.java.svn-base b/external-src/com/thoughtworks/sql/.svn/text-base/Criterion.java.svn-base new file mode 100644 index 000000000..5ad83057e --- /dev/null +++ b/external-src/com/thoughtworks/sql/.svn/text-base/Criterion.java.svn-base @@ -0,0 +1,69 @@ +package com.thoughtworks.sql; + +import static com.thoughtworks.sql.Constants.AND; +import static com.thoughtworks.sql.Constants.EXISTS; +import static com.thoughtworks.sql.Constants.LEFT_PARENTHESIS; +import static com.thoughtworks.sql.Constants.OR; +import static com.thoughtworks.sql.Constants.RIGHT_PARENTHESIS; +import static com.thoughtworks.sql.Constants.SPACE; + +public abstract class Criterion { + protected final Operator operator; + + Criterion(Operator operator) { + this.operator = operator; + } + + public static Criterion and(final Criterion criterion, final Criterion... criterions) { + return new Criterion(Operator.and) { + + protected void populate(StringBuilder sb) { + sb.append(criterion); + for (Criterion criterion : criterions) { + sb.append(SPACE).append(AND).append(SPACE).append(criterion); + } + } + }; + } + + public static Criterion or(final Criterion criterion, final Criterion... criterions) { + return new Criterion(Operator.or) { + + protected void populate(StringBuilder sb) { + sb.append(criterion); + for (Criterion criterion : criterions) { + sb.append(SPACE).append(OR).append(SPACE).append(criterion.toString()); + } + } + }; + } + + public static Criterion exists(final Query query) { + return new Criterion(Operator.exists) { + + protected void populate(StringBuilder sb) { + sb.append(EXISTS).append(SPACE).append(LEFT_PARENTHESIS).append(query).append(RIGHT_PARENTHESIS); + } + }; + } + + public static Criterion not(Criterion criterion) { + return new Criterion(null) { + + protected void populate(StringBuilder sb) { + + } + }; + } + + protected abstract void populate(StringBuilder sb); + + @Override + public String toString() { + StringBuilder builder = new StringBuilder(LEFT_PARENTHESIS); + populate(builder); + builder.append(RIGHT_PARENTHESIS); + return builder.toString(); + } + +} diff --git a/external-src/com/thoughtworks/sql/.svn/text-base/DBObject.java.svn-base b/external-src/com/thoughtworks/sql/.svn/text-base/DBObject.java.svn-base new file mode 100644 index 000000000..675706cc2 --- /dev/null +++ b/external-src/com/thoughtworks/sql/.svn/text-base/DBObject.java.svn-base @@ -0,0 +1,51 @@ +package com.thoughtworks.sql; + +import static com.thoughtworks.sql.Constants.SPACE; +import static com.thoughtworks.sql.Constants.AS; + +public abstract class DBObject { + protected String alias; + protected final String expression; + + protected DBObject(String expression){ + this.expression = expression; + } + + public T as(String alias) { + this.alias = alias; + return (T) this; + } + + public boolean hasAlias() { + return alias != null; + } + + @Override + public boolean equals(Object o) { + if (this == o) return true; + if (o == null || getClass() != o.getClass()) return false; + + DBObject dbObject = (DBObject) o; + + if (alias != null ? !alias.equals(dbObject.alias) : dbObject.alias != null) return false; + if (expression != null ? !expression.equals(dbObject.expression) : dbObject.expression != null) return false; + + return true; + } + + @Override + public int hashCode() { + int result = alias != null ? alias.hashCode() : 0; + result = 31 * result + (expression != null ? expression.hashCode() : 0); + return result; + } + + @Override + public String toString() { + StringBuilder sb = new StringBuilder(expression); + if (hasAlias()) { + sb.append(SPACE).append(AS).append(SPACE).append(alias); + } + return sb.toString(); + } +} diff --git a/external-src/com/thoughtworks/sql/.svn/text-base/EqCriterion.java.svn-base b/external-src/com/thoughtworks/sql/.svn/text-base/EqCriterion.java.svn-base new file mode 100644 index 000000000..529bcc4a5 --- /dev/null +++ b/external-src/com/thoughtworks/sql/.svn/text-base/EqCriterion.java.svn-base @@ -0,0 +1,10 @@ +package com.thoughtworks.sql; + +public class EqCriterion extends UnaryCriterion { + private final Object value; + + EqCriterion(Field field, Object value) { + super(field, Operator.eq, value); + this.value = value; + } +} diff --git a/external-src/com/thoughtworks/sql/.svn/text-base/Field.java.svn-base b/external-src/com/thoughtworks/sql/.svn/text-base/Field.java.svn-base new file mode 100644 index 000000000..8c66000dd --- /dev/null +++ b/external-src/com/thoughtworks/sql/.svn/text-base/Field.java.svn-base @@ -0,0 +1,83 @@ +package com.thoughtworks.sql; + +import static com.thoughtworks.sql.Constants.AND; +import static com.thoughtworks.sql.Constants.BETWEEN; +import static com.thoughtworks.sql.Constants.COMMA; +import static com.thoughtworks.sql.Constants.LEFT_PARENTHESIS; +import static com.thoughtworks.sql.Constants.RIGHT_PARENTHESIS; +import static com.thoughtworks.sql.Constants.SPACE; + +public class Field extends DBObject { + + protected Field(String expression) { + super(expression); + } + + public static Field field(String expression) { + return new Field(expression); + } + + public Criterion eq(Object value) { + return UnaryCriterion.eq(this, value); + } + + public Criterion neq(Object value) { + return UnaryCriterion.neq(this, value); + } + + public Criterion gt(Object value) { + return UnaryCriterion.gt(this, value); + } + + public Criterion lt(final Object value) { + return UnaryCriterion.lt(this, value); + } + + public Criterion isNull() { + return UnaryCriterion.isNull(this); + } + + public Criterion isNotNull() { + return UnaryCriterion.isNotNull(this); + } + + public Criterion between(final Object lower, final Object upper) { + final Field field = this; + return new Criterion(null) { + + protected void populate(StringBuilder sb) { + sb.append(field).append(SPACE).append(BETWEEN).append(SPACE).append(lower).append(SPACE).append(AND) + .append(SPACE).append(upper); + } + }; + } + + public Criterion like(final String value) { + return UnaryCriterion.like(this, value); + } + + public Criterion in(final T... value) { + final Field field = this; + return new Criterion(Operator.in) { + + protected void populate(StringBuilder sb) { + sb.append(field).append(SPACE).append(Operator.in).append(SPACE).append(LEFT_PARENTHESIS); + for (T t : value) { + sb.append(t.toString()).append(COMMA); + } + sb.deleteCharAt(sb.length() - 1).append(RIGHT_PARENTHESIS); + } + }; + } + + public Criterion in(final Field expression, final Query query) { + final Field field = this; + return new Criterion(Operator.in) { + + protected void populate(StringBuilder sb) { + sb.append(field).append(SPACE).append(Operator.in).append(SPACE).append(LEFT_PARENTHESIS).append(query) + .append(RIGHT_PARENTHESIS); + } + }; + } +} diff --git a/external-src/com/thoughtworks/sql/.svn/text-base/GroupBy.java.svn-base b/external-src/com/thoughtworks/sql/.svn/text-base/GroupBy.java.svn-base new file mode 100644 index 000000000..620262f83 --- /dev/null +++ b/external-src/com/thoughtworks/sql/.svn/text-base/GroupBy.java.svn-base @@ -0,0 +1,14 @@ +package com.thoughtworks.sql; + +import java.util.List; +import java.util.ArrayList; + +public class GroupBy { + private List fields = new ArrayList(); + + public static GroupBy groupBy(Field field) { + GroupBy groupBy = new GroupBy(); + groupBy.fields.add(field); + return groupBy; + } +} diff --git a/external-src/com/thoughtworks/sql/.svn/text-base/Join.java.svn-base b/external-src/com/thoughtworks/sql/.svn/text-base/Join.java.svn-base new file mode 100644 index 000000000..975236776 --- /dev/null +++ b/external-src/com/thoughtworks/sql/.svn/text-base/Join.java.svn-base @@ -0,0 +1,43 @@ +package com.thoughtworks.sql; + +import static com.thoughtworks.sql.Constants.SPACE; +import static com.thoughtworks.sql.Constants.JOIN; +import static com.thoughtworks.sql.Constants.ON; + +public class Join { + private final Table joinTable; + private final JoinType joinType; + private final Criterion[] criterions; + + private Join(Table table, JoinType joinType, Criterion... criterions) { + joinTable = table; + this.joinType = joinType; + this.criterions = criterions; + } + + public static Join inner(Table expression, Criterion... criterions) { + return new Join(expression, JoinType.INNER, criterions); + } + + public static Join left(Table table, Criterion... criterions) { + return new Join(table, JoinType.LEFT, criterions); + } + + public static Join right(Table table, Criterion... criterions) { + return new Join(table, JoinType.RIGHT, criterions); + } + + public static Join out(Table table, Criterion... criterions) { + return new Join(table, JoinType.OUT, criterions); + } + + @Override + public String toString() { + StringBuilder sb = new StringBuilder(); + sb.append(joinType).append(SPACE).append(JOIN).append(SPACE).append(joinTable).append(SPACE).append(ON); + for (Criterion criterion : criterions) { + sb.append(SPACE).append(criterion); + } + return sb.toString(); + } +} diff --git a/external-src/com/thoughtworks/sql/.svn/text-base/JoinType.java.svn-base b/external-src/com/thoughtworks/sql/.svn/text-base/JoinType.java.svn-base new file mode 100644 index 000000000..77b094306 --- /dev/null +++ b/external-src/com/thoughtworks/sql/.svn/text-base/JoinType.java.svn-base @@ -0,0 +1,5 @@ +package com.thoughtworks.sql; + +public enum JoinType { + INNER, LEFT, RIGHT, OUT +} diff --git a/external-src/com/thoughtworks/sql/.svn/text-base/Operator.java.svn-base b/external-src/com/thoughtworks/sql/.svn/text-base/Operator.java.svn-base new file mode 100644 index 000000000..548ff8e2a --- /dev/null +++ b/external-src/com/thoughtworks/sql/.svn/text-base/Operator.java.svn-base @@ -0,0 +1,57 @@ +package com.thoughtworks.sql; + +import static com.thoughtworks.sql.Constants.SPACE; + +import java.util.HashMap; +import java.util.Map; + +public final class Operator { + + private final String operator; + private static final Operator ZERO = new Operator(""); + public static final Operator eq = new Operator("="); + public static final Operator neq = new Operator("<>"); + public static final Operator isNull = new Operator("IS NULL"); + public static final Operator isNotNull = new Operator("IS NOT NULL"); + public static final Operator gt = new Operator(">"); + public static final Operator lt = new Operator("<"); + public static final Operator gte = new Operator(">="); + public static final Operator lte = new Operator("<="); + public static final Operator and = new Operator("AND"); + public static final Operator or = new Operator("OR"); + public static final Operator not = new Operator("NOT"); + public static final Operator exists = new Operator("EXISTS"); + public static final Operator like = new Operator("LIKE"); + public static final Operator in = new Operator("IN"); + + private static final Map contraryRegistry = new HashMap(); + + static { + contraryRegistry.put(eq, neq); + contraryRegistry.put(neq, eq); + contraryRegistry.put(isNull, isNotNull); + contraryRegistry.put(isNotNull, isNull); + contraryRegistry.put(gt, lte); + contraryRegistry.put(lte, gt); + contraryRegistry.put(lt, gte); + contraryRegistry.put(gte, lt); + } + + private Operator(String operator) { + this.operator = operator; + } + + public Operator getContrary() { + if(!contraryRegistry.containsKey(this)){ + Operator opposite = new Operator(not.toString() + SPACE + this.toString()); + contraryRegistry.put(this, opposite); + contraryRegistry.put(opposite, this); + } + return contraryRegistry.get(this); + } + + @Override + public String toString() { + return this.operator.toString(); + } +} diff --git a/external-src/com/thoughtworks/sql/.svn/text-base/Order.java.svn-base b/external-src/com/thoughtworks/sql/.svn/text-base/Order.java.svn-base new file mode 100644 index 000000000..67e1aa0ab --- /dev/null +++ b/external-src/com/thoughtworks/sql/.svn/text-base/Order.java.svn-base @@ -0,0 +1,30 @@ +package com.thoughtworks.sql; + +import static com.thoughtworks.sql.Constants.SPACE; + +public class Order { + private final Field expression; + private final OrderType orderType; + + private Order(Field expression) { + this(expression, OrderType.ASC); + } + + private Order(Field expression, OrderType orderType) { + this.expression = expression; + this.orderType = orderType; + } + + public static Order asc(Field expression) { + return new Order(expression); + } + + public static Order desc(Field expression) { + return new Order(expression, OrderType.DESC); + } + + @Override + public String toString() { + return expression + SPACE + orderType; + } +} diff --git a/external-src/com/thoughtworks/sql/.svn/text-base/OrderType.java.svn-base b/external-src/com/thoughtworks/sql/.svn/text-base/OrderType.java.svn-base new file mode 100644 index 000000000..d907270c9 --- /dev/null +++ b/external-src/com/thoughtworks/sql/.svn/text-base/OrderType.java.svn-base @@ -0,0 +1,5 @@ +package com.thoughtworks.sql; + +public enum OrderType { + DESC, ASC +} diff --git a/external-src/com/thoughtworks/sql/.svn/text-base/Query.java.svn-base b/external-src/com/thoughtworks/sql/.svn/text-base/Query.java.svn-base new file mode 100644 index 000000000..12f863f57 --- /dev/null +++ b/external-src/com/thoughtworks/sql/.svn/text-base/Query.java.svn-base @@ -0,0 +1,153 @@ +package com.thoughtworks.sql; + +import static com.thoughtworks.sql.Constants.*; +import static com.thoughtworks.sql.Table.table; + +import java.util.ArrayList; +import static java.util.Arrays.asList; +import java.util.List; + +public class Query { + + private Table table; + private List criterions = new ArrayList(); + private List fields = new ArrayList(); + private List joins = new ArrayList(); + private List groupBies = new ArrayList(); + private List orders = new ArrayList(); + private List havings = new ArrayList(); + + private Query(Field... fields) { + this.fields.addAll(asList(fields)); + } + + public static Query select(Field... fields) { + return new Query(fields); + } + + public Query from(Table table) { + this.table = table; + return this; + } + + public Query join(Join... join) { + joins.addAll(asList(join)); + return this; + } + + public Query where(Criterion criterion) { + criterions.add(criterion); + return this; + } + + public Query groupBy(Field... groupBy) { + groupBies.addAll(asList(groupBy)); + return this; + } + + public Query orderBy(Order... order) { + orders.addAll(asList(order)); + return this; + } + + public Query appendSelectFields(Field... fields) { + this.fields.addAll(asList(fields)); + return this; + } + + @Override + public boolean equals(Object o) { + return this == o || !(o == null || getClass() != o.getClass()) && this.toString().equals(o.toString()); + } + + @Override + public int hashCode() { + return toString().hashCode(); + } + + @Override + public String toString() { + StringBuilder sql = new StringBuilder(); + visitSelectClause(sql); + visitFromClause(sql); + visitJoinClause(sql); + visitWhereClause(sql); + visitGroupByClause(sql); + visitOrderByClause(sql); + return sql.toString(); + } + + private void visitOrderByClause(StringBuilder sql) { + if (orders.isEmpty()) { + return; + } + sql.append(ORDER_BY); + for (Order order : orders) { + sql.append(SPACE).append(order).append(COMMA); + } + sql.deleteCharAt(sql.length() - 1).append(SPACE); + } + + private void visitGroupByClause(StringBuilder sql) { + if (groupBies.isEmpty()) { + return; + } + sql.append(GROUP_BY); + for (Field groupBy : groupBies) { + sql.append(SPACE).append(groupBy).append(COMMA); + } + sql.deleteCharAt(sql.length() - 1).append(SPACE); + if (havings.isEmpty()) { + return; + } + sql.append("HAVING"); + for (Criterion havingCriterion : havings) { + sql.append(SPACE).append(havingCriterion).append(COMMA); + } + sql.deleteCharAt(sql.length() - 1).append(SPACE); + } + + private void visitWhereClause(StringBuilder sql) { + if (criterions.isEmpty()) { + return; + } + sql.append(WHERE); + for (Criterion criterion : criterions) { + sql.append(SPACE).append(criterion).append(SPACE); + } + } + + private void visitJoinClause(StringBuilder sql) { + for (Join join : joins) { + sql.append(join).append(SPACE); + } + } + + private void visitFromClause(StringBuilder sql) { + if (table == null) { + return; + } + sql.append(FROM).append(SPACE).append(table).append(SPACE); + } + + private void visitSelectClause(StringBuilder sql) { + sql.append(SELECT).append(SPACE); + if (fields.isEmpty()) { + sql.append(ALL).append(SPACE); + return; + } + for (Field field : fields) { + sql.append(field).append(COMMA); + } + sql.deleteCharAt(sql.length() - 1).append(SPACE); + } + + public Table as(String alias) { + return table(LEFT_PARENTHESIS + this.toString() + RIGHT_PARENTHESIS).as(alias); + } + + public Query having(Criterion criterion) { + this.havings.add(criterion); + return this; + } +} diff --git a/external-src/com/thoughtworks/sql/.svn/text-base/Table.java.svn-base b/external-src/com/thoughtworks/sql/.svn/text-base/Table.java.svn-base new file mode 100644 index 000000000..2aeb9cf7e --- /dev/null +++ b/external-src/com/thoughtworks/sql/.svn/text-base/Table.java.svn-base @@ -0,0 +1,19 @@ +package com.thoughtworks.sql; + +public class Table extends DBObject { + + protected Table(String expression) { + super(expression); + } + + public static Table table(String table) { + return new Table(table); + } + + public Field field(String fieldName) { + if (hasAlias()) { + return Field.field(alias + "." + fieldName); + } + return Field.field(expression+"."+fieldName); + } +} diff --git a/external-src/com/thoughtworks/sql/.svn/text-base/UnaryCriterion.java.svn-base b/external-src/com/thoughtworks/sql/.svn/text-base/UnaryCriterion.java.svn-base new file mode 100644 index 000000000..9d83c5542 --- /dev/null +++ b/external-src/com/thoughtworks/sql/.svn/text-base/UnaryCriterion.java.svn-base @@ -0,0 +1,75 @@ +package com.thoughtworks.sql; + +import static com.thoughtworks.sql.Constants.SPACE; + +public class UnaryCriterion extends Criterion { + protected final Field expression; + protected final Object value; + + UnaryCriterion(Field expression, Operator operator, Object value) { + super(operator); + this.expression = expression; + this.value = value; + } + + protected void populate(StringBuilder sb) { + beforePopulateOperator(sb); + populateOperator(sb); + afterPopulateOperator(sb); + } + + public static Criterion eq(Field expression, Object value) { + return new UnaryCriterion(expression, Operator.eq, value); + } + + protected void beforePopulateOperator(StringBuilder sb) { + sb.append(expression); + } + + protected void populateOperator(StringBuilder sb) { + sb.append(operator); + } + + protected void afterPopulateOperator(StringBuilder sb) { + sb.append(value == null ? "" : value); + } + + public static Criterion neq(Field field, Object value) { + return new UnaryCriterion(field, Operator.neq, value); + } + + public static Criterion gt(Field field, Object value) { + return new UnaryCriterion(field, Operator.gt, value); + } + + public static Criterion lt(Field field, Object value) { + return new UnaryCriterion(field, Operator.lt, value); + } + + public static Criterion isNull(Field field) { + return new UnaryCriterion(field, Operator.isNull, null) { + @Override + protected void populateOperator(StringBuilder sb) { + sb.append(SPACE).append(operator); + } + }; + } + + public static Criterion isNotNull(Field field) { + return new UnaryCriterion(field, Operator.isNotNull, null) { + @Override + protected void populateOperator(StringBuilder sb) { + sb.append(SPACE).append(operator); + } + }; + } + + public static Criterion like(Field field, String value) { + return new UnaryCriterion(field, Operator.like, value) { + @Override + protected void populateOperator(StringBuilder sb) { + sb.append(SPACE).append(operator).append(SPACE); + } + }; + } +} diff --git a/external-src/com/thoughtworks/sql/Constants.java b/external-src/com/thoughtworks/sql/Constants.java new file mode 100644 index 000000000..f24107289 --- /dev/null +++ b/external-src/com/thoughtworks/sql/Constants.java @@ -0,0 +1,24 @@ +package com.thoughtworks.sql; + +@SuppressWarnings("nls") +public class Constants { + static final String SELECT = "SELECT"; + static final String SPACE = " "; + static final String AS = "AS"; + static final String COMMA = ","; + static final String FROM = "FROM"; + static final String ON = "ON"; + static final String JOIN = "JOIN"; + static final String ALL = "*"; + static final String LEFT_PARENTHESIS = "("; + static final String RIGHT_PARENTHESIS = ")"; + static final String AND = "AND"; + static final String BETWEEN = "BETWEEN"; + static final String LIKE = "LIKE"; + static final String OR = "OR"; + static final String ORDER_BY = "ORDER BY"; + static final String GROUP_BY = "GROUP BY"; + static final String WHERE = "WHERE"; + public static final String EXISTS = "EXISTS"; + public static final String NOT = "NOT"; +} diff --git a/external-src/com/thoughtworks/sql/Criterion.java b/external-src/com/thoughtworks/sql/Criterion.java new file mode 100644 index 000000000..f5b77bd34 --- /dev/null +++ b/external-src/com/thoughtworks/sql/Criterion.java @@ -0,0 +1,75 @@ +package com.thoughtworks.sql; + +import static com.thoughtworks.sql.Constants.AND; +import static com.thoughtworks.sql.Constants.EXISTS; +import static com.thoughtworks.sql.Constants.LEFT_PARENTHESIS; +import static com.thoughtworks.sql.Constants.NOT; +import static com.thoughtworks.sql.Constants.OR; +import static com.thoughtworks.sql.Constants.RIGHT_PARENTHESIS; +import static com.thoughtworks.sql.Constants.SPACE; + +public abstract class Criterion { + protected final Operator operator; + + Criterion(Operator operator) { + this.operator = operator; + } + + public static Criterion and(final Criterion criterion, final Criterion... criterions) { + return new Criterion(Operator.and) { + + @Override + protected void populate(StringBuilder sb) { + sb.append(criterion); + for (Criterion c : criterions) { + sb.append(SPACE).append(AND).append(SPACE).append(c); + } + } + }; + } + + public static Criterion or(final Criterion criterion, final Criterion... criterions) { + return new Criterion(Operator.or) { + + @Override + protected void populate(StringBuilder sb) { + sb.append(criterion); + for (Criterion c : criterions) { + sb.append(SPACE).append(OR).append(SPACE).append(c.toString()); + } + } + }; + } + + public static Criterion exists(final Query query) { + return new Criterion(Operator.exists) { + + @Override + protected void populate(StringBuilder sb) { + sb.append(EXISTS).append(SPACE).append(LEFT_PARENTHESIS).append(query).append(RIGHT_PARENTHESIS); + } + }; + } + + public static Criterion not(final Criterion criterion) { + return new Criterion(Operator.not) { + + @Override + protected void populate(StringBuilder sb) { + sb.append(NOT).append(SPACE); + criterion.populate(sb); + } + }; + } + + protected abstract void populate(StringBuilder sb); + + @Override + public String toString() { + StringBuilder builder = new StringBuilder(LEFT_PARENTHESIS); + populate(builder); + builder.append(RIGHT_PARENTHESIS); + return builder.toString(); + } + +} diff --git a/external-src/com/thoughtworks/sql/DBObject.java b/external-src/com/thoughtworks/sql/DBObject.java new file mode 100644 index 000000000..e69b4aaaa --- /dev/null +++ b/external-src/com/thoughtworks/sql/DBObject.java @@ -0,0 +1,52 @@ +package com.thoughtworks.sql; + +import static com.thoughtworks.sql.Constants.AS; +import static com.thoughtworks.sql.Constants.SPACE; + +public abstract class DBObject> { + protected String alias; + protected final String expression; + + protected DBObject(String expression){ + this.expression = expression; + } + + public T as(String newAlias) { + this.alias = newAlias; + return (T) this; + } + + public boolean hasAlias() { + return alias != null; + } + + @SuppressWarnings("unchecked") + @Override + public boolean equals(Object o) { + if (this == o) return true; + if (o == null || getClass() != o.getClass()) return false; + + DBObject dbObject = (DBObject) o; + + if (alias != null ? !alias.equals(dbObject.alias) : dbObject.alias != null) return false; + if (expression != null ? !expression.equals(dbObject.expression) : dbObject.expression != null) return false; + + return true; + } + + @Override + public int hashCode() { + int result = alias != null ? alias.hashCode() : 0; + result = 31 * result + (expression != null ? expression.hashCode() : 0); + return result; + } + + @Override + public String toString() { + StringBuilder sb = new StringBuilder(expression); + if (hasAlias()) { + sb.append(SPACE).append(AS).append(SPACE).append(alias); + } + return sb.toString(); + } +} diff --git a/external-src/com/thoughtworks/sql/EqCriterion.java b/external-src/com/thoughtworks/sql/EqCriterion.java new file mode 100644 index 000000000..b58d48fb8 --- /dev/null +++ b/external-src/com/thoughtworks/sql/EqCriterion.java @@ -0,0 +1,7 @@ +package com.thoughtworks.sql; + +public class EqCriterion extends UnaryCriterion { + EqCriterion(Field field, Object value) { + super(field, Operator.eq, value); + } +} diff --git a/external-src/com/thoughtworks/sql/Field.java b/external-src/com/thoughtworks/sql/Field.java new file mode 100644 index 000000000..369338be2 --- /dev/null +++ b/external-src/com/thoughtworks/sql/Field.java @@ -0,0 +1,86 @@ +package com.thoughtworks.sql; + +import static com.thoughtworks.sql.Constants.AND; +import static com.thoughtworks.sql.Constants.BETWEEN; +import static com.thoughtworks.sql.Constants.COMMA; +import static com.thoughtworks.sql.Constants.LEFT_PARENTHESIS; +import static com.thoughtworks.sql.Constants.RIGHT_PARENTHESIS; +import static com.thoughtworks.sql.Constants.SPACE; + +public class Field extends DBObject { + + protected Field(String expression) { + super(expression); + } + + public static Field field(String expression) { + return new Field(expression); + } + + public Criterion eq(Object value) { + return UnaryCriterion.eq(this, value); + } + + public Criterion neq(Object value) { + return UnaryCriterion.neq(this, value); + } + + public Criterion gt(Object value) { + return UnaryCriterion.gt(this, value); + } + + public Criterion lt(final Object value) { + return UnaryCriterion.lt(this, value); + } + + public Criterion isNull() { + return UnaryCriterion.isNull(this); + } + + public Criterion isNotNull() { + return UnaryCriterion.isNotNull(this); + } + + public Criterion between(final Object lower, final Object upper) { + final Field field = this; + return new Criterion(null) { + + @Override + protected void populate(StringBuilder sb) { + sb.append(field).append(SPACE).append(BETWEEN).append(SPACE).append(lower).append(SPACE).append(AND) + .append(SPACE).append(upper); + } + }; + } + + public Criterion like(final String value) { + return UnaryCriterion.like(this, value); + } + + public Criterion in(final T... value) { + final Field field = this; + return new Criterion(Operator.in) { + + @Override + protected void populate(StringBuilder sb) { + sb.append(field).append(SPACE).append(Operator.in).append(SPACE).append(LEFT_PARENTHESIS); + for (T t : value) { + sb.append(t.toString()).append(COMMA); + } + sb.deleteCharAt(sb.length() - 1).append(RIGHT_PARENTHESIS); + } + }; + } + + public Criterion in(final Query query) { + final Field field = this; + return new Criterion(Operator.in) { + + @Override + protected void populate(StringBuilder sb) { + sb.append(field).append(SPACE).append(Operator.in).append(SPACE).append(LEFT_PARENTHESIS).append(query) + .append(RIGHT_PARENTHESIS); + } + }; + } +} diff --git a/external-src/com/thoughtworks/sql/GroupBy.java b/external-src/com/thoughtworks/sql/GroupBy.java new file mode 100644 index 000000000..620262f83 --- /dev/null +++ b/external-src/com/thoughtworks/sql/GroupBy.java @@ -0,0 +1,14 @@ +package com.thoughtworks.sql; + +import java.util.List; +import java.util.ArrayList; + +public class GroupBy { + private List fields = new ArrayList(); + + public static GroupBy groupBy(Field field) { + GroupBy groupBy = new GroupBy(); + groupBy.fields.add(field); + return groupBy; + } +} diff --git a/external-src/com/thoughtworks/sql/Join.java b/external-src/com/thoughtworks/sql/Join.java new file mode 100644 index 000000000..975236776 --- /dev/null +++ b/external-src/com/thoughtworks/sql/Join.java @@ -0,0 +1,43 @@ +package com.thoughtworks.sql; + +import static com.thoughtworks.sql.Constants.SPACE; +import static com.thoughtworks.sql.Constants.JOIN; +import static com.thoughtworks.sql.Constants.ON; + +public class Join { + private final Table joinTable; + private final JoinType joinType; + private final Criterion[] criterions; + + private Join(Table table, JoinType joinType, Criterion... criterions) { + joinTable = table; + this.joinType = joinType; + this.criterions = criterions; + } + + public static Join inner(Table expression, Criterion... criterions) { + return new Join(expression, JoinType.INNER, criterions); + } + + public static Join left(Table table, Criterion... criterions) { + return new Join(table, JoinType.LEFT, criterions); + } + + public static Join right(Table table, Criterion... criterions) { + return new Join(table, JoinType.RIGHT, criterions); + } + + public static Join out(Table table, Criterion... criterions) { + return new Join(table, JoinType.OUT, criterions); + } + + @Override + public String toString() { + StringBuilder sb = new StringBuilder(); + sb.append(joinType).append(SPACE).append(JOIN).append(SPACE).append(joinTable).append(SPACE).append(ON); + for (Criterion criterion : criterions) { + sb.append(SPACE).append(criterion); + } + return sb.toString(); + } +} diff --git a/external-src/com/thoughtworks/sql/JoinType.java b/external-src/com/thoughtworks/sql/JoinType.java new file mode 100644 index 000000000..77b094306 --- /dev/null +++ b/external-src/com/thoughtworks/sql/JoinType.java @@ -0,0 +1,5 @@ +package com.thoughtworks.sql; + +public enum JoinType { + INNER, LEFT, RIGHT, OUT +} diff --git a/external-src/com/thoughtworks/sql/Operator.java b/external-src/com/thoughtworks/sql/Operator.java new file mode 100644 index 000000000..61508b933 --- /dev/null +++ b/external-src/com/thoughtworks/sql/Operator.java @@ -0,0 +1,57 @@ +package com.thoughtworks.sql; + +import static com.thoughtworks.sql.Constants.SPACE; + +import java.util.HashMap; +import java.util.Map; + +@SuppressWarnings("nls") +public final class Operator { + + private final String operator; + public static final Operator eq = new Operator("="); + public static final Operator neq = new Operator("<>"); + public static final Operator isNull = new Operator("IS NULL"); + public static final Operator isNotNull = new Operator("IS NOT NULL"); + public static final Operator gt = new Operator(">"); + public static final Operator lt = new Operator("<"); + public static final Operator gte = new Operator(">="); + public static final Operator lte = new Operator("<="); + public static final Operator and = new Operator("AND"); + public static final Operator or = new Operator("OR"); + public static final Operator not = new Operator("NOT"); + public static final Operator exists = new Operator("EXISTS"); + public static final Operator like = new Operator("LIKE"); + public static final Operator in = new Operator("IN"); + + private static final Map contraryRegistry = new HashMap(); + + static { + contraryRegistry.put(eq, neq); + contraryRegistry.put(neq, eq); + contraryRegistry.put(isNull, isNotNull); + contraryRegistry.put(isNotNull, isNull); + contraryRegistry.put(gt, lte); + contraryRegistry.put(lte, gt); + contraryRegistry.put(lt, gte); + contraryRegistry.put(gte, lt); + } + + private Operator(String operator) { + this.operator = operator; + } + + public Operator getContrary() { + if(!contraryRegistry.containsKey(this)){ + Operator opposite = new Operator(not.toString() + SPACE + this.toString()); + contraryRegistry.put(this, opposite); + contraryRegistry.put(opposite, this); + } + return contraryRegistry.get(this); + } + + @Override + public String toString() { + return this.operator.toString(); + } +} diff --git a/external-src/com/thoughtworks/sql/Order.java b/external-src/com/thoughtworks/sql/Order.java new file mode 100644 index 000000000..67e1aa0ab --- /dev/null +++ b/external-src/com/thoughtworks/sql/Order.java @@ -0,0 +1,30 @@ +package com.thoughtworks.sql; + +import static com.thoughtworks.sql.Constants.SPACE; + +public class Order { + private final Field expression; + private final OrderType orderType; + + private Order(Field expression) { + this(expression, OrderType.ASC); + } + + private Order(Field expression, OrderType orderType) { + this.expression = expression; + this.orderType = orderType; + } + + public static Order asc(Field expression) { + return new Order(expression); + } + + public static Order desc(Field expression) { + return new Order(expression, OrderType.DESC); + } + + @Override + public String toString() { + return expression + SPACE + orderType; + } +} diff --git a/external-src/com/thoughtworks/sql/OrderType.java b/external-src/com/thoughtworks/sql/OrderType.java new file mode 100644 index 000000000..d907270c9 --- /dev/null +++ b/external-src/com/thoughtworks/sql/OrderType.java @@ -0,0 +1,5 @@ +package com.thoughtworks.sql; + +public enum OrderType { + DESC, ASC +} diff --git a/external-src/com/thoughtworks/sql/Query.java b/external-src/com/thoughtworks/sql/Query.java new file mode 100644 index 000000000..f56fa06f1 --- /dev/null +++ b/external-src/com/thoughtworks/sql/Query.java @@ -0,0 +1,163 @@ +package com.thoughtworks.sql; + +import static com.thoughtworks.sql.Constants.ALL; +import static com.thoughtworks.sql.Constants.COMMA; +import static com.thoughtworks.sql.Constants.FROM; +import static com.thoughtworks.sql.Constants.GROUP_BY; +import static com.thoughtworks.sql.Constants.LEFT_PARENTHESIS; +import static com.thoughtworks.sql.Constants.ORDER_BY; +import static com.thoughtworks.sql.Constants.RIGHT_PARENTHESIS; +import static com.thoughtworks.sql.Constants.SELECT; +import static com.thoughtworks.sql.Constants.SPACE; +import static com.thoughtworks.sql.Constants.WHERE; +import static com.thoughtworks.sql.Table.table; +import static java.util.Arrays.asList; + +import java.util.ArrayList; +import java.util.List; + +public class Query { + + private Table table; + private List criterions = new ArrayList(); + private List fields = new ArrayList(); + private List joins = new ArrayList(); + private List groupBies = new ArrayList(); + private List orders = new ArrayList(); + private List havings = new ArrayList(); + + private Query(Field... fields) { + this.fields.addAll(asList(fields)); + } + + public static Query select(Field... fields) { + return new Query(fields); + } + + public Query from(Table fromTable) { + this.table = fromTable; + return this; + } + + public Query join(Join... join) { + joins.addAll(asList(join)); + return this; + } + + public Query where(Criterion criterion) { + criterions.add(criterion); + return this; + } + + public Query groupBy(Field... groupBy) { + groupBies.addAll(asList(groupBy)); + return this; + } + + public Query orderBy(Order... order) { + orders.addAll(asList(order)); + return this; + } + + public Query appendSelectFields(Field... selectFields) { + this.fields.addAll(asList(selectFields)); + return this; + } + + @Override + public boolean equals(Object o) { + return this == o || !(o == null || getClass() != o.getClass()) && this.toString().equals(o.toString()); + } + + @Override + public int hashCode() { + return toString().hashCode(); + } + + @Override + public String toString() { + StringBuilder sql = new StringBuilder(); + visitSelectClause(sql); + visitFromClause(sql); + visitJoinClause(sql); + visitWhereClause(sql); + visitGroupByClause(sql); + visitOrderByClause(sql); + return sql.toString(); + } + + private void visitOrderByClause(StringBuilder sql) { + if (orders.isEmpty()) { + return; + } + sql.append(ORDER_BY); + for (Order order : orders) { + sql.append(SPACE).append(order).append(COMMA); + } + sql.deleteCharAt(sql.length() - 1).append(SPACE); + } + + @SuppressWarnings("nls") + private void visitGroupByClause(StringBuilder sql) { + if (groupBies.isEmpty()) { + return; + } + sql.append(GROUP_BY); + for (Field groupBy : groupBies) { + sql.append(SPACE).append(groupBy).append(COMMA); + } + sql.deleteCharAt(sql.length() - 1).append(SPACE); + if (havings.isEmpty()) { + return; + } + sql.append("HAVING"); + for (Criterion havingCriterion : havings) { + sql.append(SPACE).append(havingCriterion).append(COMMA); + } + sql.deleteCharAt(sql.length() - 1).append(SPACE); + } + + private void visitWhereClause(StringBuilder sql) { + if (criterions.isEmpty()) { + return; + } + sql.append(WHERE); + for (Criterion criterion : criterions) { + sql.append(SPACE).append(criterion).append(SPACE); + } + } + + private void visitJoinClause(StringBuilder sql) { + for (Join join : joins) { + sql.append(join).append(SPACE); + } + } + + private void visitFromClause(StringBuilder sql) { + if (table == null) { + return; + } + sql.append(FROM).append(SPACE).append(table).append(SPACE); + } + + private void visitSelectClause(StringBuilder sql) { + sql.append(SELECT).append(SPACE); + if (fields.isEmpty()) { + sql.append(ALL).append(SPACE); + return; + } + for (Field field : fields) { + sql.append(field).append(COMMA); + } + sql.deleteCharAt(sql.length() - 1).append(SPACE); + } + + public Table as(String alias) { + return table(LEFT_PARENTHESIS + this.toString() + RIGHT_PARENTHESIS).as(alias); + } + + public Query having(Criterion criterion) { + this.havings.add(criterion); + return this; + } +} diff --git a/external-src/com/thoughtworks/sql/Table.java b/external-src/com/thoughtworks/sql/Table.java new file mode 100644 index 000000000..54bff107f --- /dev/null +++ b/external-src/com/thoughtworks/sql/Table.java @@ -0,0 +1,20 @@ +package com.thoughtworks.sql; + +public class Table extends DBObject
{ + + protected Table(String expression) { + super(expression); + } + + public static Table table(String table) { + return new Table(table); + } + + @SuppressWarnings("nls") + public Field field(String fieldName) { + if (hasAlias()) { + return Field.field(alias + "." + fieldName); + } + return Field.field(expression+"."+fieldName); + } +} diff --git a/external-src/com/thoughtworks/sql/UnaryCriterion.java b/external-src/com/thoughtworks/sql/UnaryCriterion.java new file mode 100644 index 000000000..4c9108e7d --- /dev/null +++ b/external-src/com/thoughtworks/sql/UnaryCriterion.java @@ -0,0 +1,77 @@ +package com.thoughtworks.sql; + +import static com.thoughtworks.sql.Constants.SPACE; + +public class UnaryCriterion extends Criterion { + protected final Field expression; + protected final Object value; + + UnaryCriterion(Field expression, Operator operator, Object value) { + super(operator); + this.expression = expression; + this.value = value; + } + + @Override + protected void populate(StringBuilder sb) { + beforePopulateOperator(sb); + populateOperator(sb); + afterPopulateOperator(sb); + } + + public static Criterion eq(Field expression, Object value) { + return new UnaryCriterion(expression, Operator.eq, value); + } + + protected void beforePopulateOperator(StringBuilder sb) { + sb.append(expression); + } + + protected void populateOperator(StringBuilder sb) { + sb.append(operator); + } + + @SuppressWarnings("nls") + protected void afterPopulateOperator(StringBuilder sb) { + sb.append(value == null ? "" : value); + } + + public static Criterion neq(Field field, Object value) { + return new UnaryCriterion(field, Operator.neq, value); + } + + public static Criterion gt(Field field, Object value) { + return new UnaryCriterion(field, Operator.gt, value); + } + + public static Criterion lt(Field field, Object value) { + return new UnaryCriterion(field, Operator.lt, value); + } + + public static Criterion isNull(Field field) { + return new UnaryCriterion(field, Operator.isNull, null) { + @Override + protected void populateOperator(StringBuilder sb) { + sb.append(SPACE).append(operator); + } + }; + } + + public static Criterion isNotNull(Field field) { + return new UnaryCriterion(field, Operator.isNotNull, null) { + @Override + protected void populateOperator(StringBuilder sb) { + sb.append(SPACE).append(operator); + } + }; + } + + public static Criterion like(Field field, String value) { + return new UnaryCriterion(field, Operator.like, value) { + @Override + protected void populateOperator(StringBuilder sb) { + sb.append(SPACE).append(operator).append(SPACE); + } + }; + } +} diff --git a/src/com/mdt/rtm/ApplicationInfo.java b/src-legacy/com/mdt/rtm/ApplicationInfo.java similarity index 100% rename from src/com/mdt/rtm/ApplicationInfo.java rename to src-legacy/com/mdt/rtm/ApplicationInfo.java diff --git a/src/com/mdt/rtm/Invoker.java b/src-legacy/com/mdt/rtm/Invoker.java similarity index 100% rename from src/com/mdt/rtm/Invoker.java rename to src-legacy/com/mdt/rtm/Invoker.java diff --git a/src/com/mdt/rtm/Param.java b/src-legacy/com/mdt/rtm/Param.java similarity index 100% rename from src/com/mdt/rtm/Param.java rename to src-legacy/com/mdt/rtm/Param.java diff --git a/src/com/mdt/rtm/Prefs.java b/src-legacy/com/mdt/rtm/Prefs.java similarity index 100% rename from src/com/mdt/rtm/Prefs.java rename to src-legacy/com/mdt/rtm/Prefs.java diff --git a/src/com/mdt/rtm/Service.java b/src-legacy/com/mdt/rtm/Service.java similarity index 100% rename from src/com/mdt/rtm/Service.java rename to src-legacy/com/mdt/rtm/Service.java diff --git a/src/com/mdt/rtm/ServiceException.java b/src-legacy/com/mdt/rtm/ServiceException.java similarity index 100% rename from src/com/mdt/rtm/ServiceException.java rename to src-legacy/com/mdt/rtm/ServiceException.java diff --git a/src/com/mdt/rtm/ServiceImpl.java b/src-legacy/com/mdt/rtm/ServiceImpl.java similarity index 100% rename from src/com/mdt/rtm/ServiceImpl.java rename to src-legacy/com/mdt/rtm/ServiceImpl.java diff --git a/src/com/mdt/rtm/ServiceInternalException.java b/src-legacy/com/mdt/rtm/ServiceInternalException.java similarity index 100% rename from src/com/mdt/rtm/ServiceInternalException.java rename to src-legacy/com/mdt/rtm/ServiceInternalException.java diff --git a/src/com/mdt/rtm/data/RtmAuth.java b/src-legacy/com/mdt/rtm/data/RtmAuth.java similarity index 100% rename from src/com/mdt/rtm/data/RtmAuth.java rename to src-legacy/com/mdt/rtm/data/RtmAuth.java diff --git a/src/com/mdt/rtm/data/RtmData.java b/src-legacy/com/mdt/rtm/data/RtmData.java similarity index 100% rename from src/com/mdt/rtm/data/RtmData.java rename to src-legacy/com/mdt/rtm/data/RtmData.java diff --git a/src/com/mdt/rtm/data/RtmFrob.java b/src-legacy/com/mdt/rtm/data/RtmFrob.java similarity index 100% rename from src/com/mdt/rtm/data/RtmFrob.java rename to src-legacy/com/mdt/rtm/data/RtmFrob.java diff --git a/src/com/mdt/rtm/data/RtmList.java b/src-legacy/com/mdt/rtm/data/RtmList.java similarity index 100% rename from src/com/mdt/rtm/data/RtmList.java rename to src-legacy/com/mdt/rtm/data/RtmList.java diff --git a/src/com/mdt/rtm/data/RtmLists.java b/src-legacy/com/mdt/rtm/data/RtmLists.java similarity index 100% rename from src/com/mdt/rtm/data/RtmLists.java rename to src-legacy/com/mdt/rtm/data/RtmLists.java diff --git a/src/com/mdt/rtm/data/RtmLocation.java b/src-legacy/com/mdt/rtm/data/RtmLocation.java similarity index 100% rename from src/com/mdt/rtm/data/RtmLocation.java rename to src-legacy/com/mdt/rtm/data/RtmLocation.java diff --git a/src/com/mdt/rtm/data/RtmTask.java b/src-legacy/com/mdt/rtm/data/RtmTask.java similarity index 100% rename from src/com/mdt/rtm/data/RtmTask.java rename to src-legacy/com/mdt/rtm/data/RtmTask.java diff --git a/src/com/mdt/rtm/data/RtmTaskList.java b/src-legacy/com/mdt/rtm/data/RtmTaskList.java similarity index 100% rename from src/com/mdt/rtm/data/RtmTaskList.java rename to src-legacy/com/mdt/rtm/data/RtmTaskList.java diff --git a/src/com/mdt/rtm/data/RtmTaskNote.java b/src-legacy/com/mdt/rtm/data/RtmTaskNote.java similarity index 100% rename from src/com/mdt/rtm/data/RtmTaskNote.java rename to src-legacy/com/mdt/rtm/data/RtmTaskNote.java diff --git a/src/com/mdt/rtm/data/RtmTaskNotes.java b/src-legacy/com/mdt/rtm/data/RtmTaskNotes.java similarity index 100% rename from src/com/mdt/rtm/data/RtmTaskNotes.java rename to src-legacy/com/mdt/rtm/data/RtmTaskNotes.java diff --git a/src/com/mdt/rtm/data/RtmTaskSeries.java b/src-legacy/com/mdt/rtm/data/RtmTaskSeries.java similarity index 100% rename from src/com/mdt/rtm/data/RtmTaskSeries.java rename to src-legacy/com/mdt/rtm/data/RtmTaskSeries.java diff --git a/src/com/mdt/rtm/data/RtmTasks.java b/src-legacy/com/mdt/rtm/data/RtmTasks.java similarity index 100% rename from src/com/mdt/rtm/data/RtmTasks.java rename to src-legacy/com/mdt/rtm/data/RtmTasks.java diff --git a/src/com/mdt/rtm/data/RtmTimeline.java b/src-legacy/com/mdt/rtm/data/RtmTimeline.java similarity index 100% rename from src/com/mdt/rtm/data/RtmTimeline.java rename to src-legacy/com/mdt/rtm/data/RtmTimeline.java diff --git a/src/com/mdt/rtm/data/RtmUser.java b/src-legacy/com/mdt/rtm/data/RtmUser.java similarity index 100% rename from src/com/mdt/rtm/data/RtmUser.java rename to src-legacy/com/mdt/rtm/data/RtmUser.java diff --git a/src/com/timsu/astrid/activities/EditPreferences.java b/src-legacy/com/timsu/astrid/activities/EditPreferences.java similarity index 100% rename from src/com/timsu/astrid/activities/EditPreferences.java rename to src-legacy/com/timsu/astrid/activities/EditPreferences.java diff --git a/src/com/timsu/astrid/activities/LocaleEditAlerts.java b/src-legacy/com/timsu/astrid/activities/LocaleEditAlerts.java similarity index 100% rename from src/com/timsu/astrid/activities/LocaleEditAlerts.java rename to src-legacy/com/timsu/astrid/activities/LocaleEditAlerts.java diff --git a/src/com/timsu/astrid/activities/SubActivity.java b/src-legacy/com/timsu/astrid/activities/SubActivity.java similarity index 100% rename from src/com/timsu/astrid/activities/SubActivity.java rename to src-legacy/com/timsu/astrid/activities/SubActivity.java diff --git a/src/com/timsu/astrid/activities/SyncLoginActivity.java b/src-legacy/com/timsu/astrid/activities/SyncLoginActivity.java similarity index 100% rename from src/com/timsu/astrid/activities/SyncLoginActivity.java rename to src-legacy/com/timsu/astrid/activities/SyncLoginActivity.java diff --git a/src/com/timsu/astrid/activities/SyncPreferences.java b/src-legacy/com/timsu/astrid/activities/SyncPreferences.java similarity index 100% rename from src/com/timsu/astrid/activities/SyncPreferences.java rename to src-legacy/com/timsu/astrid/activities/SyncPreferences.java diff --git a/src/com/timsu/astrid/activities/TagListSubActivity.java b/src-legacy/com/timsu/astrid/activities/TagListSubActivity.java similarity index 100% rename from src/com/timsu/astrid/activities/TagListSubActivity.java rename to src-legacy/com/timsu/astrid/activities/TagListSubActivity.java diff --git a/src/com/timsu/astrid/activities/TagView.java b/src-legacy/com/timsu/astrid/activities/TagView.java similarity index 100% rename from src/com/timsu/astrid/activities/TagView.java rename to src-legacy/com/timsu/astrid/activities/TagView.java diff --git a/src/com/timsu/astrid/activities/TaskEdit.java b/src-legacy/com/timsu/astrid/activities/TaskEdit.java similarity index 100% rename from src/com/timsu/astrid/activities/TaskEdit.java rename to src-legacy/com/timsu/astrid/activities/TaskEdit.java diff --git a/src/com/timsu/astrid/activities/TaskList.java b/src-legacy/com/timsu/astrid/activities/TaskList.java similarity index 100% rename from src/com/timsu/astrid/activities/TaskList.java rename to src-legacy/com/timsu/astrid/activities/TaskList.java diff --git a/src/com/timsu/astrid/activities/TaskListAdapter.java b/src-legacy/com/timsu/astrid/activities/TaskListAdapter.java similarity index 100% rename from src/com/timsu/astrid/activities/TaskListAdapter.java rename to src-legacy/com/timsu/astrid/activities/TaskListAdapter.java diff --git a/src/com/timsu/astrid/activities/TaskListNotify.java b/src-legacy/com/timsu/astrid/activities/TaskListNotify.java similarity index 100% rename from src/com/timsu/astrid/activities/TaskListNotify.java rename to src-legacy/com/timsu/astrid/activities/TaskListNotify.java diff --git a/src/com/timsu/astrid/activities/TaskListSubActivity.java b/src-legacy/com/timsu/astrid/activities/TaskListSubActivity.java similarity index 100% rename from src/com/timsu/astrid/activities/TaskListSubActivity.java rename to src-legacy/com/timsu/astrid/activities/TaskListSubActivity.java diff --git a/src/com/timsu/astrid/activities/TaskModificationActivity.java b/src-legacy/com/timsu/astrid/activities/TaskModificationActivity.java similarity index 100% rename from src/com/timsu/astrid/activities/TaskModificationActivity.java rename to src-legacy/com/timsu/astrid/activities/TaskModificationActivity.java diff --git a/src/com/timsu/astrid/activities/TaskModificationTabbedActivity.java b/src-legacy/com/timsu/astrid/activities/TaskModificationTabbedActivity.java similarity index 100% rename from src/com/timsu/astrid/activities/TaskModificationTabbedActivity.java rename to src-legacy/com/timsu/astrid/activities/TaskModificationTabbedActivity.java diff --git a/src/com/timsu/astrid/appwidget/AstridAppWidgetProvider.java b/src-legacy/com/timsu/astrid/appwidget/AstridAppWidgetProvider.java similarity index 100% rename from src/com/timsu/astrid/appwidget/AstridAppWidgetProvider.java rename to src-legacy/com/timsu/astrid/appwidget/AstridAppWidgetProvider.java diff --git a/src/com/timsu/astrid/data/AbstractController.java b/src-legacy/com/timsu/astrid/data/AbstractController.java similarity index 100% rename from src/com/timsu/astrid/data/AbstractController.java rename to src-legacy/com/timsu/astrid/data/AbstractController.java diff --git a/src/com/timsu/astrid/data/AbstractModel.java b/src-legacy/com/timsu/astrid/data/AbstractModel.java similarity index 100% rename from src/com/timsu/astrid/data/AbstractModel.java rename to src-legacy/com/timsu/astrid/data/AbstractModel.java diff --git a/src/com/timsu/astrid/data/Identifier.java b/src-legacy/com/timsu/astrid/data/Identifier.java similarity index 100% rename from src/com/timsu/astrid/data/Identifier.java rename to src-legacy/com/timsu/astrid/data/Identifier.java diff --git a/src/com/timsu/astrid/data/alerts/Alert.java b/src-legacy/com/timsu/astrid/data/alerts/Alert.java similarity index 100% rename from src/com/timsu/astrid/data/alerts/Alert.java rename to src-legacy/com/timsu/astrid/data/alerts/Alert.java diff --git a/src/com/timsu/astrid/data/alerts/AlertController.java b/src-legacy/com/timsu/astrid/data/alerts/AlertController.java similarity index 100% rename from src/com/timsu/astrid/data/alerts/AlertController.java rename to src-legacy/com/timsu/astrid/data/alerts/AlertController.java diff --git a/src/com/timsu/astrid/data/enums/Importance.java b/src-legacy/com/timsu/astrid/data/enums/Importance.java similarity index 100% rename from src/com/timsu/astrid/data/enums/Importance.java rename to src-legacy/com/timsu/astrid/data/enums/Importance.java diff --git a/src/com/timsu/astrid/data/enums/RepeatInterval.java b/src-legacy/com/timsu/astrid/data/enums/RepeatInterval.java similarity index 100% rename from src/com/timsu/astrid/data/enums/RepeatInterval.java rename to src-legacy/com/timsu/astrid/data/enums/RepeatInterval.java diff --git a/src/com/timsu/astrid/data/location/GeoPoint.java b/src-legacy/com/timsu/astrid/data/location/GeoPoint.java similarity index 100% rename from src/com/timsu/astrid/data/location/GeoPoint.java rename to src-legacy/com/timsu/astrid/data/location/GeoPoint.java diff --git a/src/com/timsu/astrid/data/sync/SyncDataController.java b/src-legacy/com/timsu/astrid/data/sync/SyncDataController.java similarity index 100% rename from src/com/timsu/astrid/data/sync/SyncDataController.java rename to src-legacy/com/timsu/astrid/data/sync/SyncDataController.java diff --git a/src/com/timsu/astrid/data/sync/SyncMapping.java b/src-legacy/com/timsu/astrid/data/sync/SyncMapping.java similarity index 100% rename from src/com/timsu/astrid/data/sync/SyncMapping.java rename to src-legacy/com/timsu/astrid/data/sync/SyncMapping.java diff --git a/src/com/timsu/astrid/data/tag/AbstractTagModel.java b/src-legacy/com/timsu/astrid/data/tag/AbstractTagModel.java similarity index 100% rename from src/com/timsu/astrid/data/tag/AbstractTagModel.java rename to src-legacy/com/timsu/astrid/data/tag/AbstractTagModel.java diff --git a/src/com/timsu/astrid/data/tag/TagController.java b/src-legacy/com/timsu/astrid/data/tag/TagController.java similarity index 100% rename from src/com/timsu/astrid/data/tag/TagController.java rename to src-legacy/com/timsu/astrid/data/tag/TagController.java diff --git a/src/com/timsu/astrid/data/tag/TagIdentifier.java b/src-legacy/com/timsu/astrid/data/tag/TagIdentifier.java similarity index 100% rename from src/com/timsu/astrid/data/tag/TagIdentifier.java rename to src-legacy/com/timsu/astrid/data/tag/TagIdentifier.java diff --git a/src/com/timsu/astrid/data/tag/TagModelForView.java b/src-legacy/com/timsu/astrid/data/tag/TagModelForView.java similarity index 100% rename from src/com/timsu/astrid/data/tag/TagModelForView.java rename to src-legacy/com/timsu/astrid/data/tag/TagModelForView.java diff --git a/src/com/timsu/astrid/data/tag/TagToTaskMapping.java b/src-legacy/com/timsu/astrid/data/tag/TagToTaskMapping.java similarity index 100% rename from src/com/timsu/astrid/data/tag/TagToTaskMapping.java rename to src-legacy/com/timsu/astrid/data/tag/TagToTaskMapping.java diff --git a/src/com/timsu/astrid/data/task/AbstractTaskModel.java b/src-legacy/com/timsu/astrid/data/task/AbstractTaskModel.java similarity index 100% rename from src/com/timsu/astrid/data/task/AbstractTaskModel.java rename to src-legacy/com/timsu/astrid/data/task/AbstractTaskModel.java diff --git a/src/com/timsu/astrid/data/task/TaskController.java b/src-legacy/com/timsu/astrid/data/task/TaskController.java similarity index 100% rename from src/com/timsu/astrid/data/task/TaskController.java rename to src-legacy/com/timsu/astrid/data/task/TaskController.java diff --git a/src/com/timsu/astrid/data/task/TaskIdentifier.java b/src-legacy/com/timsu/astrid/data/task/TaskIdentifier.java similarity index 100% rename from src/com/timsu/astrid/data/task/TaskIdentifier.java rename to src-legacy/com/timsu/astrid/data/task/TaskIdentifier.java diff --git a/src/com/timsu/astrid/data/task/TaskModelForEdit.java b/src-legacy/com/timsu/astrid/data/task/TaskModelForEdit.java similarity index 100% rename from src/com/timsu/astrid/data/task/TaskModelForEdit.java rename to src-legacy/com/timsu/astrid/data/task/TaskModelForEdit.java diff --git a/src/com/timsu/astrid/data/task/TaskModelForHandlers.java b/src-legacy/com/timsu/astrid/data/task/TaskModelForHandlers.java similarity index 100% rename from src/com/timsu/astrid/data/task/TaskModelForHandlers.java rename to src-legacy/com/timsu/astrid/data/task/TaskModelForHandlers.java diff --git a/src/com/timsu/astrid/data/task/TaskModelForList.java b/src-legacy/com/timsu/astrid/data/task/TaskModelForList.java similarity index 100% rename from src/com/timsu/astrid/data/task/TaskModelForList.java rename to src-legacy/com/timsu/astrid/data/task/TaskModelForList.java diff --git a/src/com/timsu/astrid/data/task/TaskModelForNotify.java b/src-legacy/com/timsu/astrid/data/task/TaskModelForNotify.java similarity index 100% rename from src/com/timsu/astrid/data/task/TaskModelForNotify.java rename to src-legacy/com/timsu/astrid/data/task/TaskModelForNotify.java diff --git a/src/com/timsu/astrid/data/task/TaskModelForProvider.java b/src-legacy/com/timsu/astrid/data/task/TaskModelForProvider.java similarity index 100% rename from src/com/timsu/astrid/data/task/TaskModelForProvider.java rename to src-legacy/com/timsu/astrid/data/task/TaskModelForProvider.java diff --git a/src/com/timsu/astrid/data/task/TaskModelForReminder.java b/src-legacy/com/timsu/astrid/data/task/TaskModelForReminder.java similarity index 100% rename from src/com/timsu/astrid/data/task/TaskModelForReminder.java rename to src-legacy/com/timsu/astrid/data/task/TaskModelForReminder.java diff --git a/src/com/timsu/astrid/data/task/TaskModelForSync.java b/src-legacy/com/timsu/astrid/data/task/TaskModelForSync.java similarity index 100% rename from src/com/timsu/astrid/data/task/TaskModelForSync.java rename to src-legacy/com/timsu/astrid/data/task/TaskModelForSync.java diff --git a/src/com/timsu/astrid/data/task/TaskModelForWidget.java b/src-legacy/com/timsu/astrid/data/task/TaskModelForWidget.java similarity index 100% rename from src/com/timsu/astrid/data/task/TaskModelForWidget.java rename to src-legacy/com/timsu/astrid/data/task/TaskModelForWidget.java diff --git a/src/com/timsu/astrid/data/task/TaskModelForXml.java b/src-legacy/com/timsu/astrid/data/task/TaskModelForXml.java similarity index 100% rename from src/com/timsu/astrid/data/task/TaskModelForXml.java rename to src-legacy/com/timsu/astrid/data/task/TaskModelForXml.java diff --git a/src/com/timsu/astrid/provider/TasksProvider.java b/src-legacy/com/timsu/astrid/provider/TasksProvider.java similarity index 100% rename from src/com/timsu/astrid/provider/TasksProvider.java rename to src-legacy/com/timsu/astrid/provider/TasksProvider.java diff --git a/src/com/timsu/astrid/sync/RTMSyncProvider.java b/src-legacy/com/timsu/astrid/sync/RTMSyncProvider.java similarity index 100% rename from src/com/timsu/astrid/sync/RTMSyncProvider.java rename to src-legacy/com/timsu/astrid/sync/RTMSyncProvider.java diff --git a/src/com/timsu/astrid/sync/SynchronizationProvider.java b/src-legacy/com/timsu/astrid/sync/SynchronizationProvider.java similarity index 100% rename from src/com/timsu/astrid/sync/SynchronizationProvider.java rename to src-legacy/com/timsu/astrid/sync/SynchronizationProvider.java diff --git a/src/com/timsu/astrid/sync/SynchronizationService.java b/src-legacy/com/timsu/astrid/sync/SynchronizationService.java similarity index 100% rename from src/com/timsu/astrid/sync/SynchronizationService.java rename to src-legacy/com/timsu/astrid/sync/SynchronizationService.java diff --git a/src/com/timsu/astrid/sync/Synchronizer.java b/src-legacy/com/timsu/astrid/sync/Synchronizer.java similarity index 100% rename from src/com/timsu/astrid/sync/Synchronizer.java rename to src-legacy/com/timsu/astrid/sync/Synchronizer.java diff --git a/src/com/timsu/astrid/sync/TaskProxy.java b/src-legacy/com/timsu/astrid/sync/TaskProxy.java similarity index 100% rename from src/com/timsu/astrid/sync/TaskProxy.java rename to src-legacy/com/timsu/astrid/sync/TaskProxy.java diff --git a/src/com/timsu/astrid/utilities/AstridUtilities.java b/src-legacy/com/timsu/astrid/utilities/AstridUtilities.java similarity index 100% rename from src/com/timsu/astrid/utilities/AstridUtilities.java rename to src-legacy/com/timsu/astrid/utilities/AstridUtilities.java diff --git a/src/com/timsu/astrid/utilities/BackupService.java b/src-legacy/com/timsu/astrid/utilities/BackupService.java similarity index 100% rename from src/com/timsu/astrid/utilities/BackupService.java rename to src-legacy/com/timsu/astrid/utilities/BackupService.java diff --git a/src/com/timsu/astrid/utilities/Constants.java b/src-legacy/com/timsu/astrid/utilities/Constants.java similarity index 100% rename from src/com/timsu/astrid/utilities/Constants.java rename to src-legacy/com/timsu/astrid/utilities/Constants.java diff --git a/src/com/timsu/astrid/utilities/DateUtilities.java b/src-legacy/com/timsu/astrid/utilities/DateUtilities.java similarity index 100% rename from src/com/timsu/astrid/utilities/DateUtilities.java rename to src-legacy/com/timsu/astrid/utilities/DateUtilities.java diff --git a/src/com/timsu/astrid/utilities/DialogUtilities.java b/src-legacy/com/timsu/astrid/utilities/DialogUtilities.java similarity index 100% rename from src/com/timsu/astrid/utilities/DialogUtilities.java rename to src-legacy/com/timsu/astrid/utilities/DialogUtilities.java diff --git a/src/com/timsu/astrid/utilities/LocaleReceiver.java b/src-legacy/com/timsu/astrid/utilities/LocaleReceiver.java similarity index 100% rename from src/com/timsu/astrid/utilities/LocaleReceiver.java rename to src-legacy/com/timsu/astrid/utilities/LocaleReceiver.java diff --git a/src/com/timsu/astrid/utilities/Notifications.java b/src-legacy/com/timsu/astrid/utilities/Notifications.java similarity index 100% rename from src/com/timsu/astrid/utilities/Notifications.java rename to src-legacy/com/timsu/astrid/utilities/Notifications.java diff --git a/src/com/timsu/astrid/utilities/Preferences.java b/src-legacy/com/timsu/astrid/utilities/Preferences.java similarity index 100% rename from src/com/timsu/astrid/utilities/Preferences.java rename to src-legacy/com/timsu/astrid/utilities/Preferences.java diff --git a/src/com/timsu/astrid/utilities/StartupReceiver.java b/src-legacy/com/timsu/astrid/utilities/StartupReceiver.java similarity index 100% rename from src/com/timsu/astrid/utilities/StartupReceiver.java rename to src-legacy/com/timsu/astrid/utilities/StartupReceiver.java diff --git a/src/com/timsu/astrid/utilities/TaskFieldsVisibility.java b/src-legacy/com/timsu/astrid/utilities/TaskFieldsVisibility.java similarity index 100% rename from src/com/timsu/astrid/utilities/TaskFieldsVisibility.java rename to src-legacy/com/timsu/astrid/utilities/TaskFieldsVisibility.java diff --git a/src/com/timsu/astrid/utilities/TasksXmlExporter.java b/src-legacy/com/timsu/astrid/utilities/TasksXmlExporter.java similarity index 100% rename from src/com/timsu/astrid/utilities/TasksXmlExporter.java rename to src-legacy/com/timsu/astrid/utilities/TasksXmlExporter.java diff --git a/src/com/timsu/astrid/utilities/TasksXmlImporter.java b/src-legacy/com/timsu/astrid/utilities/TasksXmlImporter.java similarity index 100% rename from src/com/timsu/astrid/utilities/TasksXmlImporter.java rename to src-legacy/com/timsu/astrid/utilities/TasksXmlImporter.java diff --git a/src/com/timsu/astrid/widget/DateControlSet.java b/src-legacy/com/timsu/astrid/widget/DateControlSet.java similarity index 100% rename from src/com/timsu/astrid/widget/DateControlSet.java rename to src-legacy/com/timsu/astrid/widget/DateControlSet.java diff --git a/src/com/timsu/astrid/widget/DateWithNullControlSet.java b/src-legacy/com/timsu/astrid/widget/DateWithNullControlSet.java similarity index 100% rename from src/com/timsu/astrid/widget/DateWithNullControlSet.java rename to src-legacy/com/timsu/astrid/widget/DateWithNullControlSet.java diff --git a/src/com/timsu/astrid/widget/FilePickerBuilder.java b/src-legacy/com/timsu/astrid/widget/FilePickerBuilder.java similarity index 100% rename from src/com/timsu/astrid/widget/FilePickerBuilder.java rename to src-legacy/com/timsu/astrid/widget/FilePickerBuilder.java diff --git a/src/com/timsu/astrid/widget/NNumberPickerDialog.java b/src-legacy/com/timsu/astrid/widget/NNumberPickerDialog.java similarity index 100% rename from src/com/timsu/astrid/widget/NNumberPickerDialog.java rename to src-legacy/com/timsu/astrid/widget/NNumberPickerDialog.java diff --git a/src/com/timsu/astrid/widget/NumberPicker.java b/src-legacy/com/timsu/astrid/widget/NumberPicker.java similarity index 100% rename from src/com/timsu/astrid/widget/NumberPicker.java rename to src-legacy/com/timsu/astrid/widget/NumberPicker.java diff --git a/src/com/timsu/astrid/widget/NumberPickerButton.java b/src-legacy/com/timsu/astrid/widget/NumberPickerButton.java similarity index 100% rename from src/com/timsu/astrid/widget/NumberPickerButton.java rename to src-legacy/com/timsu/astrid/widget/NumberPickerButton.java diff --git a/src/com/timsu/astrid/widget/NumberPickerDialog.java b/src-legacy/com/timsu/astrid/widget/NumberPickerDialog.java similarity index 100% rename from src/com/timsu/astrid/widget/NumberPickerDialog.java rename to src-legacy/com/timsu/astrid/widget/NumberPickerDialog.java diff --git a/src/com/timsu/astrid/widget/TimeDurationControlSet.java b/src-legacy/com/timsu/astrid/widget/TimeDurationControlSet.java similarity index 100% rename from src/com/timsu/astrid/widget/TimeDurationControlSet.java rename to src-legacy/com/timsu/astrid/widget/TimeDurationControlSet.java diff --git a/src/com/todoroo/astrid/dao/Database.java b/src/com/todoroo/astrid/dao/Database.java new file mode 100644 index 000000000..612951786 --- /dev/null +++ b/src/com/todoroo/astrid/dao/Database.java @@ -0,0 +1,172 @@ +/* + * Copyright (c) 2009, Todoroo Inc + * All Rights Reserved + * http://www.todoroo.com + */ +package com.todoroo.astrid.dao; + +import android.content.Context; +import android.database.sqlite.SQLiteDatabase; +import android.database.sqlite.SQLiteOpenHelper; +import android.database.sqlite.SQLiteDatabase.CursorFactory; +import android.util.Log; + +import com.todoroo.andlib.data.AbstractDatabase; +import com.todoroo.andlib.data.AbstractModel; +import com.todoroo.andlib.data.Property; +import com.todoroo.andlib.data.Table; +import com.todoroo.andlib.service.ContextManager; +import com.todoroo.astrid.model.Metadata; +import com.todoroo.astrid.model.Task; + +/** + * Database wrapper + * + * @author Tim Su + * + */ +public final class Database extends AbstractDatabase { + + // --- constants + + /** + * Database version number. This variable must be updated when database + * tables are updated, as it determines whether a database needs updating. + */ + public static final int VERSION = 1; + + /** + * Database name + */ + private static final String NAME = "database"; //$NON-NLS-1$ + + /** + * List of table/ If you're adding a new table, add it to this list and + * also make sure that BenteSQLiteOpenHelper does the right thing. + */ + public static final Table[] TABLES = new Table[] { + Task.TABLE, + Metadata.TABLE, + }; + + // --- implementation + + /** + * Creates a database wrapper + */ + public Database() { + // + } + + @Override + protected String getName() { + return NAME; + } + + protected int getVersion() { + return VERSION; + } + + @Override + public Table[] getTables() { + return TABLES; + } + + /** + * Default implementation of Astrid database helper + */ + @SuppressWarnings("nls") + public static class AstridSQLiteOpenHelper extends SQLiteOpenHelper { + + public AstridSQLiteOpenHelper(Context context, String name, + CursorFactory factory, int version) { + super(context, name, factory, version); + } + + /** + * Called to create the database tables + */ + @Override + public synchronized void onCreate(SQLiteDatabase db) { + StringBuilder sql = new StringBuilder(); + SqlConstructorVisitor sqlVisitor = new SqlConstructorVisitor(); + + // create tables + for(Table table : TABLES) { + sql.append("CREATE TABLE IF NOT EXISTS ").append(table.getName()).append('('). + append(AbstractModel.ID_PROPERTY).append(" INTEGER PRIMARY KEY AUTOINCREMENT"); + for(Property property : table.getProperties()) { + if(AbstractModel.ID_PROPERTY.equals(property.name)) + continue; + sql.append(',').append(property.accept(sqlVisitor, null)); + } + sql.append(')'); + db.execSQL(sql.toString()); + sql.setLength(0); + } + + // create indices + sql.append("CREATE INDEX IF NOT EXISTS md_tid ON "). + append(Metadata.TABLE).append('('). + append(Metadata.TASK.name). + append(')'); + db.execSQL(sql.toString()); + } + + /** + * Called to upgrade the database to a new version + */ + @Override + public synchronized void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) { + Log.w("database", String.format("Upgrading database from version %d to %d.", + oldVersion, newVersion)); + + switch(oldVersion) { + default: + // We don't know how to handle this case because someone forgot to + // implement the upgrade. We can't drop tables, we can only + // throw a nasty exception at this time + + Log.e("database", "Unsupported migration, tables dropped!"); + throw new IllegalStateException("Missing database migration " + + "from " + oldVersion + " to " + newVersion); + } + } + } + + /** + * Gets the underlying database + * + * @return database object + * @throws IllegalStateException if database hasn't been opened + */ + @Override + public SQLiteDatabase getDatabase() { + if(database == null) + throw new IllegalStateException("Tried to access an unopened database"); //$NON-NLS-1$ + return database; + } + + /** + * Get SQLite Helper + */ + @Override + protected SQLiteOpenHelper getHelper() { + if(helper == null) { + helper = new AstridSQLiteOpenHelper(ContextManager.getContext(), + NAME, null, VERSION); + } + return helper; + } + + /** + * Close the database. This should be used with caution, as there is + * usually only one global connection to the database + */ + @Override + public synchronized void close() { + super.close(); + helper = null; + } +} + diff --git a/src/com/todoroo/astrid/dao/MetadataDao.java b/src/com/todoroo/astrid/dao/MetadataDao.java new file mode 100644 index 000000000..7d322d1c4 --- /dev/null +++ b/src/com/todoroo/astrid/dao/MetadataDao.java @@ -0,0 +1,79 @@ +/* + * Copyright (c) 2009, Todoroo Inc + * All Rights Reserved + * http://www.todoroo.com + */ +package com.todoroo.astrid.dao; + +import android.database.Cursor; +import android.database.DatabaseUtils; + +import com.todoroo.android.data.AbstractDao; +import com.todoroo.android.data.AbstractDatabase; +import com.todoroo.android.data.Property; +import com.todoroo.android.data.TodorooCursor; +import com.todoroo.astrid.model.Metadata; +import com.todoroo.astrid.model.Task; + +/** + * Data Access layer for {@link Metadata}-related operations. + * + * @author Tim Su + * + */ +public class MetadataDao extends AbstractDao { + + public MetadataDao() { + super(Metadata.class); + } + + // --- SQL clause generators + + /** + * Generates SQL clauses + */ + public static class MetadataSql { + + /** Returns all metadata associated with a given task */ + public static String byTask(long taskId) { + return String.format("(%s = %d)", Metadata.TASK, //$NON-NLS-1$ + taskId); + } + + /** Returns all metadata associated with a given key */ + public static String withKey(String key) { + return String.format("(%s = %s)", Metadata.KEY, //$NON-NLS-1$ + DatabaseUtils.sqlEscapeString(key)); + } + + } + + /** + * Delete all matching a clause + * @param database + * @param where + * @return # of deleted items + */ + public int deleteWhere(AbstractDatabase database, String where) { + return database.getDatabase().delete(Database.METADATA_TABLE, where, null); + } + + /** + * Fetch all metadata that are unattached to the task + * @param database + * @param properties + * @return + */ + public TodorooCursor fetchDangling(AbstractDatabase database, Property[] properties) { + String sql = String.format("SELECT %s FROM %s LEFT JOIN %s ON %s.%s = %s.%s WHERE %s.%s ISNULL", //$NON-NLS-1$ + propertiesForSelect(properties, true), + Database.METADATA_TABLE, Database.TASK_TABLE, + Database.METADATA_TABLE, Metadata.TASK, Database.TASK_TABLE, + Task.ID, + Database.TASK_TABLE, Task.TITLE); + Cursor cursor = database.getDatabase().rawQuery(sql, null); + return new TodorooCursor(cursor); + } + +} + diff --git a/src/com/todoroo/astrid/dao/TaskDao.java b/src/com/todoroo/astrid/dao/TaskDao.java new file mode 100644 index 000000000..6d2f7a804 --- /dev/null +++ b/src/com/todoroo/astrid/dao/TaskDao.java @@ -0,0 +1,219 @@ +/* + * Copyright (c) 2009, Todoroo Inc + * All Rights Reserved + * http://www.todoroo.com + */ +package com.todoroo.astrid.dao; + +import android.content.ContentValues; +import android.content.Context; +import android.content.Intent; +import android.database.Cursor; + +import com.todoroo.andlib.data.AbstractDao; +import com.todoroo.andlib.data.AbstractDatabase; +import com.todoroo.andlib.data.Property; +import com.todoroo.andlib.data.TodorooCursor; +import com.todoroo.andlib.service.Autowired; +import com.todoroo.andlib.service.ContextManager; +import com.todoroo.andlib.service.DependencyInjectionService; +import com.todoroo.andlib.utility.DateUtilities; +import com.todoroo.astrid.api.AstridApiConstants; +import com.todoroo.astrid.api.Filter; +import com.todoroo.astrid.dao.MetadataDao.MetadataSql; +import com.todoroo.astrid.model.Task; + +/** + * Data Access layer for {@link Task}-related operations. + * + * @author Tim Su + * + */ +public class TaskDao extends AbstractDao { + + @Autowired + MetadataDao metadataDao; + + public TaskDao() { + super(Task.class); + DependencyInjectionService.getInstance().inject(this); + } + + // --- SQL clause generators + + /** + * Generates SQL clauses + */ + public static class TaskSql { + + /** Returns tasks by id */ + public static String byId(long id) { + return String.format("(%s = %d)", Task.ID, //$NON-NLS-1$ + id); + } + + /** Return tasks that have not yet been completed */ + public static String isActive() { + return String.format("(%s = 0 AND %s = 0)", Task.COMPLETION_DATE, //$NON-NLS-1$ + Task.DELETION_DATE); + } + + /** Return tasks that are not hidden at given unixtime */ + public static String isVisible(int time) { + return String.format("(%s < %d)", Task.HIDDEN_UNTIL, time); //$NON-NLS-1$ + } + + /** Returns tasks that have a due date */ + public static String hasDeadlines() { + return String.format("(%s != 0)", Task.DUE_DATE); //$NON-NLS-1$ + } + + /** Returns tasks that are due before a certain unixtime */ + public static String dueBefore(int time) { + return String.format("(%s > 0 AND %s <= %d)", Task.DUE_DATE, //$NON-NLS-1$ + Task.DUE_DATE, time); + } + + /** Returns tasks that are due after a certain unixtime */ + public static String dueAfter(int time) { + return String.format("(%s > %d)", Task.DUE_DATE, time); //$NON-NLS-1$ + } + + /** Returns tasks completed before a given unixtime */ + public static String completedBefore(int time) { + return String.format("(%s > 0 AND %s < %d)", Task.COMPLETION_DATE, //$NON-NLS-1$ + Task.COMPLETION_DATE, time); + } + + public static String hasNoName() { + return String.format("(%s = \"\")", Task.TITLE); //$NON-NLS-1$ + } + + } + + // --- custom operations + + /** + * Return cursor to all tasks matched by given filter + * + * @param database + * @param properties + * properties to read from task + * @param filter + * {@link Filter} object to use + * @return + */ + public TodorooCursor fetch(Database database, Property[] properties, + Filter filter) { + + String query = String.format( + "SELECT %s FROM %s %s ", //$NON-NLS-1$ + propertiesForSelect(properties, true), + Database.TASK_TABLE, + filter.sqlQuery); + Cursor cursor = database.getDatabase().rawQuery(query, null); + return new TodorooCursor(cursor); + } + + // --- delete + + /** + * Delete the given item + * + * @param database + * @param id + * @return true if delete was successful + */ + @Override + public boolean delete(AbstractDatabase database, long id) { + boolean result = super.delete(database, id); + if(!result) + return false; + + // delete all metadata + metadataDao.deleteWhere(database, MetadataSql.byTask(id)); + + return true; + } + + // --- save + + /** + * Saves the given task to the database.getDatabase(). Task must already + * exist. Returns true on success. + * + * @param duringSync whether this save occurs as part of a sync + */ + public boolean save(Database database, Task task, boolean duringSync) { + boolean saveSuccessful; + + if (task.getId() == Task.NO_ID) { + task.setValue(Task.CREATION_DATE, DateUtilities.now()); + saveSuccessful = createItem(database, Database.TASK_TABLE, task); + + Context context = ContextManager.getContext(); + Intent broadcastIntent = new Intent(AstridApiConstants.BROADCAST_EVENT_TASK_CREATED); + broadcastIntent.putExtra(AstridApiConstants.EXTRAS_TASK_ID, task.getId()); + context.sendOrderedBroadcast(broadcastIntent, null); + } else { + ContentValues values = task.getSetValues(); + + if(values.size() == 0) // nothing changed + return true; + + beforeSave(database, task, values, duringSync); + saveSuccessful = saveItem(database, Database.TASK_TABLE, task); + afterSave(database, task, values, duringSync); + + } + + return saveSuccessful; + } + + /** + * Called before the task is saved. + *
    + *
  • Update notifications based on task status + *
  • Update associated calendar event + * + * @param database + * @param task + * task that was just changed + * @param values + * values that were changed + * @param duringSync + * whether this save occurs as part of a sync + */ + private void beforeSave(Database database, Task task, ContentValues values, boolean duringSync) { + // + } + + /** + * Called after the task is saved. + *
      + *
    • Handle repeating tasks + *
    • Save for synchronization + * + * @param database + * @param task task that was just changed + * @param values values to be persisted to the database + * @param duringSync whether this save occurs as part of a sync + */ + private void afterSave(Database database, Task task, ContentValues values, boolean duringSync) { + if(duringSync) + return; + + // if task was completed, fire task completed notification + if(values.containsKey(Task.COMPLETION_DATE.name) && + values.getAsInteger(Task.COMPLETION_DATE.name) > 0 && !duringSync) { + + Context context = ContextManager.getContext(); + Intent broadcastIntent = new Intent(AstridApiConstants.BROADCAST_EVENT_TASK_COMPLETED); + broadcastIntent.putExtra(AstridApiConstants.EXTRAS_TASK_ID, task.getId()); + context.sendOrderedBroadcast(broadcastIntent, null); + + } + } + +} + diff --git a/src/com/todoroo/astrid/model/Metadata.java b/src/com/todoroo/astrid/model/Metadata.java new file mode 100644 index 000000000..def119b39 --- /dev/null +++ b/src/com/todoroo/astrid/model/Metadata.java @@ -0,0 +1,88 @@ +/** + * See the file "LICENSE" for the full license governing this code. + */ +package com.todoroo.astrid.model; + + +import android.content.ContentValues; + +import com.todoroo.andlib.data.AbstractModel; +import com.todoroo.andlib.data.Property; +import com.todoroo.andlib.data.Table; +import com.todoroo.andlib.data.TodorooCursor; +import com.todoroo.andlib.data.Property.LongProperty; +import com.todoroo.andlib.data.Property.StringProperty; + +/** + * Data Model which represents a piece of metadata associated with a task + * + * @author Tim Su + * + */ +@SuppressWarnings("nls") +public class Metadata extends AbstractModel { + + // --- table + + public static final Table TABLE = new Table("metadata", Metadata.class); + + // --- properties + + /** ID */ + public static final LongProperty ID = new LongProperty( + TABLE, ID_PROPERTY); + + /** Associated Task */ + public static final LongProperty TASK = new LongProperty( + TABLE, "task"); + + /** Metadata Key */ + public static final StringProperty KEY = new StringProperty( + TABLE, "key"); + + /** Metadata Text Value */ + public static final StringProperty VALUE = new StringProperty( + TABLE, "value"); + + /** List of all properties for this model */ + public static final Property[] PROPERTIES = new Property[] { + ID, + TASK, + KEY, + VALUE, + }; + + static { + TABLE.setProperties(PROPERTIES); + } + + // --- defaults + + /** Default values container */ + private static final ContentValues defaultValues = new ContentValues(); + + @Override + public ContentValues getDefaultValues() { + return defaultValues; + } + + // --- data access boilerplate + + public Metadata() { + super(); + } + + public Metadata(TodorooCursor cursor, Property[] properties) { + this(); + readPropertiesFromCursor(cursor, properties); + } + + public void readFromCursor(TodorooCursor cursor, Property[] properties) { + super.readPropertiesFromCursor(cursor, properties); + } + + @Override + public long getId() { + return getIdHelper(ID); + }; +} diff --git a/src/com/todoroo/astrid/model/Task.java b/src/com/todoroo/astrid/model/Task.java new file mode 100644 index 000000000..824909d6e --- /dev/null +++ b/src/com/todoroo/astrid/model/Task.java @@ -0,0 +1,196 @@ +/* + * Copyright (c) 2009, Todoroo Inc + * All Rights Reserved + * http://www.todoroo.com + */ +package com.todoroo.astrid.model; + + +import android.content.ContentValues; + +import com.todoroo.andlib.data.AbstractModel; +import com.todoroo.andlib.data.Property; +import com.todoroo.andlib.data.Table; +import com.todoroo.andlib.data.TodorooCursor; +import com.todoroo.andlib.data.Property.IntegerProperty; +import com.todoroo.andlib.data.Property.LongProperty; +import com.todoroo.andlib.data.Property.StringProperty; +import com.todoroo.andlib.utility.DateUtilities; +import com.todoroo.astrid.api.AstridContentProvider.AstridTask; + +/** + * Data Model which represents a task users need to accomplish. + * + * @author Tim Su + * + */ +@SuppressWarnings("nls") +public class Task extends AbstractModel { + + // --- table + + public static final Table TABLE = new Table("tasks", Task.class); + + // --- properties + + /** ID */ + public static final LongProperty ID = new LongProperty( + TABLE, AstridTask.ID); + + /** Name of Task */ + public static final StringProperty TITLE = new StringProperty( + TABLE, AstridTask.TITLE); + + /** Urgency of Task (see urgency flags) */ + public static final IntegerProperty URGENCY = new IntegerProperty( + TABLE, AstridTask.URGENCY); + + /** Importance of Task (see importance flags) */ + public static final IntegerProperty IMPORTANCE = new IntegerProperty( + TABLE, AstridTask.IMPORTANCE); + + /** Unixtime Task is due, 0 if not set */ + public static final IntegerProperty DUE_DATE = new IntegerProperty( + TABLE, AstridTask.DUE_DATE); + + /** Unixtime Task should be hidden until */ + public static final IntegerProperty HIDDEN_UNTIL = new IntegerProperty( + TABLE, AstridTask.HIDDEN_UNTIL); + + /** Unixtime Task was created */ + public static final IntegerProperty CREATION_DATE = new IntegerProperty( + TABLE, AstridTask.CREATION_DATE); + + /** Unixtime Task was completed. 0 means active */ + public static final IntegerProperty COMPLETION_DATE = new IntegerProperty( + TABLE, AstridTask.COMPLETION_DATE); + + /** Unixtime Task was deleted. 0 means active */ + public static final IntegerProperty DELETION_DATE = new IntegerProperty( + TABLE, AstridTask.DELETION_DATE); + + /** List of all properties for this model */ + public static final Property[] PROPERTIES = new Property[] { + ID, + TITLE, + URGENCY, + IMPORTANCE, + DUE_DATE, + HIDDEN_UNTIL, + CREATION_DATE, + COMPLETION_DATE, + DELETION_DATE + }; + + static { + TABLE.setProperties(PROPERTIES); + } + + // --- urgency flags + + public static final int URGENCY_NONE = AstridTask.URGENCY_NONE; + public static final int URGENCY_TODAY = AstridTask.URGENCY_TODAY; + public static final int URGENCY_THIS_WEEK = AstridTask.URGENCY_THIS_WEEK; + public static final int URGENCY_THIS_MONTH = AstridTask.URGENCY_THIS_MONTH; + public static final int URGENCY_WITHIN_THREE_MONTHS = AstridTask.URGENCY_WITHIN_THREE_MONTHS; + public static final int URGENCY_WITHIN_SIX_MONTHS = AstridTask.URGENCY_WITHIN_SIX_MONTHS; + public static final int URGENCY_WITHIN_A_YEAR = AstridTask.URGENCY_WITHIN_A_YEAR; + public static final int URGENCY_SPECIFIC_DAY = AstridTask.URGENCY_SPECIFIC_DAY; + public static final int URGENCY_SPECIFIC_DAY_TIME = AstridTask.URGENCY_SPECIFIC_DAY_TIME; + + // --- importance flags + + public static final int IMPORTANCE_DO_OR_DIE = AstridTask.IMPORTANCE_DO_OR_DIE; + public static final int IMPORTANCE_MUST_DO = AstridTask.IMPORTANCE_MUST_DO; + public static final int IMPORTANCE_SHOULD_DO = AstridTask.IMPORTANCE_SHOULD_DO; + public static final int IMPORTANCE_NONE = AstridTask.IMPORTANCE_NONE; + + // --- defaults + + /** Default values container */ + private static final ContentValues defaultValues = new ContentValues(); + + static { + defaultValues.put(TITLE.name, ""); + defaultValues.put(DUE_DATE.name, 0); + defaultValues.put(HIDDEN_UNTIL.name, 0); + defaultValues.put(COMPLETION_DATE.name, 0); + defaultValues.put(DELETION_DATE.name, 0); + defaultValues.put(URGENCY.name, URGENCY_NONE); + defaultValues.put(IMPORTANCE.name, IMPORTANCE_NONE); + } + + private static boolean defaultValuesLoaded = false; + + public static ContentValues getStaticDefaultValues() { + return defaultValues; + } + + /** + * Call to load task default values from preferences. + */ + public static void refreshDefaultValues() { + /*defaultValues.put(URGENCY.name, + Preferences.getIntegerFromString(R.string.EPr_default_urgency_key)); + defaultValues.put(IMPORTANCE.name, + Preferences.getIntegerFromString(R.string.EPr_default_importance_key));*/ + defaultValuesLoaded = true; + } + + @Override + public ContentValues getDefaultValues() { + // if refreshDefaultValues has never been called, call it + if(!defaultValuesLoaded) { + refreshDefaultValues(); + } + + return defaultValues; + } + + // --- data access boilerplate + + public Task() { + super(); + } + + public Task(TodorooCursor cursor, Property[] properties) { + this(); + readPropertiesFromCursor(cursor, properties); + } + + public void readFromCursor(TodorooCursor cursor, Property[] properties) { + super.readPropertiesFromCursor(cursor, properties); + } + + @Override + public long getId() { + return getIdHelper(ID); + } + + // --- data access methods + + /** Checks whether task is done. Requires COMPLETION_DATE */ + public boolean isCompleted() { + return getValue(COMPLETION_DATE) > 0; + } + + /** Checks whether task is deleted. Will return false if DELETION_DATE not read */ + public boolean isDeleted() { + try { + return getValue(DELETION_DATE) > 0; + } catch (UnsupportedOperationException e) { + return false; + } + } + + /** Checks whether task is hidden. Requires HIDDEN_UNTIL */ + public boolean isHidden() { + return getValue(HIDDEN_UNTIL) > DateUtilities.now(); + } + + /** Checks whether task is done. Requires DUE_DATE */ + public boolean hasDueDate() { + return getValue(DUE_DATE) > 0; + } + +} \ No newline at end of file diff --git a/src/com/todoroo/astrid/service/AstridDependencyInjector.java b/src/com/todoroo/astrid/service/AstridDependencyInjector.java new file mode 100644 index 000000000..c590455f6 --- /dev/null +++ b/src/com/todoroo/astrid/service/AstridDependencyInjector.java @@ -0,0 +1,148 @@ +/** + * See the file "LICENSE" for the full license governing this code. + */ +package com.todoroo.astrid.service; + +import java.lang.ref.WeakReference; +import java.lang.reflect.Field; +import java.util.HashMap; + +import com.timsu.astrid.R; +import com.todoroo.andlib.service.AbstractDependencyInjector; +import com.todoroo.andlib.service.DependencyInjectionService; +import com.todoroo.andlib.service.ExceptionService; +import com.todoroo.andlib.service.ExceptionService.AndroidLogReporter; +import com.todoroo.andlib.service.ExceptionService.ErrorReporter; +import com.todoroo.andlib.utility.DateUtilities; +import com.todoroo.andlib.utility.DialogUtilities; +import com.todoroo.astrid.dao.Database; +import com.todoroo.astrid.dao.MetadataDao; +import com.todoroo.astrid.dao.TaskDao; + +/** + * Astrid application dependency injector loads classes in Astrid with the + * appropriate instantiated objects necessary for their operation. For + * more information on Dependency Injection, see {@link DependencyInjectionService} + * and {@link AbstractDependencyInjector}. + * + * @author Tim Su + * + */ +public class AstridDependencyInjector implements AbstractDependencyInjector { + + private static final boolean DEBUG = false; + + /** + * Boolean bit to prevent multiple copies of this injector to be loaded + */ + private static boolean initialized = false; + + /** + * Dependencies this class knows how to handle + */ + private static final HashMap injectables = new HashMap(); + + /** + * Cache of classes that were instantiated by the injector + */ + private final HashMap, WeakReference> createdObjects = + new HashMap, WeakReference>(); + + /** + * Initialize list of injectables. Special care must used when + * instantiating classes that themselves depend on dependency injection + * (i.e. {@link ErrorReporter}. + */ + @SuppressWarnings("nls") + private static void addInjectables() { + injectables.put("debug", DEBUG); + + // com.todoroo.android.service + injectables.put("applicationName", "astrid"); + injectables.put("exceptionService", ExceptionService.class); + injectables.put("errorDialogTitleResource", R.string.DLG_error); + + // com.todoroo.android.utility + injectables.put("dialogUtilities", DialogUtilities.class); + injectables.put("informationDialogTitleResource", R.string.DLG_information_title); + injectables.put("dateUtilities", DateUtilities.class); + injectables.put("yearsResource", R.plurals.DUt_years); + injectables.put("monthsResource", R.plurals.DUt_months); + injectables.put("daysResource", R.plurals.DUt_days); + injectables.put("hoursResource", R.plurals.DUt_hours); + injectables.put("minutesResource", R.plurals.DUt_minutes); + injectables.put("secondsResource", R.plurals.DUt_seconds); + injectables.put("daysAbbrevResource", R.plurals.DUt_days); + injectables.put("hoursAbbrevResource", R.plurals.DUt_hoursShort); + injectables.put("minutesAbbrevResource", R.plurals.DUt_minutesShort); + injectables.put("secondsAbbrevResource", R.plurals.DUt_secondsShort); + + // com.todoroo.astrid.dao + injectables.put("database", Database.class); + injectables.put("taskDao", TaskDao.class); + injectables.put("metadataDao", MetadataDao.class); + + // com.todoroo.astrid.service + injectables.put("taskService", TaskService.class); + injectables.put("metadataService", MetadataService.class); + + // these make reference to fields defined above + injectables.put("errorReporters", new ErrorReporter[] { + new AndroidLogReporter(), + new FlurryReporter() + }); + } + + /** + * {@inheritDoc} + */ + public Object getInjection(Object object, Field field) { + if(injectables.containsKey(field.getName())) { + Object injection = injectables.get(field.getName()); + + // if it's a class, instantiate the class + if(injection instanceof Class) { + if(createdObjects.containsKey(injection) && + createdObjects.get(injection).get() != null) { + injection = createdObjects.get(injection).get(); + } else { + Class cls = (Class)injection; + try { + injection = cls.newInstance(); + } catch (IllegalAccessException e) { + throw new RuntimeException(e); + } catch (InstantiationException e) { + throw new RuntimeException(e); + } + + createdObjects.put(cls, + new WeakReference(injection)); + } + } + + return injection; + } + + return null; + } + + /** + * Install this service as the default Dependency Injector + */ + public synchronized static void initialize() { + if(initialized) + return; + initialized = true; + + AstridDependencyInjector injector = new AstridDependencyInjector(); + DependencyInjectionService.getInstance().setInjectors(new AbstractDependencyInjector[] { + injector + }); + + addInjectables(); + } + + AstridDependencyInjector() { + // prevent instantiation + } +} diff --git a/src/com/todoroo/astrid/service/MetadataService.java b/src/com/todoroo/astrid/service/MetadataService.java new file mode 100644 index 000000000..7beee88ec --- /dev/null +++ b/src/com/todoroo/astrid/service/MetadataService.java @@ -0,0 +1,91 @@ +package com.todoroo.astrid.service; + +import com.todoroo.android.data.Property; +import com.todoroo.android.data.TodorooCursor; +import com.todoroo.android.data.Property.IntegerProperty; +import com.todoroo.android.service.Autowired; +import com.todoroo.android.service.DependencyInjectionService; +import com.todoroo.astrid.dao.Database; +import com.todoroo.astrid.dao.MetadataDao; +import com.todoroo.astrid.model.Metadata; + +/** + * Service layer for {@link Metadata}-centered activities. + * + * @author Tim Su + * + */ +public class MetadataService { + + @Autowired + private Database database; + + @Autowired + private MetadataDao metadataDao; + + public MetadataService() { + DependencyInjectionService.getInstance().inject(this); + } + + // --- property list + + /** + * @return property list containing just task id's + */ + public static Property[] idProperty() { + return new Property[] { Metadata.ID }; + } + + /** + * @return property list containing just task id's + */ + public static Property[] valueProperty() { + return new Property[] { Metadata.VALUE }; + } + + // --- service layer + + /** + * Clean up metadata. Typically called on startup + */ + public void cleanup() { + TodorooCursor cursor = metadataDao.fetchDangling(database, idProperty()); + try { + if(cursor.getCount() == 0) + return; + + for(cursor.moveToFirst(); !cursor.isAfterLast(); cursor.moveToNext()) { + long id = cursor.getLong(0); + metadataDao.delete(database, id); + } + } finally { + cursor.close(); + } + } + + /** + * Retrieve count of all metadata grouped by value + * @param where SQL where clause + * @param onlyCountsGreaterThanZero only include items where count > 0 + */ + public TodorooCursor fetchWithCount(String where, String sort, + boolean onlyCountsGreaterThanZero) { + IntegerProperty count = Property.countProperty(); + String having = null; + if(onlyCountsGreaterThanZero) + having = count.name + " > 0"; //$NON-NLS-1$ + TodorooCursor cursor = metadataDao.fetch(database, new Property[] { + Metadata.VALUE, count }, + where, + Metadata.VALUE.name, having, sort, null); + return cursor; + } + + /** + * Delete from metadata table where rows match a certain condition + * @param where + */ + public void deleteWhere(String where) { + metadataDao.deleteWhere(database, where); + } +} diff --git a/src/com/todoroo/astrid/service/TaskService.java b/src/com/todoroo/astrid/service/TaskService.java new file mode 100644 index 000000000..14a299c37 --- /dev/null +++ b/src/com/todoroo/astrid/service/TaskService.java @@ -0,0 +1,130 @@ +package com.todoroo.astrid.service; + +import com.todoroo.android.data.Property; +import com.todoroo.android.data.TodorooCursor; +import com.todoroo.android.service.Autowired; +import com.todoroo.android.service.DependencyInjectionService; +import com.todoroo.android.utility.DateUtilities; +import com.todoroo.astrid.api.Filter; +import com.todoroo.astrid.dao.Database; +import com.todoroo.astrid.dao.TaskDao; +import com.todoroo.astrid.dao.TaskDao.TaskSql; +import com.todoroo.astrid.model.Task; + +/** + * Service layer for {@link Task}-centered activities. + * + * @author Tim Su + * + */ +public class TaskService { + + @Autowired + private Database database; + + @Autowired + private TaskDao taskDao; + + public TaskService() { + DependencyInjectionService.getInstance().inject(this); + } + + // --- property list + + /** + * @return property list containing just task id's + */ + public static Property[] idProperties() { + return new Property[] { Task.ID }; + } + + // --- service layer + + /** + * Return cursor to tasks returned by given {@link Filter} + * + * @param properties + * @param filter + * @return + */ + public TodorooCursor fetchFiltered(Property[] properties, + Filter filter) { + return taskDao.fetch(database, properties, filter); + } + + /** + * + * @param properties + * @param id id + * @return item, or null if it doesn't exist + */ + public Task fetchById(Property[] properties, + long id) { + return taskDao.fetch(database, properties, id); + } + + /** + * Mark the given action item as completed and save it. + * + * @param item + */ + public void setComplete(Task item, boolean completed) { + if(completed) + item.setValue(Task.COMPLETION_DATE, DateUtilities.now()); + else + item.setValue(Task.COMPLETION_DATE, 0); + + taskDao.save(database, item, false); + } + + /** + * Create or save the given action item + * + * @param item + * @param isDuringSync + * Whether this operation is invoked from synchronizer. This + * determines which pre and post save hooks get run + */ + public boolean save(Task item, boolean isDuringSync) { + return taskDao.save(database, item, isDuringSync); + } + + /** + * Delete the given action item + * + * @param model + */ + public void delete(long itemId) { + taskDao.delete(database, itemId); + } + + /** + * Clean up tasks. Typically called on startup + */ + public void cleanup() { + TodorooCursor cursor = taskDao.fetch(database, idProperties(), TaskSql.hasNoName(), null); + try { + if(cursor.getCount() == 0) + return; + + for(cursor.moveToFirst(); !cursor.isAfterLast(); cursor.moveToNext()) { + long id = cursor.getLong(0); + taskDao.delete(database, id); + } + } finally { + cursor.close(); + } + } + + /** + * Invoke the sql in the filter for sqlforNewTasks + * + * @param filter + * @param task + */ + public void invokeSqlForNewTask(Filter filter, Task task) { + String sql = filter.sqlForNewTasks.replace("$ID", //$NON-NLS-1$ + Long.toString(task.getId())); + database.getDatabase().execSQL(sql); + } +} diff --git a/src/com/todoroo/astrid/utility/Constants.java b/src/com/todoroo/astrid/utility/Constants.java new file mode 100644 index 000000000..f0d6ee054 --- /dev/null +++ b/src/com/todoroo/astrid/utility/Constants.java @@ -0,0 +1,10 @@ +package com.todoroo.astrid.utility; + +public final class Constants { + + /** + * Flurry API Key + */ + public static final String FLURRY_KEY = "T3JAY9TV2JFMJR4YTG16"; //$NON-NLS-1$ + +}