From 458ef95b557a4aa3123cb70c821c04e333db614d Mon Sep 17 00:00:00 2001 From: Petros Paraskevopoulos Date: Tue, 5 Sep 2023 14:31:23 +0300 Subject: [PATCH 01/38] Analysis: Add missing n-a to fetch terms payload FYI: 'n-a' stands for 'nullability annotations'. --- .../org/wordpress/android/fluxc/store/TaxonomyStore.java | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/fluxc/src/main/java/org/wordpress/android/fluxc/store/TaxonomyStore.java b/fluxc/src/main/java/org/wordpress/android/fluxc/store/TaxonomyStore.java index 0705cd6170..3f58103e88 100644 --- a/fluxc/src/main/java/org/wordpress/android/fluxc/store/TaxonomyStore.java +++ b/fluxc/src/main/java/org/wordpress/android/fluxc/store/TaxonomyStore.java @@ -32,10 +32,10 @@ public class TaxonomyStore extends Store { public static final String DEFAULT_TAXONOMY_TAG = "post_tag"; public static class FetchTermsPayload extends Payload { - public SiteModel site; - public TaxonomyModel taxonomy; + @NonNull public SiteModel site; + @NonNull public TaxonomyModel taxonomy; - public FetchTermsPayload(SiteModel site, TaxonomyModel taxonomy) { + public FetchTermsPayload(@NonNull SiteModel site, @NonNull TaxonomyModel taxonomy) { this.site = site; this.taxonomy = taxonomy; } From 288221081fb95cba116e454c8a5e90451ef6395e Mon Sep 17 00:00:00 2001 From: Petros Paraskevopoulos Date: Tue, 5 Sep 2023 14:58:10 +0300 Subject: [PATCH 02/38] Analysis: Add missing n-a to taxonomy model FYI: 'n-a' stands for 'nullability annotations'. This 'TaxonomyModel' is never being used in production, that is, at least via the JP/WPAndroid app. As such, the nullability on the 'mName', 'mLabel' and 'mDescription' fields are being dictated by tests. As such, and because every test that is using a 'TaxonomyModel' is also setting its 'mName' right after, this is why this field is being annotated as '@NonNull'. The same does not apply for the 'mLabel' and 'mDescription' fields and as such, those field are being annotated as '@Nullable'. PS: This 'NotNullFieldNotInitialized' warning got suppressed because a table related 'model' class can never have its fields initialized via a constructor initialization, or otherwise for that matter. --- .../android/fluxc/model/TaxonomyModel.java | 21 ++++++++++++------- 1 file changed, 14 insertions(+), 7 deletions(-) diff --git a/fluxc/src/main/java/org/wordpress/android/fluxc/model/TaxonomyModel.java b/fluxc/src/main/java/org/wordpress/android/fluxc/model/TaxonomyModel.java index 9f3512bfc4..1c913db9a6 100644 --- a/fluxc/src/main/java/org/wordpress/android/fluxc/model/TaxonomyModel.java +++ b/fluxc/src/main/java/org/wordpress/android/fluxc/model/TaxonomyModel.java @@ -1,5 +1,8 @@ package org.wordpress.android.fluxc.model; +import androidx.annotation.NonNull; +import androidx.annotation.Nullable; + import com.yarolegovich.wellsql.core.Identifiable; import com.yarolegovich.wellsql.core.annotation.Column; import com.yarolegovich.wellsql.core.annotation.PrimaryKey; @@ -12,15 +15,16 @@ import java.io.Serializable; @Table +@SuppressWarnings("NotNullFieldNotInitialized") public class TaxonomyModel extends Payload implements Identifiable, Serializable { private static final long serialVersionUID = 8855881690971305398L; @PrimaryKey @Column private int mId; @Column private int mLocalSiteId; - @Column private String mName; - @Column private String mLabel; - @Column private String mDescription; + @NonNull @Column private String mName; + @Nullable @Column private String mLabel; + @Nullable @Column private String mDescription; @Column private boolean mIsHierarchical; @Column private boolean mIsPublic; @@ -42,27 +46,30 @@ public void setLocalSiteId(int localSiteId) { mLocalSiteId = localSiteId; } + @NonNull public String getName() { return mName; } - public void setName(String name) { + public void setName(@NonNull String name) { mName = name; } + @Nullable public String getLabel() { return mLabel; } - public void setLabel(String label) { + public void setLabel(@Nullable String label) { mLabel = label; } + @Nullable public String getDescription() { return mDescription; } - public void setDescription(String description) { + public void setDescription(@Nullable String description) { mDescription = description; } @@ -83,7 +90,7 @@ public void setIsPublic(boolean isPublic) { } @Override - public boolean equals(Object other) { + public boolean equals(@Nullable Object other) { if (this == other) return true; if (other == null || !(other instanceof TaxonomyModel)) return false; From a51d38b7f562e153e1f0059cdf32e32603fe8ea4 Mon Sep 17 00:00:00 2001 From: Petros Paraskevopoulos Date: Tue, 5 Sep 2023 15:03:11 +0300 Subject: [PATCH 03/38] Analysis: Suppress condition covered by further condition warning Warning: "Condition 'other == null' covered by subsequent condition '!(other instanceof TaxonomyModel)'" FYI: One could resolve this warning, simply by removing the unnecessary 'other == null' condition, but this would change the 'equals(...)' logic and possible introduce some kind of a regression, most liked performance wise. Thus, it is better to ignore this atm, just by suppressing it, and call this out of scope. --- .../java/org/wordpress/android/fluxc/model/TaxonomyModel.java | 1 + 1 file changed, 1 insertion(+) diff --git a/fluxc/src/main/java/org/wordpress/android/fluxc/model/TaxonomyModel.java b/fluxc/src/main/java/org/wordpress/android/fluxc/model/TaxonomyModel.java index 1c913db9a6..b3cba6fe59 100644 --- a/fluxc/src/main/java/org/wordpress/android/fluxc/model/TaxonomyModel.java +++ b/fluxc/src/main/java/org/wordpress/android/fluxc/model/TaxonomyModel.java @@ -90,6 +90,7 @@ public void setIsPublic(boolean isPublic) { } @Override + @SuppressWarnings("ConditionCoveredByFurtherCondition") public boolean equals(@Nullable Object other) { if (this == other) return true; if (other == null || !(other instanceof TaxonomyModel)) return false; From 4deacc9fba36cd9d62be0a10baab396d5673be24 Mon Sep 17 00:00:00 2001 From: Petros Paraskevopoulos Date: Tue, 5 Sep 2023 15:43:58 +0300 Subject: [PATCH 04/38] Analysis: Add missing n-a to fetch terms response payload FYI: 'n-a' stands for 'nullability annotations'. PS.1: This 'NotNullFieldNotInitialized' warning got suppressed because a 'payload' static class has both, a 'normal' and an 'error' payload. Although a 'normal' payload could have its fields annotated with '@NonNull', that is, when they are being instantiated as such via its 'normal' constructor, because of the 'error' payload, and its constructor not needing most of those necessarily, this '@NonNull' condition might no longer be valid for both those 'payload' classes. PS.2: With this change, and because an 'error' payload needs to always go via an 'payload.isError()' check, it is assumed that those '@NonNull' fields will never be accessed, that is when the 'payload.isError()' check returns true. Thus, and in order to have a better nullability throughput when on the 'normal' branch, it has been decided in this change to suppress this 'NotNullFieldNotInitialized' warning and ignore cases where those fields are incorrectly access, when on the 'error' branch, which, unfortunately, could potentially cause a NPE. To make this a bit more clear, an extra comment is added on those fields that are '@NonNull' on both, the 'normal' and 'error' branches. This is done in order for future authors to understand which field(s) can be utilized when on the 'error' branch, and which can't/shouldn't. --- .../android/fluxc/store/TaxonomyStore.java | 13 +++++++------ 1 file changed, 7 insertions(+), 6 deletions(-) diff --git a/fluxc/src/main/java/org/wordpress/android/fluxc/store/TaxonomyStore.java b/fluxc/src/main/java/org/wordpress/android/fluxc/store/TaxonomyStore.java index 3f58103e88..a3261a900c 100644 --- a/fluxc/src/main/java/org/wordpress/android/fluxc/store/TaxonomyStore.java +++ b/fluxc/src/main/java/org/wordpress/android/fluxc/store/TaxonomyStore.java @@ -41,18 +41,19 @@ public FetchTermsPayload(@NonNull SiteModel site, @NonNull TaxonomyModel taxonom } } + @SuppressWarnings("NotNullFieldNotInitialized") public static class FetchTermsResponsePayload extends Payload { - public TermsModel terms; - public SiteModel site; - public String taxonomy; + @NonNull public TermsModel terms; + @NonNull public SiteModel site; + @NonNull public String taxonomy; // This field is also included in error payload. - public FetchTermsResponsePayload(TermsModel terms, SiteModel site, String taxonomy) { + public FetchTermsResponsePayload(@NonNull TermsModel terms, @NonNull SiteModel site, @NonNull String taxonomy) { this.terms = terms; this.site = site; this.taxonomy = taxonomy; } - public FetchTermsResponsePayload(TaxonomyError error, String taxonomy) { + public FetchTermsResponsePayload(@NonNull TaxonomyError error, @NonNull String taxonomy) { this.error = error; this.taxonomy = taxonomy; } @@ -330,7 +331,7 @@ private void fetchTerms(@NonNull FetchTermsPayload payload) { fetchTerms(payload.site, payload.taxonomy.getName()); } - private void handleFetchTermsCompleted(FetchTermsResponsePayload payload) { + private void handleFetchTermsCompleted(@NonNull FetchTermsResponsePayload payload) { OnTaxonomyChanged onTaxonomyChanged; if (payload.isError()) { From f37428ad03a6428e2ba9f1f98fafa9158feb69c2 Mon Sep 17 00:00:00 2001 From: Petros Paraskevopoulos Date: Tue, 5 Sep 2023 17:13:32 +0300 Subject: [PATCH 05/38] Analysis: Add missing n-a to on term uploaded store FYI: 'n-a' stands for 'nullability annotations'. --- .../android/fluxc/release/ReleaseStack_TaxonomyTestWPCom.java | 2 +- .../fluxc/release/ReleaseStack_TaxonomyTestXMLRPC.java | 4 +++- .../wordpress/android/fluxc/example/TaxonomiesFragment.java | 3 ++- .../java/org/wordpress/android/fluxc/store/TaxonomyStore.java | 4 ++-- 4 files changed, 8 insertions(+), 5 deletions(-) diff --git a/example/src/androidTest/java/org/wordpress/android/fluxc/release/ReleaseStack_TaxonomyTestWPCom.java b/example/src/androidTest/java/org/wordpress/android/fluxc/release/ReleaseStack_TaxonomyTestWPCom.java index 73fd2650d1..e6ed4138e5 100644 --- a/example/src/androidTest/java/org/wordpress/android/fluxc/release/ReleaseStack_TaxonomyTestWPCom.java +++ b/example/src/androidTest/java/org/wordpress/android/fluxc/release/ReleaseStack_TaxonomyTestWPCom.java @@ -301,7 +301,7 @@ public void onTaxonomyChanged(OnTaxonomyChanged event) { @SuppressWarnings("unused") @Subscribe - public void onTermUploaded(OnTermUploaded event) { + public void onTermUploaded(@NonNull OnTermUploaded event) { AppLog.i(T.API, "Received OnTermUploaded"); if (event.isError()) { AppLog.i(T.API, "OnTermUploaded has error: " + event.error.type + " - " + event.error.message); diff --git a/example/src/androidTest/java/org/wordpress/android/fluxc/release/ReleaseStack_TaxonomyTestXMLRPC.java b/example/src/androidTest/java/org/wordpress/android/fluxc/release/ReleaseStack_TaxonomyTestXMLRPC.java index b8d00162cd..bee6e3dc5a 100644 --- a/example/src/androidTest/java/org/wordpress/android/fluxc/release/ReleaseStack_TaxonomyTestXMLRPC.java +++ b/example/src/androidTest/java/org/wordpress/android/fluxc/release/ReleaseStack_TaxonomyTestXMLRPC.java @@ -1,5 +1,7 @@ package org.wordpress.android.fluxc.release; +import androidx.annotation.NonNull; + import org.greenrobot.eventbus.Subscribe; import org.junit.Ignore; import org.junit.Test; @@ -318,7 +320,7 @@ public void onTaxonomyChanged(OnTaxonomyChanged event) { @SuppressWarnings("unused") @Subscribe - public void onTermUploaded(OnTermUploaded event) { + public void onTermUploaded(@NonNull OnTermUploaded event) { AppLog.i(T.API, "Received OnTermUploaded"); if (event.isError()) { AppLog.i(T.API, "OnTermUploaded has error: " + event.error.type + " - " + event.error.message); diff --git a/example/src/main/java/org/wordpress/android/fluxc/example/TaxonomiesFragment.java b/example/src/main/java/org/wordpress/android/fluxc/example/TaxonomiesFragment.java index 6120dc9856..7dbbcd0983 100644 --- a/example/src/main/java/org/wordpress/android/fluxc/example/TaxonomiesFragment.java +++ b/example/src/main/java/org/wordpress/android/fluxc/example/TaxonomiesFragment.java @@ -7,6 +7,7 @@ import android.view.View.OnClickListener; import android.view.ViewGroup; +import androidx.annotation.NonNull; import androidx.fragment.app.Fragment; import org.greenrobot.eventbus.Subscribe; @@ -122,7 +123,7 @@ public void onTaxonomyChanged(OnTaxonomyChanged event) { @SuppressWarnings("unused") @Subscribe(threadMode = ThreadMode.MAIN) - public void onTermUploaded(OnTermUploaded event) { + public void onTermUploaded(@NonNull OnTermUploaded event) { prependToLog("Term uploaded! Remote category id: " + event.term.getRemoteTermId()); } diff --git a/fluxc/src/main/java/org/wordpress/android/fluxc/store/TaxonomyStore.java b/fluxc/src/main/java/org/wordpress/android/fluxc/store/TaxonomyStore.java index a3261a900c..4e1ea0f6d8 100644 --- a/fluxc/src/main/java/org/wordpress/android/fluxc/store/TaxonomyStore.java +++ b/fluxc/src/main/java/org/wordpress/android/fluxc/store/TaxonomyStore.java @@ -95,9 +95,9 @@ public OnTaxonomyChanged(int rowsAffected) { } public static class OnTermUploaded extends OnChanged { - public TermModel term; + @NonNull public TermModel term; - public OnTermUploaded(TermModel term) { + public OnTermUploaded(@NonNull TermModel term) { this.term = term; } } From 0b49e4c9dce10ad6d26089ab22548e229d6e0c8d Mon Sep 17 00:00:00 2001 From: Petros Paraskevopoulos Date: Tue, 5 Sep 2023 17:15:12 +0300 Subject: [PATCH 06/38] Analysis: Add missing n-a to on term update/remove term store methods FYI: 'n-a' stands for 'nullability annotations'. --- .../java/org/wordpress/android/fluxc/store/TaxonomyStore.java | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/fluxc/src/main/java/org/wordpress/android/fluxc/store/TaxonomyStore.java b/fluxc/src/main/java/org/wordpress/android/fluxc/store/TaxonomyStore.java index 4e1ea0f6d8..737781c701 100644 --- a/fluxc/src/main/java/org/wordpress/android/fluxc/store/TaxonomyStore.java +++ b/fluxc/src/main/java/org/wordpress/android/fluxc/store/TaxonomyStore.java @@ -436,7 +436,7 @@ private void deleteTerm(@NonNull RemoteTermPayload payload) { } } - private void updateTerm(TermModel term) { + private void updateTerm(@NonNull TermModel term) { int rowsAffected = TaxonomySqlUtils.insertOrUpdateTerm(term); OnTaxonomyChanged onTaxonomyChanged = new OnTaxonomyChanged(rowsAffected, term.getTaxonomy()); @@ -444,7 +444,7 @@ private void updateTerm(TermModel term) { emitChange(onTaxonomyChanged); } - private void removeTerm(TermModel term) { + private void removeTerm(@NonNull TermModel term) { int rowsAffected = TaxonomySqlUtils.removeTerm(term); OnTaxonomyChanged onTaxonomyChanged = new OnTaxonomyChanged(rowsAffected, term.getTaxonomy()); From 41c56a553239d0d88da58611f0699b7cfcd1f4c2 Mon Sep 17 00:00:00 2001 From: Petros Paraskevopoulos Date: Tue, 5 Sep 2023 17:25:23 +0300 Subject: [PATCH 07/38] Analysis: Add missing n-a to on get tags for post store method FYI: 'n-a' stands for 'nullability annotations'. --- .../android/fluxc/persistence/TaxonomySqlUtils.java | 11 ++++++++--- .../wordpress/android/fluxc/store/TaxonomyStore.java | 3 ++- 2 files changed, 10 insertions(+), 4 deletions(-) diff --git a/fluxc/src/main/java/org/wordpress/android/fluxc/persistence/TaxonomySqlUtils.java b/fluxc/src/main/java/org/wordpress/android/fluxc/persistence/TaxonomySqlUtils.java index 1c05af5f3c..e2bb8acd2e 100644 --- a/fluxc/src/main/java/org/wordpress/android/fluxc/persistence/TaxonomySqlUtils.java +++ b/fluxc/src/main/java/org/wordpress/android/fluxc/persistence/TaxonomySqlUtils.java @@ -1,5 +1,7 @@ package org.wordpress.android.fluxc.persistence; +import androidx.annotation.NonNull; + import com.wellsql.generated.TermModelTable; import com.yarolegovich.wellsql.WellSql; @@ -108,9 +110,12 @@ public static List getTermsFromRemoteIdList(List remoteTermIds, .getAsModel(); } - public static List getTermsFromRemoteNameList(List remoteTermNames, SiteModel site, - String taxonomyName) { - if (taxonomyName == null || remoteTermNames == null || remoteTermNames.isEmpty()) { + @NonNull + public static List getTermsFromRemoteNameList( + @NonNull List remoteTermNames, + @NonNull SiteModel site, + @NonNull String taxonomyName) { + if (remoteTermNames.isEmpty()) { return Collections.emptyList(); } diff --git a/fluxc/src/main/java/org/wordpress/android/fluxc/store/TaxonomyStore.java b/fluxc/src/main/java/org/wordpress/android/fluxc/store/TaxonomyStore.java index 737781c701..089b12a664 100644 --- a/fluxc/src/main/java/org/wordpress/android/fluxc/store/TaxonomyStore.java +++ b/fluxc/src/main/java/org/wordpress/android/fluxc/store/TaxonomyStore.java @@ -259,7 +259,8 @@ public List getCategoriesForPost(PostImmutableModel post, SiteModel s /** * Returns all the tags for the given post as a {@link TermModel} list. */ - public List getTagsForPost(PostImmutableModel post, SiteModel site) { + @NonNull + public List getTagsForPost(@NonNull PostImmutableModel post, @NonNull SiteModel site) { return TaxonomySqlUtils.getTermsFromRemoteNameList(post.getTagNameList(), site, DEFAULT_TAXONOMY_TAG); } From a8d1f27b1aa04eed94502a9e970414deed6b9a18 Mon Sep 17 00:00:00 2001 From: Petros Paraskevopoulos Date: Tue, 5 Sep 2023 17:31:51 +0300 Subject: [PATCH 08/38] Analysis: Add missing n-a to on get categories for post store method FYI: 'n-a' stands for 'nullability annotations'. --- .../android/fluxc/persistence/TaxonomySqlUtils.java | 9 ++++++--- .../org/wordpress/android/fluxc/store/TaxonomyStore.java | 3 ++- 2 files changed, 8 insertions(+), 4 deletions(-) diff --git a/fluxc/src/main/java/org/wordpress/android/fluxc/persistence/TaxonomySqlUtils.java b/fluxc/src/main/java/org/wordpress/android/fluxc/persistence/TaxonomySqlUtils.java index e2bb8acd2e..50d8498e84 100644 --- a/fluxc/src/main/java/org/wordpress/android/fluxc/persistence/TaxonomySqlUtils.java +++ b/fluxc/src/main/java/org/wordpress/android/fluxc/persistence/TaxonomySqlUtils.java @@ -95,9 +95,12 @@ public static TermModel getTermByName(SiteModel site, String termName, String ta return null; } - public static List getTermsFromRemoteIdList(List remoteTermIds, SiteModel site, - String taxonomyName) { - if (taxonomyName == null || remoteTermIds == null || remoteTermIds.isEmpty()) { + @NonNull + public static List getTermsFromRemoteIdList( + @NonNull List remoteTermIds, + @NonNull SiteModel site, + @NonNull String taxonomyName) { + if (remoteTermIds.isEmpty()) { return Collections.emptyList(); } diff --git a/fluxc/src/main/java/org/wordpress/android/fluxc/store/TaxonomyStore.java b/fluxc/src/main/java/org/wordpress/android/fluxc/store/TaxonomyStore.java index 089b12a664..545bcca7b7 100644 --- a/fluxc/src/main/java/org/wordpress/android/fluxc/store/TaxonomyStore.java +++ b/fluxc/src/main/java/org/wordpress/android/fluxc/store/TaxonomyStore.java @@ -252,7 +252,8 @@ public TermModel getTermByName(SiteModel site, String termName, String taxonomyN /** * Returns all the categories for the given post as a {@link TermModel} list. */ - public List getCategoriesForPost(PostImmutableModel post, SiteModel site) { + @NonNull + public List getCategoriesForPost(@NonNull PostImmutableModel post, @NonNull SiteModel site) { return TaxonomySqlUtils.getTermsFromRemoteIdList(post.getCategoryIdList(), site, DEFAULT_TAXONOMY_CATEGORY); } From 8d75e7becd6d606716c85b78c2e81f85a5df6bad Mon Sep 17 00:00:00 2001 From: Petros Paraskevopoulos Date: Tue, 5 Sep 2023 17:37:27 +0300 Subject: [PATCH 09/38] Analysis: Add missing n-a to on get term by name store methods FYI: 'n-a' stands for 'nullability annotations'. --- .../android/fluxc/persistence/TaxonomySqlUtils.java | 11 ++++++----- .../wordpress/android/fluxc/store/TaxonomyStore.java | 9 ++++++--- 2 files changed, 12 insertions(+), 8 deletions(-) diff --git a/fluxc/src/main/java/org/wordpress/android/fluxc/persistence/TaxonomySqlUtils.java b/fluxc/src/main/java/org/wordpress/android/fluxc/persistence/TaxonomySqlUtils.java index 50d8498e84..21c66bdfb1 100644 --- a/fluxc/src/main/java/org/wordpress/android/fluxc/persistence/TaxonomySqlUtils.java +++ b/fluxc/src/main/java/org/wordpress/android/fluxc/persistence/TaxonomySqlUtils.java @@ -1,6 +1,7 @@ package org.wordpress.android.fluxc.persistence; import androidx.annotation.NonNull; +import androidx.annotation.Nullable; import com.wellsql.generated.TermModelTable; import com.yarolegovich.wellsql.WellSql; @@ -76,11 +77,11 @@ public static TermModel getTermByRemoteId(SiteModel site, long remoteTermId, Str return null; } - public static TermModel getTermByName(SiteModel site, String termName, String taxonomyName) { - if (site == null || taxonomyName == null) { - return null; - } - + @Nullable + public static TermModel getTermByName( + @NonNull SiteModel site, + @NonNull String termName, + @NonNull String taxonomyName) { List termResult = WellSql.select(TermModel.class) .where().beginGroup() .equals(TermModelTable.LOCAL_SITE_ID, site.getId()) diff --git a/fluxc/src/main/java/org/wordpress/android/fluxc/store/TaxonomyStore.java b/fluxc/src/main/java/org/wordpress/android/fluxc/store/TaxonomyStore.java index 545bcca7b7..da55d4448a 100644 --- a/fluxc/src/main/java/org/wordpress/android/fluxc/store/TaxonomyStore.java +++ b/fluxc/src/main/java/org/wordpress/android/fluxc/store/TaxonomyStore.java @@ -231,21 +231,24 @@ public TermModel getTermByRemoteId(SiteModel site, long remoteId, String taxonom /** * Returns a category as a {@link TermModel} given its name. */ - public TermModel getCategoryByName(SiteModel site, String categoryName) { + @Nullable + public TermModel getCategoryByName(@NonNull SiteModel site, @NonNull String categoryName) { return TaxonomySqlUtils.getTermByName(site, categoryName, DEFAULT_TAXONOMY_CATEGORY); } /** * Returns a tag as a {@link TermModel} given its name. */ - public TermModel getTagByName(SiteModel site, String tagName) { + @Nullable + public TermModel getTagByName(@NonNull SiteModel site, @NonNull String tagName) { return TaxonomySqlUtils.getTermByName(site, tagName, DEFAULT_TAXONOMY_TAG); } /** * Returns a term as a {@link TermModel} given its name. */ - public TermModel getTermByName(SiteModel site, String termName, String taxonomyName) { + @Nullable + public TermModel getTermByName(@NonNull SiteModel site, @NonNull String termName, @NonNull String taxonomyName) { return TaxonomySqlUtils.getTermByName(site, termName, taxonomyName); } From a075f398b15b11939c41cb7cbb24b3affb3d1c86 Mon Sep 17 00:00:00 2001 From: Petros Paraskevopoulos Date: Wed, 6 Sep 2023 13:29:04 +0300 Subject: [PATCH 10/38] Analysis: Add missing n-a to on get term by remote id store methods FYI: 'n-a' stands for 'nullability annotations'. --- .../android/fluxc/persistence/TaxonomySqlUtils.java | 10 +++++----- .../wordpress/android/fluxc/store/TaxonomyStore.java | 9 ++++++--- 2 files changed, 11 insertions(+), 8 deletions(-) diff --git a/fluxc/src/main/java/org/wordpress/android/fluxc/persistence/TaxonomySqlUtils.java b/fluxc/src/main/java/org/wordpress/android/fluxc/persistence/TaxonomySqlUtils.java index 21c66bdfb1..29ea27e189 100644 --- a/fluxc/src/main/java/org/wordpress/android/fluxc/persistence/TaxonomySqlUtils.java +++ b/fluxc/src/main/java/org/wordpress/android/fluxc/persistence/TaxonomySqlUtils.java @@ -58,11 +58,11 @@ public static List getTermsForSite(SiteModel site, String taxonomyNam .getAsModel(); } - public static TermModel getTermByRemoteId(SiteModel site, long remoteTermId, String taxonomyName) { - if (site == null || taxonomyName == null) { - return null; - } - + @Nullable + public static TermModel getTermByRemoteId( + @NonNull SiteModel site, + long remoteTermId, + @NonNull String taxonomyName) { List termResult = WellSql.select(TermModel.class) .where().beginGroup() .equals(TermModelTable.LOCAL_SITE_ID, site.getId()) diff --git a/fluxc/src/main/java/org/wordpress/android/fluxc/store/TaxonomyStore.java b/fluxc/src/main/java/org/wordpress/android/fluxc/store/TaxonomyStore.java index da55d4448a..e1be6640d5 100644 --- a/fluxc/src/main/java/org/wordpress/android/fluxc/store/TaxonomyStore.java +++ b/fluxc/src/main/java/org/wordpress/android/fluxc/store/TaxonomyStore.java @@ -210,21 +210,24 @@ public List getTermsForSite(SiteModel site, String taxonomyName) { /** * Returns a category as a {@link TermModel} given its remote id. */ - public TermModel getCategoryByRemoteId(SiteModel site, long remoteId) { + @Nullable + public TermModel getCategoryByRemoteId(@NonNull SiteModel site, long remoteId) { return TaxonomySqlUtils.getTermByRemoteId(site, remoteId, DEFAULT_TAXONOMY_CATEGORY); } /** * Returns a tag as a {@link TermModel} given its remote id. */ - public TermModel getTagByRemoteId(SiteModel site, long remoteId) { + @Nullable + public TermModel getTagByRemoteId(@NonNull SiteModel site, long remoteId) { return TaxonomySqlUtils.getTermByRemoteId(site, remoteId, DEFAULT_TAXONOMY_TAG); } /** * Returns a term as a {@link TermModel} given its remote id. */ - public TermModel getTermByRemoteId(SiteModel site, long remoteId, String taxonomyName) { + @Nullable + public TermModel getTermByRemoteId(@NonNull SiteModel site, long remoteId, @NonNull String taxonomyName) { return TaxonomySqlUtils.getTermByRemoteId(site, remoteId, taxonomyName); } From 05a852f9ac341c40905ed51fe28a4c8b64ee8429 Mon Sep 17 00:00:00 2001 From: Petros Paraskevopoulos Date: Wed, 6 Sep 2023 13:40:45 +0300 Subject: [PATCH 11/38] Analysis: Add missing n-a to on get terms for site store methods FYI: 'n-a' stands for 'nullability annotations'. --- .../android/fluxc/persistence/TaxonomySqlUtils.java | 9 ++++----- .../org/wordpress/android/fluxc/store/TaxonomyStore.java | 9 ++++++--- 2 files changed, 10 insertions(+), 8 deletions(-) diff --git a/fluxc/src/main/java/org/wordpress/android/fluxc/persistence/TaxonomySqlUtils.java b/fluxc/src/main/java/org/wordpress/android/fluxc/persistence/TaxonomySqlUtils.java index 29ea27e189..e988bb0f9b 100644 --- a/fluxc/src/main/java/org/wordpress/android/fluxc/persistence/TaxonomySqlUtils.java +++ b/fluxc/src/main/java/org/wordpress/android/fluxc/persistence/TaxonomySqlUtils.java @@ -45,11 +45,10 @@ public static TermModel insertTermForResult(TermModel term) { return term; } - public static List getTermsForSite(SiteModel site, String taxonomyName) { - if (site == null || taxonomyName == null) { - return Collections.emptyList(); - } - + @NonNull + public static List getTermsForSite( + @NonNull SiteModel site, + @NonNull String taxonomyName) { return WellSql.select(TermModel.class) .where().beginGroup() .equals(TermModelTable.LOCAL_SITE_ID, site.getId()) diff --git a/fluxc/src/main/java/org/wordpress/android/fluxc/store/TaxonomyStore.java b/fluxc/src/main/java/org/wordpress/android/fluxc/store/TaxonomyStore.java index e1be6640d5..a0ba3ca1a1 100644 --- a/fluxc/src/main/java/org/wordpress/android/fluxc/store/TaxonomyStore.java +++ b/fluxc/src/main/java/org/wordpress/android/fluxc/store/TaxonomyStore.java @@ -189,21 +189,24 @@ private TermModel instantiateTermModel(@NonNull SiteModel site, @NonNull String /** * Returns all categories for the given site as a {@link TermModel} list. */ - public List getCategoriesForSite(SiteModel site) { + @NonNull + public List getCategoriesForSite(@NonNull SiteModel site) { return TaxonomySqlUtils.getTermsForSite(site, DEFAULT_TAXONOMY_CATEGORY); } /** * Returns all tags for the given site as a {@link TermModel} list. */ - public List getTagsForSite(SiteModel site) { + @NonNull + public List getTagsForSite(@NonNull SiteModel site) { return TaxonomySqlUtils.getTermsForSite(site, DEFAULT_TAXONOMY_TAG); } /** * Returns all the terms of a taxonomy for the given site as a {@link TermModel} list. */ - public List getTermsForSite(SiteModel site, String taxonomyName) { + @NonNull + public List getTermsForSite(@NonNull SiteModel site, @NonNull String taxonomyName) { return TaxonomySqlUtils.getTermsForSite(site, taxonomyName); } From 7de74703d8af3929eb262c142604aecbcae36acf Mon Sep 17 00:00:00 2001 From: Petros Paraskevopoulos Date: Wed, 6 Sep 2023 13:43:26 +0300 Subject: [PATCH 12/38] Test: Add missing final keyword on taxonomy store unit test fields Warning: "Field 'mTaxonomyStore' may be 'final'" --- .../android/fluxc/taxonomy/TaxonomyStoreUnitTest.java | 7 +++++-- 1 file changed, 5 insertions(+), 2 deletions(-) diff --git a/example/src/test/java/org/wordpress/android/fluxc/taxonomy/TaxonomyStoreUnitTest.java b/example/src/test/java/org/wordpress/android/fluxc/taxonomy/TaxonomyStoreUnitTest.java index fde3cc6fdf..3914b89e8d 100644 --- a/example/src/test/java/org/wordpress/android/fluxc/taxonomy/TaxonomyStoreUnitTest.java +++ b/example/src/test/java/org/wordpress/android/fluxc/taxonomy/TaxonomyStoreUnitTest.java @@ -29,8 +29,11 @@ @RunWith(RobolectricTestRunner.class) public class TaxonomyStoreUnitTest { - private TaxonomyStore mTaxonomyStore = new TaxonomyStore(new Dispatcher(), Mockito.mock(TaxonomyRestClient.class), - Mockito.mock(TaxonomyXMLRPCClient.class)); + private final TaxonomyStore mTaxonomyStore = new TaxonomyStore( + new Dispatcher(), + Mockito.mock(TaxonomyRestClient.class), + Mockito.mock(TaxonomyXMLRPCClient.class) + ); @Before public void setUp() { From c66f686f9eb2ab33057b6c38cbbf3b9c7a27337b Mon Sep 17 00:00:00 2001 From: Petros Paraskevopoulos Date: Wed, 6 Sep 2023 13:48:08 +0300 Subject: [PATCH 13/38] Test: Resolve robolectric related application deprecation warning Warning: "'application' is deprecated" Explanation: Accessing this field directly is inherently incompatible with 'org.robolectric.annotation.experimental.LazyApplication' and Robolectric makes no guarantees if a test modifies this field during execution. Replacing 'application' with 'getApplication()' resolves this deprecation warning. --- .../wordpress/android/fluxc/taxonomy/TaxonomyStoreUnitTest.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/example/src/test/java/org/wordpress/android/fluxc/taxonomy/TaxonomyStoreUnitTest.java b/example/src/test/java/org/wordpress/android/fluxc/taxonomy/TaxonomyStoreUnitTest.java index 3914b89e8d..49412c2cc7 100644 --- a/example/src/test/java/org/wordpress/android/fluxc/taxonomy/TaxonomyStoreUnitTest.java +++ b/example/src/test/java/org/wordpress/android/fluxc/taxonomy/TaxonomyStoreUnitTest.java @@ -37,7 +37,7 @@ public class TaxonomyStoreUnitTest { @Before public void setUp() { - Context appContext = RuntimeEnvironment.application.getApplicationContext(); + Context appContext = RuntimeEnvironment.getApplication().getApplicationContext(); WellSqlConfig config = new SingleStoreWellSqlConfigForTests(appContext, TermModel.class); WellSql.init(config); From 25118ec7d1489fe088a6e05fc0c4ead02b97ba41 Mon Sep 17 00:00:00 2001 From: Petros Paraskevopoulos Date: Wed, 6 Sep 2023 13:58:30 +0300 Subject: [PATCH 14/38] Test: Create missing switch branches for on taxonomy changed Error: "'switch' statement on enum type 'org.wordpress.android.fluxc.action.TaxonomyAction' misses cases: 'FETCH_TERM', 'PUSH_TERM', 'DELETE_TERM', 'FETCHED_TERMS', 'FETCHED_TERM', 'PUSHED_TERM', 'DELETED_TERM' and 'REMOVE_ALL_TERMS'" --- .../fluxc/release/ReleaseStack_TaxonomyTestWPCom.java | 9 +++++++++ .../fluxc/release/ReleaseStack_TaxonomyTestXMLRPC.java | 9 +++++++++ 2 files changed, 18 insertions(+) diff --git a/example/src/androidTest/java/org/wordpress/android/fluxc/release/ReleaseStack_TaxonomyTestWPCom.java b/example/src/androidTest/java/org/wordpress/android/fluxc/release/ReleaseStack_TaxonomyTestWPCom.java index e6ed4138e5..22005f3183 100644 --- a/example/src/androidTest/java/org/wordpress/android/fluxc/release/ReleaseStack_TaxonomyTestWPCom.java +++ b/example/src/androidTest/java/org/wordpress/android/fluxc/release/ReleaseStack_TaxonomyTestWPCom.java @@ -296,6 +296,15 @@ public void onTaxonomyChanged(OnTaxonomyChanged event) { mCountDownLatch.countDown(); } break; + case FETCH_TERM: + case PUSH_TERM: + case DELETE_TERM: + case FETCHED_TERMS: + case FETCHED_TERM: + case PUSHED_TERM: + case DELETED_TERM: + case REMOVE_ALL_TERMS: + break; } } diff --git a/example/src/androidTest/java/org/wordpress/android/fluxc/release/ReleaseStack_TaxonomyTestXMLRPC.java b/example/src/androidTest/java/org/wordpress/android/fluxc/release/ReleaseStack_TaxonomyTestXMLRPC.java index bee6e3dc5a..91ac7283bb 100644 --- a/example/src/androidTest/java/org/wordpress/android/fluxc/release/ReleaseStack_TaxonomyTestXMLRPC.java +++ b/example/src/androidTest/java/org/wordpress/android/fluxc/release/ReleaseStack_TaxonomyTestXMLRPC.java @@ -315,6 +315,15 @@ public void onTaxonomyChanged(OnTaxonomyChanged event) { mCountDownLatch.countDown(); } break; + case FETCH_TERM: + case PUSH_TERM: + case DELETE_TERM: + case FETCHED_TERMS: + case FETCHED_TERM: + case PUSHED_TERM: + case DELETED_TERM: + case REMOVE_ALL_TERMS: + break; } } From 21e64249dde26846d54ea10e9631ed6fddf25c34 Mon Sep 17 00:00:00 2001 From: Petros Paraskevopoulos Date: Wed, 6 Sep 2023 13:59:56 +0300 Subject: [PATCH 15/38] Test: Suppress new class naming convention for connected test Warning: "Test class name 'ReleaseStack_TaxonomyTestWPCom' doesn't match regex '[A-Z][A-Za-z\d]*Test(s|Case)?|Test[A-Z][A-Za-z\d]*|IT(.*)|(.*) IT(Case)?'" --- .../android/fluxc/release/ReleaseStack_TaxonomyTestWPCom.java | 1 + .../android/fluxc/release/ReleaseStack_TaxonomyTestXMLRPC.java | 1 + 2 files changed, 2 insertions(+) diff --git a/example/src/androidTest/java/org/wordpress/android/fluxc/release/ReleaseStack_TaxonomyTestWPCom.java b/example/src/androidTest/java/org/wordpress/android/fluxc/release/ReleaseStack_TaxonomyTestWPCom.java index 22005f3183..9a031c06e7 100644 --- a/example/src/androidTest/java/org/wordpress/android/fluxc/release/ReleaseStack_TaxonomyTestWPCom.java +++ b/example/src/androidTest/java/org/wordpress/android/fluxc/release/ReleaseStack_TaxonomyTestWPCom.java @@ -31,6 +31,7 @@ import static org.junit.Assert.assertTrue; import static org.junit.Assert.fail; +@SuppressWarnings("NewClassNamingConvention") public class ReleaseStack_TaxonomyTestWPCom extends ReleaseStack_WPComBase { @Inject TaxonomyStore mTaxonomyStore; diff --git a/example/src/androidTest/java/org/wordpress/android/fluxc/release/ReleaseStack_TaxonomyTestXMLRPC.java b/example/src/androidTest/java/org/wordpress/android/fluxc/release/ReleaseStack_TaxonomyTestXMLRPC.java index 91ac7283bb..cd9fc21a54 100644 --- a/example/src/androidTest/java/org/wordpress/android/fluxc/release/ReleaseStack_TaxonomyTestXMLRPC.java +++ b/example/src/androidTest/java/org/wordpress/android/fluxc/release/ReleaseStack_TaxonomyTestXMLRPC.java @@ -32,6 +32,7 @@ import static org.junit.Assert.assertNotSame; import static org.junit.Assert.assertTrue; +@SuppressWarnings("NewClassNamingConvention") public class ReleaseStack_TaxonomyTestXMLRPC extends ReleaseStack_XMLRPCBase { @Inject TaxonomyStore mTaxonomyStore; From 646d2c64869f3dc147116e0a9cdfe05d71d3a659 Mon Sep 17 00:00:00 2001 From: Petros Paraskevopoulos Date: Wed, 6 Sep 2023 14:00:49 +0300 Subject: [PATCH 16/38] Test: Simplify assertion for check update existing term Warning: "'assertFalse()' can be simplified to 'assertNotEquals()'" --- .../android/fluxc/release/ReleaseStack_TaxonomyTestWPCom.java | 4 ++-- .../fluxc/release/ReleaseStack_TaxonomyTestXMLRPC.java | 4 ++-- 2 files changed, 4 insertions(+), 4 deletions(-) diff --git a/example/src/androidTest/java/org/wordpress/android/fluxc/release/ReleaseStack_TaxonomyTestWPCom.java b/example/src/androidTest/java/org/wordpress/android/fluxc/release/ReleaseStack_TaxonomyTestWPCom.java index 9a031c06e7..baa05b269f 100644 --- a/example/src/androidTest/java/org/wordpress/android/fluxc/release/ReleaseStack_TaxonomyTestWPCom.java +++ b/example/src/androidTest/java/org/wordpress/android/fluxc/release/ReleaseStack_TaxonomyTestWPCom.java @@ -26,7 +26,7 @@ import javax.inject.Inject; import static org.junit.Assert.assertEquals; -import static org.junit.Assert.assertFalse; +import static org.junit.Assert.assertNotEquals; import static org.junit.Assert.assertNotSame; import static org.junit.Assert.assertTrue; import static org.junit.Assert.fail; @@ -421,7 +421,7 @@ private void checkUpdateExistingTerm(TermModel term) throws InterruptedException assertNotSame(0, uploadedTerm.getRemoteTermId()); String newDescription = "newDescription"; - assertFalse(newDescription.equals(uploadedTerm.getDescription())); + assertNotEquals(newDescription, uploadedTerm.getDescription()); uploadedTerm.setDescription(newDescription); uploadTerm(uploadedTerm); diff --git a/example/src/androidTest/java/org/wordpress/android/fluxc/release/ReleaseStack_TaxonomyTestXMLRPC.java b/example/src/androidTest/java/org/wordpress/android/fluxc/release/ReleaseStack_TaxonomyTestXMLRPC.java index cd9fc21a54..c2dcd106ba 100644 --- a/example/src/androidTest/java/org/wordpress/android/fluxc/release/ReleaseStack_TaxonomyTestXMLRPC.java +++ b/example/src/androidTest/java/org/wordpress/android/fluxc/release/ReleaseStack_TaxonomyTestXMLRPC.java @@ -28,7 +28,7 @@ import javax.inject.Inject; import static org.junit.Assert.assertEquals; -import static org.junit.Assert.assertFalse; +import static org.junit.Assert.assertNotEquals; import static org.junit.Assert.assertNotSame; import static org.junit.Assert.assertTrue; @@ -416,7 +416,7 @@ private void testUpdateExistingTerm(TermModel term) throws InterruptedException assertNotSame(0, uploadedTerm.getRemoteTermId()); String newDescription = "newDescription"; - assertFalse(newDescription.equals(uploadedTerm.getDescription())); + assertNotEquals(newDescription, uploadedTerm.getDescription()); uploadedTerm.setDescription(newDescription); uploadTerm(uploadedTerm); From 9547923fbbd841eb9c692e48ecc75628c3f17197 Mon Sep 17 00:00:00 2001 From: Petros Paraskevopoulos Date: Wed, 6 Sep 2023 14:12:38 +0300 Subject: [PATCH 17/38] Analysis: Create missing switch cases for store actions Error: "'switch' statement on enum type 'org.wordpress.android.fluxc.action.TaxonomyAction' misses cases: 'UPDATE_TERM', and 'REMOVE_TERM'" --- .../java/org/wordpress/android/fluxc/store/TaxonomyStore.java | 3 +++ 1 file changed, 3 insertions(+) diff --git a/fluxc/src/main/java/org/wordpress/android/fluxc/store/TaxonomyStore.java b/fluxc/src/main/java/org/wordpress/android/fluxc/store/TaxonomyStore.java index a0ba3ca1a1..85d6fbffbe 100644 --- a/fluxc/src/main/java/org/wordpress/android/fluxc/store/TaxonomyStore.java +++ b/fluxc/src/main/java/org/wordpress/android/fluxc/store/TaxonomyStore.java @@ -316,6 +316,9 @@ public void onAction(Action action) { case REMOVE_ALL_TERMS: removeAllTerms(); break; + case UPDATE_TERM: + case REMOVE_TERM: + break; } } From 30e6133df2df1d5884400a1866700164f17e6469 Mon Sep 17 00:00:00 2001 From: Petros Paraskevopoulos Date: Wed, 6 Sep 2023 14:17:28 +0300 Subject: [PATCH 18/38] Analysis: Suppress unused warnings on get related store methods All, some or none of those suppressed on 'unused' get related taxonomy store methods, although seemingly unused, because they are 'public', client apps like JP/WPAndroid can actually be using those. Thus, they shouldn't be removed as 'unused'. Instead, and in order to avoid having them removed, this 'unused' warning is being suppressed instead. --- .../wordpress/android/fluxc/store/TaxonomyStore.java | 11 +++++++++++ 1 file changed, 11 insertions(+) diff --git a/fluxc/src/main/java/org/wordpress/android/fluxc/store/TaxonomyStore.java b/fluxc/src/main/java/org/wordpress/android/fluxc/store/TaxonomyStore.java index 85d6fbffbe..90e1311243 100644 --- a/fluxc/src/main/java/org/wordpress/android/fluxc/store/TaxonomyStore.java +++ b/fluxc/src/main/java/org/wordpress/android/fluxc/store/TaxonomyStore.java @@ -190,6 +190,7 @@ private TermModel instantiateTermModel(@NonNull SiteModel site, @NonNull String * Returns all categories for the given site as a {@link TermModel} list. */ @NonNull + @SuppressWarnings("unused") public List getCategoriesForSite(@NonNull SiteModel site) { return TaxonomySqlUtils.getTermsForSite(site, DEFAULT_TAXONOMY_CATEGORY); } @@ -198,6 +199,7 @@ public List getCategoriesForSite(@NonNull SiteModel site) { * Returns all tags for the given site as a {@link TermModel} list. */ @NonNull + @SuppressWarnings("unused") public List getTagsForSite(@NonNull SiteModel site) { return TaxonomySqlUtils.getTermsForSite(site, DEFAULT_TAXONOMY_TAG); } @@ -206,6 +208,7 @@ public List getTagsForSite(@NonNull SiteModel site) { * Returns all the terms of a taxonomy for the given site as a {@link TermModel} list. */ @NonNull + @SuppressWarnings("unused") public List getTermsForSite(@NonNull SiteModel site, @NonNull String taxonomyName) { return TaxonomySqlUtils.getTermsForSite(site, taxonomyName); } @@ -214,6 +217,7 @@ public List getTermsForSite(@NonNull SiteModel site, @NonNull String * Returns a category as a {@link TermModel} given its remote id. */ @Nullable + @SuppressWarnings("unused") public TermModel getCategoryByRemoteId(@NonNull SiteModel site, long remoteId) { return TaxonomySqlUtils.getTermByRemoteId(site, remoteId, DEFAULT_TAXONOMY_CATEGORY); } @@ -222,6 +226,7 @@ public TermModel getCategoryByRemoteId(@NonNull SiteModel site, long remoteId) { * Returns a tag as a {@link TermModel} given its remote id. */ @Nullable + @SuppressWarnings("unused") public TermModel getTagByRemoteId(@NonNull SiteModel site, long remoteId) { return TaxonomySqlUtils.getTermByRemoteId(site, remoteId, DEFAULT_TAXONOMY_TAG); } @@ -230,6 +235,7 @@ public TermModel getTagByRemoteId(@NonNull SiteModel site, long remoteId) { * Returns a term as a {@link TermModel} given its remote id. */ @Nullable + @SuppressWarnings("unused") public TermModel getTermByRemoteId(@NonNull SiteModel site, long remoteId, @NonNull String taxonomyName) { return TaxonomySqlUtils.getTermByRemoteId(site, remoteId, taxonomyName); } @@ -238,6 +244,7 @@ public TermModel getTermByRemoteId(@NonNull SiteModel site, long remoteId, @NonN * Returns a category as a {@link TermModel} given its name. */ @Nullable + @SuppressWarnings("unused") public TermModel getCategoryByName(@NonNull SiteModel site, @NonNull String categoryName) { return TaxonomySqlUtils.getTermByName(site, categoryName, DEFAULT_TAXONOMY_CATEGORY); } @@ -246,6 +253,7 @@ public TermModel getCategoryByName(@NonNull SiteModel site, @NonNull String cate * Returns a tag as a {@link TermModel} given its name. */ @Nullable + @SuppressWarnings("unused") public TermModel getTagByName(@NonNull SiteModel site, @NonNull String tagName) { return TaxonomySqlUtils.getTermByName(site, tagName, DEFAULT_TAXONOMY_TAG); } @@ -254,6 +262,7 @@ public TermModel getTagByName(@NonNull SiteModel site, @NonNull String tagName) * Returns a term as a {@link TermModel} given its name. */ @Nullable + @SuppressWarnings("unused") public TermModel getTermByName(@NonNull SiteModel site, @NonNull String termName, @NonNull String taxonomyName) { return TaxonomySqlUtils.getTermByName(site, termName, taxonomyName); } @@ -262,6 +271,7 @@ public TermModel getTermByName(@NonNull SiteModel site, @NonNull String termName * Returns all the categories for the given post as a {@link TermModel} list. */ @NonNull + @SuppressWarnings("unused") public List getCategoriesForPost(@NonNull PostImmutableModel post, @NonNull SiteModel site) { return TaxonomySqlUtils.getTermsFromRemoteIdList(post.getCategoryIdList(), site, DEFAULT_TAXONOMY_CATEGORY); } @@ -270,6 +280,7 @@ public List getCategoriesForPost(@NonNull PostImmutableModel post, @N * Returns all the tags for the given post as a {@link TermModel} list. */ @NonNull + @SuppressWarnings("unused") public List getTagsForPost(@NonNull PostImmutableModel post, @NonNull SiteModel site) { return TaxonomySqlUtils.getTermsFromRemoteNameList(post.getTagNameList(), site, DEFAULT_TAXONOMY_TAG); } From ab818371f9c21b12d0a31d413cbf1bc14699906a Mon Sep 17 00:00:00 2001 From: Petros Paraskevopoulos Date: Wed, 6 Sep 2023 14:20:01 +0300 Subject: [PATCH 19/38] Analysis: Suppress raw types warnings for store action method Warning: "Raw use of parameterized class 'Action'" --- .../java/org/wordpress/android/fluxc/store/TaxonomyStore.java | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/fluxc/src/main/java/org/wordpress/android/fluxc/store/TaxonomyStore.java b/fluxc/src/main/java/org/wordpress/android/fluxc/store/TaxonomyStore.java index 90e1311243..dd42facbab 100644 --- a/fluxc/src/main/java/org/wordpress/android/fluxc/store/TaxonomyStore.java +++ b/fluxc/src/main/java/org/wordpress/android/fluxc/store/TaxonomyStore.java @@ -285,8 +285,9 @@ public List getTagsForPost(@NonNull PostImmutableModel post, @NonNull return TaxonomySqlUtils.getTermsFromRemoteNameList(post.getTagNameList(), site, DEFAULT_TAXONOMY_TAG); } - @Subscribe(threadMode = ThreadMode.ASYNC) @Override + @Subscribe(threadMode = ThreadMode.ASYNC) + @SuppressWarnings("rawtypes") public void onAction(Action action) { IAction actionType = action.getType(); if (!(actionType instanceof TaxonomyAction)) { From 4db457aeb9703f4c30413024b471c5002dee105d Mon Sep 17 00:00:00 2001 From: Petros Paraskevopoulos Date: Wed, 6 Sep 2023 14:23:11 +0300 Subject: [PATCH 20/38] Analysis: Use inserted term on instantiate term model store method Warning: "Variable is already assigned to this value" --- .../org/wordpress/android/fluxc/store/TaxonomyStore.java | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/fluxc/src/main/java/org/wordpress/android/fluxc/store/TaxonomyStore.java b/fluxc/src/main/java/org/wordpress/android/fluxc/store/TaxonomyStore.java index dd42facbab..7f3bdf0f8d 100644 --- a/fluxc/src/main/java/org/wordpress/android/fluxc/store/TaxonomyStore.java +++ b/fluxc/src/main/java/org/wordpress/android/fluxc/store/TaxonomyStore.java @@ -177,13 +177,13 @@ private TermModel instantiateTermModel(@NonNull SiteModel site, @NonNull String newTerm.setTaxonomy(taxonomyName); // Insert the term into the db, updating the object to include the local ID - newTerm = TaxonomySqlUtils.insertTermForResult(newTerm); + TermModel insertedTerm = TaxonomySqlUtils.insertTermForResult(newTerm); // id is set to -1 if insertion fails - if (newTerm.getId() == -1) { + if (insertedTerm.getId() == -1) { return null; } - return newTerm; + return insertedTerm; } /** From 7d823c93b689c0e54467310c6cbf4ffa7e92d4fd Mon Sep 17 00:00:00 2001 From: Petros Paraskevopoulos Date: Wed, 6 Sep 2023 15:17:33 +0300 Subject: [PATCH 21/38] Analysis: Add missing n-a to remove term sql utils methods FYI: 'n-a' stands for 'nullability annotations'. --- .../android/fluxc/persistence/TaxonomySqlUtils.java | 6 +----- 1 file changed, 1 insertion(+), 5 deletions(-) diff --git a/fluxc/src/main/java/org/wordpress/android/fluxc/persistence/TaxonomySqlUtils.java b/fluxc/src/main/java/org/wordpress/android/fluxc/persistence/TaxonomySqlUtils.java index e988bb0f9b..8e1af92e0a 100644 --- a/fluxc/src/main/java/org/wordpress/android/fluxc/persistence/TaxonomySqlUtils.java +++ b/fluxc/src/main/java/org/wordpress/android/fluxc/persistence/TaxonomySqlUtils.java @@ -144,11 +144,7 @@ public static int clearTaxonomyForSite(SiteModel site, String taxonomyName) { .execute(); } - public static int removeTerm(TermModel term) { - if (term == null) { - return 0; - } - + public static int removeTerm(@NonNull TermModel term) { return WellSql.delete(TermModel.class) .where().beginGroup() .equals(TermModelTable.TAXONOMY, term.getTaxonomy()) From 74fe47a0df3914aefb31dacd0c1169c854e0b5a0 Mon Sep 17 00:00:00 2001 From: Petros Paraskevopoulos Date: Wed, 6 Sep 2023 15:18:42 +0300 Subject: [PATCH 22/38] Analysis: Add missing n-a to insert term for result sql utils methods FYI: 'n-a' stands for 'nullability annotations'. --- .../wordpress/android/fluxc/persistence/TaxonomySqlUtils.java | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/fluxc/src/main/java/org/wordpress/android/fluxc/persistence/TaxonomySqlUtils.java b/fluxc/src/main/java/org/wordpress/android/fluxc/persistence/TaxonomySqlUtils.java index 8e1af92e0a..a91b214dce 100644 --- a/fluxc/src/main/java/org/wordpress/android/fluxc/persistence/TaxonomySqlUtils.java +++ b/fluxc/src/main/java/org/wordpress/android/fluxc/persistence/TaxonomySqlUtils.java @@ -39,9 +39,9 @@ public static int insertOrUpdateTerm(TermModel term) { } } - public static TermModel insertTermForResult(TermModel term) { + @NonNull + public static TermModel insertTermForResult(@NonNull TermModel term) { WellSql.insert(term).asSingleTransaction(true).execute(); - return term; } From 42dba85ed39567b0aab9ff6c2747790b4c2ec784 Mon Sep 17 00:00:00 2001 From: Petros Paraskevopoulos Date: Wed, 6 Sep 2023 15:23:17 +0300 Subject: [PATCH 23/38] Analysis: Add missing n-a to insert or update term sql utils methods FYI: 'n-a' stands for 'nullability annotations'. PS: As part of this change, the no longer valid 'testInsertNullTerm' test, which tests for a nullable term being inserted, is being removed. --- .../android/fluxc/taxonomy/TaxonomyStoreUnitTest.java | 7 ------- .../android/fluxc/persistence/TaxonomySqlUtils.java | 6 +----- 2 files changed, 1 insertion(+), 12 deletions(-) diff --git a/example/src/test/java/org/wordpress/android/fluxc/taxonomy/TaxonomyStoreUnitTest.java b/example/src/test/java/org/wordpress/android/fluxc/taxonomy/TaxonomyStoreUnitTest.java index 49412c2cc7..55ca3eb67f 100644 --- a/example/src/test/java/org/wordpress/android/fluxc/taxonomy/TaxonomyStoreUnitTest.java +++ b/example/src/test/java/org/wordpress/android/fluxc/taxonomy/TaxonomyStoreUnitTest.java @@ -44,13 +44,6 @@ public void setUp() { config.reset(); } - @Test - public void testInsertNullTerm() { - assertEquals(0, TaxonomySqlUtils.insertOrUpdateTerm(null)); - - assertEquals(0, TaxonomyTestUtils.getTermsCount()); - } - @Test public void testSimpleInsertionAndRetrieval() { TermModel termModel = new TermModel(); diff --git a/fluxc/src/main/java/org/wordpress/android/fluxc/persistence/TaxonomySqlUtils.java b/fluxc/src/main/java/org/wordpress/android/fluxc/persistence/TaxonomySqlUtils.java index a91b214dce..667c33776d 100644 --- a/fluxc/src/main/java/org/wordpress/android/fluxc/persistence/TaxonomySqlUtils.java +++ b/fluxc/src/main/java/org/wordpress/android/fluxc/persistence/TaxonomySqlUtils.java @@ -13,11 +13,7 @@ import java.util.List; public class TaxonomySqlUtils { - public static int insertOrUpdateTerm(TermModel term) { - if (term == null) { - return 0; - } - + public static int insertOrUpdateTerm(@NonNull TermModel term) { List termResult = WellSql.select(TermModel.class) .where().beginGroup() .equals(TermModelTable.ID, term.getId()) From 1d5b073f60a6ec54d885eb3337590da42a9db51e Mon Sep 17 00:00:00 2001 From: Petros Paraskevopoulos Date: Wed, 6 Sep 2023 15:30:11 +0300 Subject: [PATCH 24/38] Test: Assert for deleted term models on taxonomy store test Warning: "Return value of the method is never used" FYI: Not adding this extra assertion is causing the above warning for the 'TaxonomySqlUtils.clearTaxonomyForSite(...)' method. --- .../android/fluxc/taxonomy/TaxonomyStoreUnitTest.java | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/example/src/test/java/org/wordpress/android/fluxc/taxonomy/TaxonomyStoreUnitTest.java b/example/src/test/java/org/wordpress/android/fluxc/taxonomy/TaxonomyStoreUnitTest.java index 55ca3eb67f..a2e9d6ea30 100644 --- a/example/src/test/java/org/wordpress/android/fluxc/taxonomy/TaxonomyStoreUnitTest.java +++ b/example/src/test/java/org/wordpress/android/fluxc/taxonomy/TaxonomyStoreUnitTest.java @@ -178,7 +178,8 @@ public void testClearTaxonomy() { assertEquals(4, TaxonomyTestUtils.getTermsCount()); assertEquals(2, mTaxonomyStore.getCategoriesForSite(site).size()); - TaxonomySqlUtils.clearTaxonomyForSite(site, DEFAULT_TAXONOMY_CATEGORY); + int deletedTermModels = TaxonomySqlUtils.clearTaxonomyForSite(site, DEFAULT_TAXONOMY_CATEGORY); + assertEquals(2, deletedTermModels); assertEquals(0, mTaxonomyStore.getCategoriesForSite(site).size()); assertEquals(2, TaxonomyTestUtils.getTermsCount()); From 8ff128ca2657b131890335e3206d845985ca3784 Mon Sep 17 00:00:00 2001 From: Petros Paraskevopoulos Date: Wed, 6 Sep 2023 15:37:29 +0300 Subject: [PATCH 25/38] Analysis: Add missing n-a to clear taxonomy for site sql utils methods FYI: 'n-a' stands for 'nullability annotations'. --- .../android/fluxc/persistence/TaxonomySqlUtils.java | 8 +++----- 1 file changed, 3 insertions(+), 5 deletions(-) diff --git a/fluxc/src/main/java/org/wordpress/android/fluxc/persistence/TaxonomySqlUtils.java b/fluxc/src/main/java/org/wordpress/android/fluxc/persistence/TaxonomySqlUtils.java index 667c33776d..8f4544496f 100644 --- a/fluxc/src/main/java/org/wordpress/android/fluxc/persistence/TaxonomySqlUtils.java +++ b/fluxc/src/main/java/org/wordpress/android/fluxc/persistence/TaxonomySqlUtils.java @@ -127,11 +127,9 @@ public static List getTermsFromRemoteNameList( .getAsModel(); } - public static int clearTaxonomyForSite(SiteModel site, String taxonomyName) { - if (site == null || taxonomyName == null) { - return 0; - } - + public static int clearTaxonomyForSite( + @NonNull SiteModel site, + @NonNull String taxonomyName) { return WellSql.delete(TermModel.class) .where().beginGroup() .equals(TermModelTable.LOCAL_SITE_ID, site.getId()) From 2fd3d9d23513bc490c9a465a91a6956b1b8ffc35 Mon Sep 17 00:00:00 2001 From: Petros Paraskevopoulos Date: Wed, 6 Sep 2023 15:59:29 +0300 Subject: [PATCH 26/38] Analysis: Add missing n-a to handle fetch single term completed method FYI: 'n-a' stands for 'nullability annotations'. --- .../java/org/wordpress/android/fluxc/store/TaxonomyStore.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/fluxc/src/main/java/org/wordpress/android/fluxc/store/TaxonomyStore.java b/fluxc/src/main/java/org/wordpress/android/fluxc/store/TaxonomyStore.java index 7f3bdf0f8d..091ceff054 100644 --- a/fluxc/src/main/java/org/wordpress/android/fluxc/store/TaxonomyStore.java +++ b/fluxc/src/main/java/org/wordpress/android/fluxc/store/TaxonomyStore.java @@ -392,7 +392,7 @@ private void handleFetchTermsCompleted(@NonNull FetchTermsResponsePayload payloa emitChange(onTaxonomyChanged); } - private void handleFetchSingleTermCompleted(FetchTermResponsePayload payload) { + private void handleFetchSingleTermCompleted(@NonNull FetchTermResponsePayload payload) { if (payload.origin == TaxonomyAction.PUSH_TERM) { OnTermUploaded onTermUploaded = new OnTermUploaded(payload.term); if (payload.isError()) { From 0849403403b7fa8376fd7fb3c02e7b4edf570b80 Mon Sep 17 00:00:00 2001 From: Petros Paraskevopoulos Date: Wed, 6 Sep 2023 16:01:39 +0300 Subject: [PATCH 27/38] Analysis: Add missing n-a to handle delete/push term completed methods FYI: 'n-a' stands for 'nullability annotations'. --- .../java/org/wordpress/android/fluxc/store/TaxonomyStore.java | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/fluxc/src/main/java/org/wordpress/android/fluxc/store/TaxonomyStore.java b/fluxc/src/main/java/org/wordpress/android/fluxc/store/TaxonomyStore.java index 091ceff054..fa1571797a 100644 --- a/fluxc/src/main/java/org/wordpress/android/fluxc/store/TaxonomyStore.java +++ b/fluxc/src/main/java/org/wordpress/android/fluxc/store/TaxonomyStore.java @@ -414,7 +414,7 @@ private void handleFetchSingleTermCompleted(@NonNull FetchTermResponsePayload pa } } - private void handleDeleteTermCompleted(RemoteTermPayload payload) { + private void handleDeleteTermCompleted(@NonNull RemoteTermPayload payload) { if (payload.isError()) { OnTaxonomyChanged event = new OnTaxonomyChanged(0, payload.term.getTaxonomy()); event.error = payload.error; @@ -425,7 +425,7 @@ private void handleDeleteTermCompleted(RemoteTermPayload payload) { } } - private void handlePushTermCompleted(RemoteTermPayload payload) { + private void handlePushTermCompleted(@NonNull RemoteTermPayload payload) { if (payload.isError()) { OnTermUploaded onTermUploaded = new OnTermUploaded(payload.term); onTermUploaded.error = payload.error; From 42e8bec03b695e24a7760f7f69f13860c8f2a90c Mon Sep 17 00:00:00 2001 From: Petros Paraskevopoulos Date: Wed, 6 Sep 2023 17:10:23 +0300 Subject: [PATCH 28/38] Analysis: Add missing n-a to on taxonomy changed FYI: 'n-a' stands for 'nullability annotations'. This change makes the 'causeOfChange' field on 'OnTaxonomyChanged' non-null, which in its turn caused few updates in terms of how 'OnTaxonomyChanged' is being constructed. Otherwise, this 'causeOfChange' field couldn't have been non-null, but having that as nullable is not justified as it can be easily become and used as non-null. --- .../ReleaseStack_TaxonomyTestWPCom.java | 2 +- .../ReleaseStack_TaxonomyTestXMLRPC.java | 2 +- .../fluxc/example/TaxonomiesFragment.java | 2 +- .../android/fluxc/store/TaxonomyStore.java | 77 +++++++++++++------ 4 files changed, 55 insertions(+), 28 deletions(-) diff --git a/example/src/androidTest/java/org/wordpress/android/fluxc/release/ReleaseStack_TaxonomyTestWPCom.java b/example/src/androidTest/java/org/wordpress/android/fluxc/release/ReleaseStack_TaxonomyTestWPCom.java index baa05b269f..10213d830e 100644 --- a/example/src/androidTest/java/org/wordpress/android/fluxc/release/ReleaseStack_TaxonomyTestWPCom.java +++ b/example/src/androidTest/java/org/wordpress/android/fluxc/release/ReleaseStack_TaxonomyTestWPCom.java @@ -247,7 +247,7 @@ public void testUploadNewCategoryDuplicate() throws InterruptedException { @SuppressWarnings("unused") @Subscribe - public void onTaxonomyChanged(OnTaxonomyChanged event) { + public void onTaxonomyChanged(@NonNull OnTaxonomyChanged event) { AppLog.i(T.API, "Received OnTaxonomyChanged, causeOfChange: " + event.causeOfChange); if (event.isError()) { AppLog.i(T.API, "OnTaxonomyChanged has error: " + event.error.type + " - " + event.error.message); diff --git a/example/src/androidTest/java/org/wordpress/android/fluxc/release/ReleaseStack_TaxonomyTestXMLRPC.java b/example/src/androidTest/java/org/wordpress/android/fluxc/release/ReleaseStack_TaxonomyTestXMLRPC.java index c2dcd106ba..11900e63e7 100644 --- a/example/src/androidTest/java/org/wordpress/android/fluxc/release/ReleaseStack_TaxonomyTestXMLRPC.java +++ b/example/src/androidTest/java/org/wordpress/android/fluxc/release/ReleaseStack_TaxonomyTestXMLRPC.java @@ -265,7 +265,7 @@ public void testDeleteTag() throws InterruptedException { @SuppressWarnings("unused") @Subscribe - public void onTaxonomyChanged(OnTaxonomyChanged event) { + public void onTaxonomyChanged(@NonNull OnTaxonomyChanged event) { AppLog.i(T.API, "Received OnTaxonomyChanged, causeOfChange: " + event.causeOfChange); if (event.isError()) { AppLog.i(T.API, "OnTaxonomyChanged has error: " + event.error.type + " - " + event.error.message); diff --git a/example/src/main/java/org/wordpress/android/fluxc/example/TaxonomiesFragment.java b/example/src/main/java/org/wordpress/android/fluxc/example/TaxonomiesFragment.java index 7dbbcd0983..fe829c84ba 100644 --- a/example/src/main/java/org/wordpress/android/fluxc/example/TaxonomiesFragment.java +++ b/example/src/main/java/org/wordpress/android/fluxc/example/TaxonomiesFragment.java @@ -107,7 +107,7 @@ private void createCategory() { @SuppressWarnings("unused") @Subscribe(threadMode = ThreadMode.MAIN) - public void onTaxonomyChanged(OnTaxonomyChanged event) { + public void onTaxonomyChanged(@NonNull OnTaxonomyChanged event) { AppLog.i(T.API, "OnTaxonomyChanged: rowsAffected=" + event.rowsAffected); if (event.isError()) { String error = "Error: " + event.error.type + " - " + event.error.message; diff --git a/fluxc/src/main/java/org/wordpress/android/fluxc/store/TaxonomyStore.java b/fluxc/src/main/java/org/wordpress/android/fluxc/store/TaxonomyStore.java index fa1571797a..8acf6061b1 100644 --- a/fluxc/src/main/java/org/wordpress/android/fluxc/store/TaxonomyStore.java +++ b/fluxc/src/main/java/org/wordpress/android/fluxc/store/TaxonomyStore.java @@ -81,16 +81,40 @@ public FetchTermResponsePayload(@NonNull TermModel term, @NonNull SiteModel site // OnChanged events public static class OnTaxonomyChanged extends OnChanged { public int rowsAffected; - public String taxonomyName; - public TaxonomyAction causeOfChange; + @Nullable public String taxonomyName; + @NonNull public TaxonomyAction causeOfChange; + + public OnTaxonomyChanged( + int rowsAffected, + @NonNull String taxonomyName, + @NonNull TaxonomyAction causeOfChange + ) { + this.rowsAffected = rowsAffected; + this.taxonomyName = taxonomyName; + this.causeOfChange = causeOfChange; + } - public OnTaxonomyChanged(int rowsAffected, String taxonomyName) { + public OnTaxonomyChanged(int rowsAffected, @NonNull String taxonomyName) { this.rowsAffected = rowsAffected; this.taxonomyName = taxonomyName; + this.causeOfChange = taxonomyActionFromName(taxonomyName); } - public OnTaxonomyChanged(int rowsAffected) { + public OnTaxonomyChanged(int rowsAffected, @NonNull TaxonomyAction causeOfChange) { this.rowsAffected = rowsAffected; + this.causeOfChange = causeOfChange; + } + + @NonNull + private TaxonomyAction taxonomyActionFromName(@NonNull String taxonomy) { + switch (taxonomy) { + case DEFAULT_TAXONOMY_CATEGORY: + return TaxonomyAction.FETCH_CATEGORIES; + case DEFAULT_TAXONOMY_TAG: + return TaxonomyAction.FETCH_TAGS; + default: + return TaxonomyAction.FETCH_TERMS; + } } } @@ -378,17 +402,6 @@ private void handleFetchTermsCompleted(@NonNull FetchTermsResponsePayload payloa onTaxonomyChanged = new OnTaxonomyChanged(rowsAffected, payload.taxonomy); } - switch (payload.taxonomy) { - case DEFAULT_TAXONOMY_CATEGORY: - onTaxonomyChanged.causeOfChange = TaxonomyAction.FETCH_CATEGORIES; - break; - case DEFAULT_TAXONOMY_TAG: - onTaxonomyChanged.causeOfChange = TaxonomyAction.FETCH_TAGS; - break; - default: - onTaxonomyChanged.causeOfChange = TaxonomyAction.FETCH_TERMS; - } - emitChange(onTaxonomyChanged); } @@ -405,9 +418,12 @@ private void handleFetchSingleTermCompleted(@NonNull FetchTermResponsePayload pa } if (payload.isError()) { - OnTaxonomyChanged event = new OnTaxonomyChanged(0, payload.term.getTaxonomy()); + OnTaxonomyChanged event = new OnTaxonomyChanged( + 0, + payload.term.getTaxonomy(), + TaxonomyAction.UPDATE_TERM + ); event.error = payload.error; - event.causeOfChange = TaxonomyAction.UPDATE_TERM; emitChange(event); } else { updateTerm(payload.term); @@ -416,9 +432,12 @@ private void handleFetchSingleTermCompleted(@NonNull FetchTermResponsePayload pa private void handleDeleteTermCompleted(@NonNull RemoteTermPayload payload) { if (payload.isError()) { - OnTaxonomyChanged event = new OnTaxonomyChanged(0, payload.term.getTaxonomy()); + OnTaxonomyChanged event = new OnTaxonomyChanged( + 0, + payload.term.getTaxonomy(), + TaxonomyAction.DELETE_TERM + ); event.error = payload.error; - event.causeOfChange = TaxonomyAction.DELETE_TERM; emitChange(event); } else { removeTerm(payload.term); @@ -465,24 +484,32 @@ private void deleteTerm(@NonNull RemoteTermPayload payload) { private void updateTerm(@NonNull TermModel term) { int rowsAffected = TaxonomySqlUtils.insertOrUpdateTerm(term); - OnTaxonomyChanged onTaxonomyChanged = new OnTaxonomyChanged(rowsAffected, term.getTaxonomy()); - onTaxonomyChanged.causeOfChange = TaxonomyAction.UPDATE_TERM; + OnTaxonomyChanged onTaxonomyChanged = new OnTaxonomyChanged( + rowsAffected, + term.getTaxonomy(), + TaxonomyAction.UPDATE_TERM + ); emitChange(onTaxonomyChanged); } private void removeTerm(@NonNull TermModel term) { int rowsAffected = TaxonomySqlUtils.removeTerm(term); - OnTaxonomyChanged onTaxonomyChanged = new OnTaxonomyChanged(rowsAffected, term.getTaxonomy()); - onTaxonomyChanged.causeOfChange = TaxonomyAction.REMOVE_TERM; + OnTaxonomyChanged onTaxonomyChanged = new OnTaxonomyChanged( + rowsAffected, + term.getTaxonomy(), + TaxonomyAction.REMOVE_TERM + ); emitChange(onTaxonomyChanged); } private void removeAllTerms() { int rowsAffected = TaxonomySqlUtils.deleteAllTerms(); - OnTaxonomyChanged onTaxonomyChanged = new OnTaxonomyChanged(rowsAffected); - onTaxonomyChanged.causeOfChange = TaxonomyAction.REMOVE_ALL_TERMS; + OnTaxonomyChanged onTaxonomyChanged = new OnTaxonomyChanged( + rowsAffected, + TaxonomyAction.REMOVE_ALL_TERMS + ); emitChange(onTaxonomyChanged); } } From 7b53e452883d4617b7cf784b13eaf78d1878b2fa Mon Sep 17 00:00:00 2001 From: Petros Paraskevopoulos Date: Wed, 6 Sep 2023 17:42:50 +0300 Subject: [PATCH 29/38] Refactor: Remove unnecessary taxonomy name field from taxonomy changed This 'taxonomyName' was only used within the 'example' app, just for logging purposes. As such, production wise it seems to not be holding any real value. This is especially true since JP/WPAndroid is not using this field anywhere. Thus, it is safe to remove this field and not having to deal with a nullable 'taxonomyName' field for no particular good reason, and thus making 'OnTaxonomyChanged' much more straightforward as a class. --- .../release/ReleaseStack_TaxonomyTestWPCom.java | 2 +- .../release/ReleaseStack_TaxonomyTestXMLRPC.java | 2 +- .../fluxc/example/TaxonomiesFragment.java | 16 +++++++++++++--- .../android/fluxc/store/TaxonomyStore.java | 16 ---------------- 4 files changed, 15 insertions(+), 21 deletions(-) diff --git a/example/src/androidTest/java/org/wordpress/android/fluxc/release/ReleaseStack_TaxonomyTestWPCom.java b/example/src/androidTest/java/org/wordpress/android/fluxc/release/ReleaseStack_TaxonomyTestWPCom.java index 10213d830e..e85dee81c0 100644 --- a/example/src/androidTest/java/org/wordpress/android/fluxc/release/ReleaseStack_TaxonomyTestWPCom.java +++ b/example/src/androidTest/java/org/wordpress/android/fluxc/release/ReleaseStack_TaxonomyTestWPCom.java @@ -281,7 +281,7 @@ public void onTaxonomyChanged(@NonNull OnTaxonomyChanged event) { break; case FETCH_TERMS: if (mNextEvent.equals(TestEvents.TERMS_FETCHED)) { - AppLog.i(T.API, "Fetched " + event.rowsAffected + " " + event.taxonomyName + " terms"); + AppLog.i(T.API, "Fetched " + event.rowsAffected + " terms"); mCountDownLatch.countDown(); } break; diff --git a/example/src/androidTest/java/org/wordpress/android/fluxc/release/ReleaseStack_TaxonomyTestXMLRPC.java b/example/src/androidTest/java/org/wordpress/android/fluxc/release/ReleaseStack_TaxonomyTestXMLRPC.java index 11900e63e7..c671c4ae22 100644 --- a/example/src/androidTest/java/org/wordpress/android/fluxc/release/ReleaseStack_TaxonomyTestXMLRPC.java +++ b/example/src/androidTest/java/org/wordpress/android/fluxc/release/ReleaseStack_TaxonomyTestXMLRPC.java @@ -300,7 +300,7 @@ public void onTaxonomyChanged(@NonNull OnTaxonomyChanged event) { break; case FETCH_TERMS: if (mNextEvent.equals(TestEvents.TERMS_FETCHED)) { - AppLog.i(T.API, "Fetched " + event.rowsAffected + " " + event.taxonomyName + " terms"); + AppLog.i(T.API, "Fetched " + event.rowsAffected + " terms"); mCountDownLatch.countDown(); } break; diff --git a/example/src/main/java/org/wordpress/android/fluxc/example/TaxonomiesFragment.java b/example/src/main/java/org/wordpress/android/fluxc/example/TaxonomiesFragment.java index fe829c84ba..ae2f11e995 100644 --- a/example/src/main/java/org/wordpress/android/fluxc/example/TaxonomiesFragment.java +++ b/example/src/main/java/org/wordpress/android/fluxc/example/TaxonomiesFragment.java @@ -13,6 +13,7 @@ import org.greenrobot.eventbus.Subscribe; import org.greenrobot.eventbus.ThreadMode; import org.wordpress.android.fluxc.Dispatcher; +import org.wordpress.android.fluxc.action.TaxonomyAction; import org.wordpress.android.fluxc.generated.TaxonomyActionBuilder; import org.wordpress.android.fluxc.model.SiteModel; import org.wordpress.android.fluxc.model.TermModel; @@ -114,9 +115,18 @@ public void onTaxonomyChanged(@NonNull OnTaxonomyChanged event) { prependToLog(error); AppLog.i(T.TESTS, error); } else { - List terms = mTaxonomyStore.getTermsForSite(getFirstSite(), event.taxonomyName); - for (TermModel term : terms) { - prependToLog(event.taxonomyName + " " + term.getRemoteTermId() + ": " + term.getName()); + if (event.causeOfChange == TaxonomyAction.FETCH_CATEGORIES) { + List terms = mTaxonomyStore.getCategoriesForSite(getFirstSite()); + for (TermModel term : terms) { + prependToLog("category" + " " + term.getRemoteTermId() + ": " + term.getName()); + } + } else if (event.causeOfChange == TaxonomyAction.FETCH_TAGS) { + List terms = mTaxonomyStore.getTagsForSite(getFirstSite()); + for (TermModel term : terms) { + prependToLog("tag" + " " + term.getRemoteTermId() + ": " + term.getName()); + } + } else { + prependToLog(event.causeOfChange + " " + event.rowsAffected); } } } diff --git a/fluxc/src/main/java/org/wordpress/android/fluxc/store/TaxonomyStore.java b/fluxc/src/main/java/org/wordpress/android/fluxc/store/TaxonomyStore.java index 8acf6061b1..0f1fe83dd3 100644 --- a/fluxc/src/main/java/org/wordpress/android/fluxc/store/TaxonomyStore.java +++ b/fluxc/src/main/java/org/wordpress/android/fluxc/store/TaxonomyStore.java @@ -81,22 +81,10 @@ public FetchTermResponsePayload(@NonNull TermModel term, @NonNull SiteModel site // OnChanged events public static class OnTaxonomyChanged extends OnChanged { public int rowsAffected; - @Nullable public String taxonomyName; @NonNull public TaxonomyAction causeOfChange; - public OnTaxonomyChanged( - int rowsAffected, - @NonNull String taxonomyName, - @NonNull TaxonomyAction causeOfChange - ) { - this.rowsAffected = rowsAffected; - this.taxonomyName = taxonomyName; - this.causeOfChange = causeOfChange; - } - public OnTaxonomyChanged(int rowsAffected, @NonNull String taxonomyName) { this.rowsAffected = rowsAffected; - this.taxonomyName = taxonomyName; this.causeOfChange = taxonomyActionFromName(taxonomyName); } @@ -420,7 +408,6 @@ private void handleFetchSingleTermCompleted(@NonNull FetchTermResponsePayload pa if (payload.isError()) { OnTaxonomyChanged event = new OnTaxonomyChanged( 0, - payload.term.getTaxonomy(), TaxonomyAction.UPDATE_TERM ); event.error = payload.error; @@ -434,7 +421,6 @@ private void handleDeleteTermCompleted(@NonNull RemoteTermPayload payload) { if (payload.isError()) { OnTaxonomyChanged event = new OnTaxonomyChanged( 0, - payload.term.getTaxonomy(), TaxonomyAction.DELETE_TERM ); event.error = payload.error; @@ -486,7 +472,6 @@ private void updateTerm(@NonNull TermModel term) { OnTaxonomyChanged onTaxonomyChanged = new OnTaxonomyChanged( rowsAffected, - term.getTaxonomy(), TaxonomyAction.UPDATE_TERM ); emitChange(onTaxonomyChanged); @@ -497,7 +482,6 @@ private void removeTerm(@NonNull TermModel term) { OnTaxonomyChanged onTaxonomyChanged = new OnTaxonomyChanged( rowsAffected, - term.getTaxonomy(), TaxonomyAction.REMOVE_TERM ); emitChange(onTaxonomyChanged); From 860235652787723bfaa603261d806ff3ee19065c Mon Sep 17 00:00:00 2001 From: Petros Paraskevopoulos Date: Wed, 6 Sep 2023 17:50:02 +0300 Subject: [PATCH 30/38] Test: Remove unnecessary interrupted exception from private test methods Warning: "Exception 'java.lang.InterruptedException' is never thrown in the method " --- .../fluxc/release/ReleaseStack_TaxonomyTestXMLRPC.java | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/example/src/androidTest/java/org/wordpress/android/fluxc/release/ReleaseStack_TaxonomyTestXMLRPC.java b/example/src/androidTest/java/org/wordpress/android/fluxc/release/ReleaseStack_TaxonomyTestXMLRPC.java index c671c4ae22..68aace3c13 100644 --- a/example/src/androidTest/java/org/wordpress/android/fluxc/release/ReleaseStack_TaxonomyTestXMLRPC.java +++ b/example/src/androidTest/java/org/wordpress/android/fluxc/release/ReleaseStack_TaxonomyTestXMLRPC.java @@ -365,7 +365,7 @@ private void setupTermAttributes(TermModel term) { term.setDescription(TERM_DEFAULT_DESCRIPTION); } - private TermModel createNewCategory() throws InterruptedException { + private TermModel createNewCategory() { TermModel term = mTaxonomyStore.instantiateCategory(sSite); assertEquals(0, term.getRemoteTermId()); @@ -375,7 +375,7 @@ private TermModel createNewCategory() throws InterruptedException { return term; } - private TermModel createNewTag() throws InterruptedException { + private TermModel createNewTag() { TermModel term = mTaxonomyStore.instantiateTag(sSite); assertEquals(0, term.getRemoteTermId()); @@ -385,7 +385,7 @@ private TermModel createNewTag() throws InterruptedException { return term; } - private TermModel createNewTerm(TaxonomyModel taxonomy) throws InterruptedException { + private TermModel createNewTerm(TaxonomyModel taxonomy) { TermModel term = mTaxonomyStore.instantiateTerm(sSite, taxonomy); assertEquals(0, term.getRemoteTermId()); From 30f1880a7b026bafeb9eefc44b6a5ef246f08a4b Mon Sep 17 00:00:00 2001 From: Petros Paraskevopoulos Date: Wed, 6 Sep 2023 17:51:58 +0300 Subject: [PATCH 31/38] Test: Guard usages of instantiate term model methods --- .../ReleaseStack_TaxonomyTestXMLRPC.java | 31 +++++++++++++------ 1 file changed, 22 insertions(+), 9 deletions(-) diff --git a/example/src/androidTest/java/org/wordpress/android/fluxc/release/ReleaseStack_TaxonomyTestXMLRPC.java b/example/src/androidTest/java/org/wordpress/android/fluxc/release/ReleaseStack_TaxonomyTestXMLRPC.java index 68aace3c13..073130c221 100644 --- a/example/src/androidTest/java/org/wordpress/android/fluxc/release/ReleaseStack_TaxonomyTestXMLRPC.java +++ b/example/src/androidTest/java/org/wordpress/android/fluxc/release/ReleaseStack_TaxonomyTestXMLRPC.java @@ -31,6 +31,7 @@ import static org.junit.Assert.assertNotEquals; import static org.junit.Assert.assertNotSame; import static org.junit.Assert.assertTrue; +import static org.junit.Assert.fail; @SuppressWarnings("NewClassNamingConvention") public class ReleaseStack_TaxonomyTestXMLRPC extends ReleaseStack_XMLRPCBase { @@ -368,9 +369,13 @@ private void setupTermAttributes(TermModel term) { private TermModel createNewCategory() { TermModel term = mTaxonomyStore.instantiateCategory(sSite); - assertEquals(0, term.getRemoteTermId()); - assertNotSame(0, term.getId()); - assertNotSame(0, term.getLocalSiteId()); + if (term != null) { + assertEquals(0, term.getRemoteTermId()); + assertNotSame(0, term.getId()); + assertNotSame(0, term.getLocalSiteId()); + } else { + fail("Failed to instantiate new category!"); + } return term; } @@ -378,9 +383,13 @@ private TermModel createNewCategory() { private TermModel createNewTag() { TermModel term = mTaxonomyStore.instantiateTag(sSite); - assertEquals(0, term.getRemoteTermId()); - assertNotSame(0, term.getId()); - assertNotSame(0, term.getLocalSiteId()); + if (term != null) { + assertEquals(0, term.getRemoteTermId()); + assertNotSame(0, term.getId()); + assertNotSame(0, term.getLocalSiteId()); + } else { + fail("Failed to instantiate new tag!"); + } return term; } @@ -388,9 +397,13 @@ private TermModel createNewTag() { private TermModel createNewTerm(TaxonomyModel taxonomy) { TermModel term = mTaxonomyStore.instantiateTerm(sSite, taxonomy); - assertEquals(0, term.getRemoteTermId()); - assertNotSame(0, term.getId()); - assertNotSame(0, term.getLocalSiteId()); + if (term != null) { + assertEquals(0, term.getRemoteTermId()); + assertNotSame(0, term.getId()); + assertNotSame(0, term.getLocalSiteId()); + } else { + fail("Failed to instantiate new term!"); + } return term; } From 52cf542e688eb6fbd7e9a172048578f466afc748 Mon Sep 17 00:00:00 2001 From: Petros Paraskevopoulos Date: Wed, 6 Sep 2023 18:09:55 +0300 Subject: [PATCH 32/38] Analysis: Add missing n-a to taxonomy error FYI: 'n-a' stands for 'nullability annotations'. --- .../android/fluxc/store/TaxonomyStore.java | 19 +++++++++---------- 1 file changed, 9 insertions(+), 10 deletions(-) diff --git a/fluxc/src/main/java/org/wordpress/android/fluxc/store/TaxonomyStore.java b/fluxc/src/main/java/org/wordpress/android/fluxc/store/TaxonomyStore.java index 0f1fe83dd3..10c085b75c 100644 --- a/fluxc/src/main/java/org/wordpress/android/fluxc/store/TaxonomyStore.java +++ b/fluxc/src/main/java/org/wordpress/android/fluxc/store/TaxonomyStore.java @@ -115,10 +115,10 @@ public OnTermUploaded(@NonNull TermModel term) { } public static class TaxonomyError implements OnChangedError { - public TaxonomyErrorType type; - public String message; + @NonNull public TaxonomyErrorType type; + @NonNull public String message; - public TaxonomyError(TaxonomyErrorType type, @NonNull String message) { + public TaxonomyError(@NonNull TaxonomyErrorType type, @NonNull String message) { this.type = type; this.message = message; } @@ -128,7 +128,7 @@ public TaxonomyError(@NonNull String type, @NonNull String message) { this.message = message; } - public TaxonomyError(TaxonomyErrorType type) { + public TaxonomyError(@NonNull TaxonomyErrorType type) { this(type, ""); } } @@ -140,12 +140,11 @@ public enum TaxonomyErrorType { INVALID_RESPONSE, GENERIC_ERROR; - public static TaxonomyErrorType fromString(String string) { - if (string != null) { - for (TaxonomyErrorType v : TaxonomyErrorType.values()) { - if (string.equalsIgnoreCase(v.name())) { - return v; - } + @NonNull + public static TaxonomyErrorType fromString(@NonNull String string) { + for (TaxonomyErrorType v : TaxonomyErrorType.values()) { + if (string.equalsIgnoreCase(v.name())) { + return v; } } return GENERIC_ERROR; From b34ed2fdfc2b055c5ba22edc53e8b529e3510714 Mon Sep 17 00:00:00 2001 From: Petros Paraskevopoulos Date: Thu, 7 Sep 2023 14:28:13 +0300 Subject: [PATCH 33/38] Analysis: Add missing n-a to term model FYI: 'n-a' stands for 'nullability annotations'. 1) A 'TermModel' is currently used either for a 'category' or a 'tag'. 2) When a new 'category' is initialized, it always has a 'mTaxonomy', which is actually a 'category', and also a 'mName', the category name which is given by the user. However, it doesn't have a 'mSlug' or a 'mDescription'. The 'mSlug' gets added to 'TermModel' with the API response. A 'category' has no description, thus 'mDescription' is either 'null' or being transformed to an empty string ("") with the API response. 3) When a new 'tag' is initialized, it always has a 'mTaxonomy', which is actually a 'tag', and also a 'nName', the tag name, which is given by the user. In contrast to a 'category' type 'TermModel', a 'tag' does have a 'mSlug' and can have a 'mDescription' too. The 'mSlug' gets added during creation via 'mTerm.setSlug(sanitizeWithDashes(thisName))' and as such getting its 'mSlug' from its 'mName'. The 'mDescription' is either and empty string (""), if the user chooses to omit this step, or any other string description, which is given by the user. PS: This 'NotNullFieldNotInitialized' warning got suppressed because a table related 'model' class can never have its fields initialized via a constructor initialization, or otherwise for that matter. --- .../android/fluxc/model/TermModel.java | 26 ++++++++++++------- .../wpcom/taxonomy/TaxonomyRestClient.java | 2 +- 2 files changed, 18 insertions(+), 10 deletions(-) diff --git a/fluxc/src/main/java/org/wordpress/android/fluxc/model/TermModel.java b/fluxc/src/main/java/org/wordpress/android/fluxc/model/TermModel.java index 0c0f3c2282..d40c9d7b7a 100644 --- a/fluxc/src/main/java/org/wordpress/android/fluxc/model/TermModel.java +++ b/fluxc/src/main/java/org/wordpress/android/fluxc/model/TermModel.java @@ -1,5 +1,8 @@ package org.wordpress.android.fluxc.model; +import androidx.annotation.NonNull; +import androidx.annotation.Nullable; + import com.yarolegovich.wellsql.core.Identifiable; import com.yarolegovich.wellsql.core.annotation.Column; import com.yarolegovich.wellsql.core.annotation.PrimaryKey; @@ -12,6 +15,7 @@ import java.io.Serializable; @Table +@SuppressWarnings("NotNullFieldNotInitialized") public class TermModel extends Payload implements Identifiable, Serializable { private static final long serialVersionUID = -1484257248446576276L; @@ -19,10 +23,10 @@ public class TermModel extends Payload implements Identifiable @Column private int mId; @Column private int mLocalSiteId; @Column private long mRemoteTermId; - @Column private String mTaxonomy; - @Column private String mName; - @Column private String mSlug; - @Column private String mDescription; + @NonNull @Column private String mTaxonomy; + @NonNull @Column private String mName; + @Nullable @Column private String mSlug; + @Nullable @Column private String mDescription; @Column private long mParentRemoteId; @Column private int mPostCount; @@ -52,35 +56,39 @@ public void setRemoteTermId(long remoteTermId) { mRemoteTermId = remoteTermId; } + @NonNull public String getTaxonomy() { return mTaxonomy; } - public void setTaxonomy(String taxonomy) { + public void setTaxonomy(@NonNull String taxonomy) { mTaxonomy = taxonomy; } + @NonNull public String getName() { return mName; } - public void setName(String name) { + public void setName(@NonNull String name) { mName = name; } + @Nullable public String getSlug() { return mSlug; } - public void setSlug(String slug) { + public void setSlug(@Nullable String slug) { mSlug = slug; } + @Nullable public String getDescription() { return mDescription; } - public void setDescription(String description) { + public void setDescription(@Nullable String description) { mDescription = description; } @@ -101,7 +109,7 @@ public void setPostCount(int count) { } @Override - public boolean equals(Object other) { + public boolean equals(@Nullable Object other) { if (this == other) return true; if (other == null || !(other instanceof TermModel)) return false; diff --git a/fluxc/src/main/java/org/wordpress/android/fluxc/network/rest/wpcom/taxonomy/TaxonomyRestClient.java b/fluxc/src/main/java/org/wordpress/android/fluxc/network/rest/wpcom/taxonomy/TaxonomyRestClient.java index 9f1143596f..b1e74164b0 100644 --- a/fluxc/src/main/java/org/wordpress/android/fluxc/network/rest/wpcom/taxonomy/TaxonomyRestClient.java +++ b/fluxc/src/main/java/org/wordpress/android/fluxc/network/rest/wpcom/taxonomy/TaxonomyRestClient.java @@ -174,7 +174,7 @@ private TermModel termResponseToTermModel(@NonNull TermWPComRestResponse from) { private Map termModelToParams(@NonNull TermModel term) { Map body = new HashMap<>(); - body.put("name", StringUtils.notNullStr(term.getName())); + body.put("name", term.getName()); body.put("description", StringUtils.notNullStr(term.getDescription())); body.put("parent", String.valueOf(term.getParentRemoteId())); From 2f9ad78264d3a5d5a76c5925550fb735f54dc2a5 Mon Sep 17 00:00:00 2001 From: Petros Paraskevopoulos Date: Thu, 7 Sep 2023 14:28:40 +0300 Subject: [PATCH 34/38] Analysis: Suppress condition covered by further condition warning Warning: "Condition 'other == null' covered by subsequent condition '!(other instanceof TaxonomyModel)'" FYI: One could resolve this warning, simply by removing the unnecessary 'other == null' condition, but this would change the 'equals(...)' logic and possible introduce some kind of a regression, most liked performance wise. Thus, it is better to ignore this atm, just by suppressing it, and call this out of scope. --- .../main/java/org/wordpress/android/fluxc/model/TermModel.java | 1 + 1 file changed, 1 insertion(+) diff --git a/fluxc/src/main/java/org/wordpress/android/fluxc/model/TermModel.java b/fluxc/src/main/java/org/wordpress/android/fluxc/model/TermModel.java index d40c9d7b7a..d4ced64de4 100644 --- a/fluxc/src/main/java/org/wordpress/android/fluxc/model/TermModel.java +++ b/fluxc/src/main/java/org/wordpress/android/fluxc/model/TermModel.java @@ -109,6 +109,7 @@ public void setPostCount(int count) { } @Override + @SuppressWarnings("ConditionCoveredByFurtherCondition") public boolean equals(@Nullable Object other) { if (this == other) return true; if (other == null || !(other instanceof TermModel)) return false; From f902b5e121a493a53b3912e6335f80f598edbbf7 Mon Sep 17 00:00:00 2001 From: Petros Paraskevopoulos Date: Thu, 7 Sep 2023 15:23:08 +0300 Subject: [PATCH 35/38] Analysis: Add missing n-a to terms model FYI: 'n-a' stands for 'nullability annotations'. --- .../java/org/wordpress/android/fluxc/model/TermsModel.java | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/fluxc/src/main/java/org/wordpress/android/fluxc/model/TermsModel.java b/fluxc/src/main/java/org/wordpress/android/fluxc/model/TermsModel.java index 88fdeec939..1f62a50d68 100644 --- a/fluxc/src/main/java/org/wordpress/android/fluxc/model/TermsModel.java +++ b/fluxc/src/main/java/org/wordpress/android/fluxc/model/TermsModel.java @@ -9,7 +9,7 @@ import java.util.List; public class TermsModel extends Payload { - private List mTerms; + @NonNull private List mTerms; public TermsModel() { mTerms = new ArrayList<>(); @@ -19,11 +19,12 @@ public TermsModel(@NonNull List terms) { mTerms = terms; } + @NonNull public List getTerms() { return mTerms; } - public void setTerms(List terms) { + public void setTerms(@NonNull List terms) { this.mTerms = terms; } } From 0d408d3b5efef22e38315505c4d1288dcc5c5dc3 Mon Sep 17 00:00:00 2001 From: Petros Paraskevopoulos Date: Thu, 7 Sep 2023 16:01:06 +0300 Subject: [PATCH 36/38] Refactor: Remove test only taxonomy store methods None of the 'instantiateTermModel(...)' related 'TaxonomyStore' methods are being in production and are only being used either (unnecessarily) on the demo 'example' app or on a couple of connected tests. Thus, it is better to remove those and not have them exposed and available for clients like JP/WPAndroid to exploit. PS: This change was done to assist with a future refactor and in order to avoid extra testing. --- .../ReleaseStack_TaxonomyTestWPCom.java | 32 +++++++++++++++++-- .../ReleaseStack_TaxonomyTestXMLRPC.java | 32 +++++++++++++++++-- .../fluxc/example/TaxonomiesFragment.java | 17 ++++------ .../fluxc/persistence/TaxonomySqlUtils.java | 6 ---- .../android/fluxc/store/TaxonomyStore.java | 31 ------------------ 5 files changed, 65 insertions(+), 53 deletions(-) diff --git a/example/src/androidTest/java/org/wordpress/android/fluxc/release/ReleaseStack_TaxonomyTestWPCom.java b/example/src/androidTest/java/org/wordpress/android/fluxc/release/ReleaseStack_TaxonomyTestWPCom.java index e85dee81c0..fb247ae296 100644 --- a/example/src/androidTest/java/org/wordpress/android/fluxc/release/ReleaseStack_TaxonomyTestWPCom.java +++ b/example/src/androidTest/java/org/wordpress/android/fluxc/release/ReleaseStack_TaxonomyTestWPCom.java @@ -1,12 +1,16 @@ package org.wordpress.android.fluxc.release; import androidx.annotation.NonNull; +import androidx.annotation.Nullable; + +import com.yarolegovich.wellsql.WellSql; import org.greenrobot.eventbus.Subscribe; import org.junit.Test; import org.wordpress.android.fluxc.TestUtils; import org.wordpress.android.fluxc.example.utils.RandomStringUtils; import org.wordpress.android.fluxc.generated.TaxonomyActionBuilder; +import org.wordpress.android.fluxc.model.SiteModel; import org.wordpress.android.fluxc.model.TaxonomyModel; import org.wordpress.android.fluxc.model.TermModel; import org.wordpress.android.fluxc.store.TaxonomyStore; @@ -347,7 +351,7 @@ private void setupTermAttributes(@NonNull TermModel term) { @NonNull private TermModel createNewCategory() { - TermModel term = mTaxonomyStore.instantiateCategory(sSite); + TermModel term = instantiateTermModel(sSite, TaxonomyStore.DEFAULT_TAXONOMY_CATEGORY); if (term != null) { assertEquals(0, term.getRemoteTermId()); @@ -362,7 +366,7 @@ private TermModel createNewCategory() { @NonNull private TermModel createNewTag() { - TermModel term = mTaxonomyStore.instantiateTag(sSite); + TermModel term = instantiateTermModel(sSite, TaxonomyStore.DEFAULT_TAXONOMY_TAG); if (term != null) { assertEquals(0, term.getRemoteTermId()); @@ -377,7 +381,7 @@ private TermModel createNewTag() { @NonNull private TermModel createNewTerm(@NonNull TaxonomyModel taxonomy) { - TermModel term = mTaxonomyStore.instantiateTerm(sSite, taxonomy); + TermModel term = instantiateTermModel(sSite, taxonomy.getName()); if (term != null) { assertEquals(0, term.getRemoteTermId()); @@ -430,4 +434,26 @@ private void checkUpdateExistingTerm(TermModel term) throws InterruptedException assertEquals(updatedTerm.getRemoteTermId(), uploadedTerm.getRemoteTermId()); assertEquals(updatedTerm.getDescription(), newDescription); } + + @Nullable + private TermModel instantiateTermModel(@NonNull SiteModel site, @NonNull String taxonomyName) { + TermModel newTerm = new TermModel(); + newTerm.setLocalSiteId(site.getId()); + newTerm.setTaxonomy(taxonomyName); + + // Insert the term into the db, updating the object to include the local ID + TermModel insertedTerm = insertTermForResult(newTerm); + + // id is set to -1 if insertion fails + if (insertedTerm.getId() == -1) { + return null; + } + return insertedTerm; + } + + @NonNull + public static TermModel insertTermForResult(@NonNull TermModel term) { + WellSql.insert(term).asSingleTransaction(true).execute(); + return term; + } } diff --git a/example/src/androidTest/java/org/wordpress/android/fluxc/release/ReleaseStack_TaxonomyTestXMLRPC.java b/example/src/androidTest/java/org/wordpress/android/fluxc/release/ReleaseStack_TaxonomyTestXMLRPC.java index 073130c221..ddf3b4b73f 100644 --- a/example/src/androidTest/java/org/wordpress/android/fluxc/release/ReleaseStack_TaxonomyTestXMLRPC.java +++ b/example/src/androidTest/java/org/wordpress/android/fluxc/release/ReleaseStack_TaxonomyTestXMLRPC.java @@ -1,6 +1,9 @@ package org.wordpress.android.fluxc.release; import androidx.annotation.NonNull; +import androidx.annotation.Nullable; + +import com.yarolegovich.wellsql.WellSql; import org.greenrobot.eventbus.Subscribe; import org.junit.Ignore; @@ -8,6 +11,7 @@ import org.wordpress.android.fluxc.TestUtils; import org.wordpress.android.fluxc.example.utils.RandomStringUtils; import org.wordpress.android.fluxc.generated.TaxonomyActionBuilder; +import org.wordpress.android.fluxc.model.SiteModel; import org.wordpress.android.fluxc.model.TaxonomyModel; import org.wordpress.android.fluxc.model.TermModel; import org.wordpress.android.fluxc.store.TaxonomyStore; @@ -367,7 +371,7 @@ private void setupTermAttributes(TermModel term) { } private TermModel createNewCategory() { - TermModel term = mTaxonomyStore.instantiateCategory(sSite); + TermModel term = instantiateTermModel(sSite, TaxonomyStore.DEFAULT_TAXONOMY_CATEGORY); if (term != null) { assertEquals(0, term.getRemoteTermId()); @@ -381,7 +385,7 @@ private TermModel createNewCategory() { } private TermModel createNewTag() { - TermModel term = mTaxonomyStore.instantiateTag(sSite); + TermModel term = instantiateTermModel(sSite, TaxonomyStore.DEFAULT_TAXONOMY_TAG); if (term != null) { assertEquals(0, term.getRemoteTermId()); @@ -395,7 +399,7 @@ private TermModel createNewTag() { } private TermModel createNewTerm(TaxonomyModel taxonomy) { - TermModel term = mTaxonomyStore.instantiateTerm(sSite, taxonomy); + TermModel term = instantiateTermModel(sSite, taxonomy.getName()); if (term != null) { assertEquals(0, term.getRemoteTermId()); @@ -448,4 +452,26 @@ private void deleteTerm(TermModel term) throws InterruptedException { assertTrue(mCountDownLatch.await(TestUtils.DEFAULT_TIMEOUT_MS, TimeUnit.MILLISECONDS)); } + + @Nullable + private TermModel instantiateTermModel(@NonNull SiteModel site, @NonNull String taxonomyName) { + TermModel newTerm = new TermModel(); + newTerm.setLocalSiteId(site.getId()); + newTerm.setTaxonomy(taxonomyName); + + // Insert the term into the db, updating the object to include the local ID + TermModel insertedTerm = insertTermForResult(newTerm); + + // id is set to -1 if insertion fails + if (insertedTerm.getId() == -1) { + return null; + } + return insertedTerm; + } + + @NonNull + public static TermModel insertTermForResult(@NonNull TermModel term) { + WellSql.insert(term).asSingleTransaction(true).execute(); + return term; + } } diff --git a/example/src/main/java/org/wordpress/android/fluxc/example/TaxonomiesFragment.java b/example/src/main/java/org/wordpress/android/fluxc/example/TaxonomiesFragment.java index ae2f11e995..8d4122f2a4 100644 --- a/example/src/main/java/org/wordpress/android/fluxc/example/TaxonomiesFragment.java +++ b/example/src/main/java/org/wordpress/android/fluxc/example/TaxonomiesFragment.java @@ -94,16 +94,13 @@ private void fetchTagsFirstSite() { } private void createCategory() { - TermModel newCategory = mTaxonomyStore.instantiateCategory(getFirstSite()); - if (newCategory != null) { - newCategory.setName("FluxC-category-" + new Random().nextLong()); - newCategory.setDescription("From FluxC example app"); - - RemoteTermPayload payload = new RemoteTermPayload(newCategory, getFirstSite()); - mDispatcher.dispatch(TaxonomyActionBuilder.newPushTermAction(payload)); - } else { - prependToLog("Error: no category found!"); - } + TermModel newCategory = new TermModel(); + newCategory.setLocalSiteId(getFirstSite().getId()); + newCategory.setTaxonomy(TaxonomyStore.DEFAULT_TAXONOMY_CATEGORY); + newCategory.setName("FluxC-category-" + new Random().nextLong()); + newCategory.setDescription("From FluxC example app"); + RemoteTermPayload payload = new RemoteTermPayload(newCategory, getFirstSite()); + mDispatcher.dispatch(TaxonomyActionBuilder.newPushTermAction(payload)); } @SuppressWarnings("unused") diff --git a/fluxc/src/main/java/org/wordpress/android/fluxc/persistence/TaxonomySqlUtils.java b/fluxc/src/main/java/org/wordpress/android/fluxc/persistence/TaxonomySqlUtils.java index 8f4544496f..0bf45f5f07 100644 --- a/fluxc/src/main/java/org/wordpress/android/fluxc/persistence/TaxonomySqlUtils.java +++ b/fluxc/src/main/java/org/wordpress/android/fluxc/persistence/TaxonomySqlUtils.java @@ -35,12 +35,6 @@ public static int insertOrUpdateTerm(@NonNull TermModel term) { } } - @NonNull - public static TermModel insertTermForResult(@NonNull TermModel term) { - WellSql.insert(term).asSingleTransaction(true).execute(); - return term; - } - @NonNull public static List getTermsForSite( @NonNull SiteModel site, diff --git a/fluxc/src/main/java/org/wordpress/android/fluxc/store/TaxonomyStore.java b/fluxc/src/main/java/org/wordpress/android/fluxc/store/TaxonomyStore.java index 10c085b75c..a59a03ed53 100644 --- a/fluxc/src/main/java/org/wordpress/android/fluxc/store/TaxonomyStore.java +++ b/fluxc/src/main/java/org/wordpress/android/fluxc/store/TaxonomyStore.java @@ -166,37 +166,6 @@ public void onRegister() { AppLog.d(AppLog.T.API, "TaxonomyStore onRegister"); } - @Nullable - public TermModel instantiateCategory(@NonNull SiteModel site) { - return instantiateTermModel(site, DEFAULT_TAXONOMY_CATEGORY); - } - - @Nullable - public TermModel instantiateTag(@NonNull SiteModel site) { - return instantiateTermModel(site, DEFAULT_TAXONOMY_TAG); - } - - @Nullable - public TermModel instantiateTerm(@NonNull SiteModel site, @NonNull TaxonomyModel taxonomy) { - return instantiateTermModel(site, taxonomy.getName()); - } - - @Nullable - private TermModel instantiateTermModel(@NonNull SiteModel site, @NonNull String taxonomyName) { - TermModel newTerm = new TermModel(); - newTerm.setLocalSiteId(site.getId()); - newTerm.setTaxonomy(taxonomyName); - - // Insert the term into the db, updating the object to include the local ID - TermModel insertedTerm = TaxonomySqlUtils.insertTermForResult(newTerm); - - // id is set to -1 if insertion fails - if (insertedTerm.getId() == -1) { - return null; - } - return insertedTerm; - } - /** * Returns all categories for the given site as a {@link TermModel} list. */ From fdbcdc03b43b978fc1afc96058a9e77f69b2b6be Mon Sep 17 00:00:00 2001 From: Petros Paraskevopoulos Date: Thu, 7 Sep 2023 17:39:01 +0300 Subject: [PATCH 37/38] Analysis: Add default and non-default constructors for taxonomy model This is done so that clients of that model, clients like JP/WPAndroid, when trying to manually instantiating such a model, they will always use the non-default constructor, and always provide a 'name' argument. The empty default constructor was added because '@Table' related models need to have one such constructor. Otherwise, its 'Mapper' related auto-generated class would fail to compile, in this case the 'TaxonomyModelMapper.java' class. Also, a full-arguments constructor was added, which should be the preferred and goto constructor for most cases. FYI: The trick I used to first '@Deprecated' this constructor is to help clients avoid using this constructor in the future, that is, when they manually construct one. Suppressing the 'DeprecatedIsStillUsed' warning was necessary because otherwise, even if every occurrence in the codebase is being switched to the non-default constructor, the auto-generated 'Mapper' related class will anyway use that default constructor, thus this warning will persist no matter what. PS.1: Note that on the 1-argument constructor an extra Javadoc is added to help clients understand when and why to use it. For all other cases, using the full-arguments constructor should be the preferred and goto constructor. PS.2: Note that although this 'TaxonomyModel' model class is a '@Table' related model, there is no associated 'CREATE TABLE TaxonomyModel (...)' WellSQL table related initialization happening within the 'WellSqlConfig.kt' class and more specifically during 'onUpgrade(...)'. This means that this '@Table' annotation on this 'TaxonomyModel' model class could be removed. Actually, since this model class is only used for testing purposes, it can be completely removed. --- .../ReleaseStack_TaxonomyTestWPCom.java | 9 ++-- .../ReleaseStack_TaxonomyTestXMLRPC.java | 9 ++-- .../android/fluxc/model/TaxonomyModel.java | 43 ++++++++++++++++++- 3 files changed, 48 insertions(+), 13 deletions(-) diff --git a/example/src/androidTest/java/org/wordpress/android/fluxc/release/ReleaseStack_TaxonomyTestWPCom.java b/example/src/androidTest/java/org/wordpress/android/fluxc/release/ReleaseStack_TaxonomyTestWPCom.java index fb247ae296..cceecd1507 100644 --- a/example/src/androidTest/java/org/wordpress/android/fluxc/release/ReleaseStack_TaxonomyTestWPCom.java +++ b/example/src/androidTest/java/org/wordpress/android/fluxc/release/ReleaseStack_TaxonomyTestWPCom.java @@ -100,8 +100,7 @@ public void testFetchTermsForInvalidTaxonomy() throws InterruptedException { mNextEvent = TestEvents.ERROR_INVALID_TAXONOMY; mCountDownLatch = new CountDownLatch(1); - TaxonomyModel taxonomyModel = new TaxonomyModel(); - taxonomyModel.setName("roads"); + TaxonomyModel taxonomyModel = new TaxonomyModel("roads"); FetchTermsPayload payload = new FetchTermsPayload(sSite, taxonomyModel); mDispatcher.dispatch(TaxonomyActionBuilder.newFetchTermsAction(payload)); @@ -189,8 +188,7 @@ public void testDeleteTag() throws InterruptedException { @Test public void testUploadNewCategoryAsTerm() throws InterruptedException { - TaxonomyModel taxonomyModel = new TaxonomyModel(); - taxonomyModel.setName(TaxonomyStore.DEFAULT_TAXONOMY_CATEGORY); + TaxonomyModel taxonomyModel = new TaxonomyModel(TaxonomyStore.DEFAULT_TAXONOMY_CATEGORY); // Instantiate new term TermModel term = createNewTerm(taxonomyModel); @@ -209,8 +207,7 @@ public void testUploadNewCategoryAsTerm() throws InterruptedException { @Test public void testUploadTermForInvalidTaxonomy() throws InterruptedException { - TaxonomyModel taxonomyModel = new TaxonomyModel(); - taxonomyModel.setName("roads"); + TaxonomyModel taxonomyModel = new TaxonomyModel("roads"); // Instantiate new term TermModel term = createNewTerm(taxonomyModel); diff --git a/example/src/androidTest/java/org/wordpress/android/fluxc/release/ReleaseStack_TaxonomyTestXMLRPC.java b/example/src/androidTest/java/org/wordpress/android/fluxc/release/ReleaseStack_TaxonomyTestXMLRPC.java index ddf3b4b73f..3f15580672 100644 --- a/example/src/androidTest/java/org/wordpress/android/fluxc/release/ReleaseStack_TaxonomyTestXMLRPC.java +++ b/example/src/androidTest/java/org/wordpress/android/fluxc/release/ReleaseStack_TaxonomyTestXMLRPC.java @@ -107,8 +107,7 @@ public void testFetchTermsForInvalidTaxonomy() throws InterruptedException { mNextEvent = TestEvents.ERROR_GENERIC; mCountDownLatch = new CountDownLatch(1); - TaxonomyModel taxonomyModel = new TaxonomyModel(); - taxonomyModel.setName("roads"); + TaxonomyModel taxonomyModel = new TaxonomyModel("roads"); FetchTermsPayload payload = new FetchTermsPayload(sSite, taxonomyModel); mDispatcher.dispatch(TaxonomyActionBuilder.newFetchTermsAction(payload)); @@ -188,8 +187,7 @@ public void testUpdateExistingTag() throws InterruptedException { @Test public void testUploadNewCategoryAsTerm() throws InterruptedException { - TaxonomyModel taxonomyModel = new TaxonomyModel(); - taxonomyModel.setName(TaxonomyStore.DEFAULT_TAXONOMY_CATEGORY); + TaxonomyModel taxonomyModel = new TaxonomyModel(TaxonomyStore.DEFAULT_TAXONOMY_CATEGORY); // Instantiate new term TermModel termModel = createNewTerm(taxonomyModel); @@ -208,8 +206,7 @@ public void testUploadNewCategoryAsTerm() throws InterruptedException { @Test public void testUploadTermForInvalidTaxonomy() throws InterruptedException { - TaxonomyModel taxonomyModel = new TaxonomyModel(); - taxonomyModel.setName("roads"); + TaxonomyModel taxonomyModel = new TaxonomyModel("roads"); // Instantiate new term TermModel term = createNewTerm(taxonomyModel); diff --git a/fluxc/src/main/java/org/wordpress/android/fluxc/model/TaxonomyModel.java b/fluxc/src/main/java/org/wordpress/android/fluxc/model/TaxonomyModel.java index b3cba6fe59..7f48144f5d 100644 --- a/fluxc/src/main/java/org/wordpress/android/fluxc/model/TaxonomyModel.java +++ b/fluxc/src/main/java/org/wordpress/android/fluxc/model/TaxonomyModel.java @@ -15,7 +15,6 @@ import java.io.Serializable; @Table -@SuppressWarnings("NotNullFieldNotInitialized") public class TaxonomyModel extends Payload implements Identifiable, Serializable { private static final long serialVersionUID = 8855881690971305398L; @@ -28,6 +27,48 @@ public class TaxonomyModel extends Payload implements Identifi @Column private boolean mIsHierarchical; @Column private boolean mIsPublic; + @Deprecated + @SuppressWarnings("DeprecatedIsStillUsed") + public TaxonomyModel() { + this.mId = 0; + this.mLocalSiteId = 0; + this.mName = ""; + this.mLabel = null; + this.mDescription = null; + this.mIsHierarchical = false; + this.mIsPublic = false; + } + + /** + * Use when adding a new taxonomy. + */ + public TaxonomyModel(@NonNull String name) { + this.mId = 0; + this.mLocalSiteId = 0; + this.mName = name; + this.mLabel = null; + this.mDescription = null; + this.mIsHierarchical = false; + this.mIsPublic = false; + } + + public TaxonomyModel( + int id, + int localSiteId, + @NonNull String name, + @Nullable String label, + @Nullable String description, + boolean isHierarchical, + boolean isPublic) { + this.mId = id; + this.mLocalSiteId = localSiteId; + this.mName = name; + this.mLabel = label; + this.mDescription = description; + this.mIsHierarchical = isHierarchical; + this.mIsPublic = isPublic; + } + @Override public int getId() { return mId; From 11b5817417dbd37791e5dab07716e1f4485bf65f Mon Sep 17 00:00:00 2001 From: Petros Paraskevopoulos Date: Fri, 8 Sep 2023 16:37:10 +0300 Subject: [PATCH 38/38] Analysis: Add default and non-default constructors for term model This is done so that clients of that model, clients like JP/WPAndroid, when trying to manually instantiating such a model, they will always use the non-default constructor, and thus always provide at least a 'taxonomy' argument. The empty default constructor was added because '@Table' related models need to have one such constructor. Otherwise, its 'Mapper' related auto-generated class would fail to compile, in this case the 'TermModelMapper.java' class. Also, a full-arguments constructor was added, which should be the preferred and goto constructor for most cases. FYI: The trick I used to first '@Deprecated' this constructor is to help clients avoid using this constructor in the future, that is, when they manually construct one. Suppressing the 'DeprecatedIsStillUsed' warning was necessary because otherwise, even if every occurrence in the codebase is being switched to the non-default constructor, the auto-generated 'Mapper' related class will anyway use that default constructor, thus this warning will persist no matter what. PS: Note that on both, the 1-argument constructor and the 3-arguments constructors, an extra Javadoc is added to help clients understand when and why to use each. For all other cases, using the full-arguments constructor should be the preferred and goto constructor. --- .../ReleaseStack_TaxonomyTestWPCom.java | 6 +- .../ReleaseStack_TaxonomyTestXMLRPC.java | 6 +- .../fluxc/example/TaxonomiesFragment.java | 10 +-- .../fluxc/taxonomy/TaxonomyStoreUnitTest.java | 3 +- .../fluxc/taxonomy/TaxonomyTestUtils.java | 39 ++++++----- .../android/fluxc/taxonomy/TermModelTest.java | 10 +-- .../android/fluxc/model/TermModel.java | 70 ++++++++++++++++++- .../wpcom/taxonomy/TaxonomyRestClient.java | 54 ++++++++------ .../xmlrpc/taxonomy/TaxonomyXMLRPCClient.java | 23 +++--- 9 files changed, 148 insertions(+), 73 deletions(-) diff --git a/example/src/androidTest/java/org/wordpress/android/fluxc/release/ReleaseStack_TaxonomyTestWPCom.java b/example/src/androidTest/java/org/wordpress/android/fluxc/release/ReleaseStack_TaxonomyTestWPCom.java index cceecd1507..b0458c5ba5 100644 --- a/example/src/androidTest/java/org/wordpress/android/fluxc/release/ReleaseStack_TaxonomyTestWPCom.java +++ b/example/src/androidTest/java/org/wordpress/android/fluxc/release/ReleaseStack_TaxonomyTestWPCom.java @@ -113,8 +113,7 @@ public void testFetchSingleCategory() throws InterruptedException { mNextEvent = TestEvents.TERM_UPDATED; mCountDownLatch = new CountDownLatch(1); - TermModel term = new TermModel(); - term.setTaxonomy(TaxonomyStore.DEFAULT_TAXONOMY_CATEGORY); + TermModel term = new TermModel(TaxonomyStore.DEFAULT_TAXONOMY_CATEGORY); term.setSlug("uncategorized"); mDispatcher.dispatch(TaxonomyActionBuilder.newFetchTermAction(new RemoteTermPayload(term, sSite))); @@ -434,9 +433,8 @@ private void checkUpdateExistingTerm(TermModel term) throws InterruptedException @Nullable private TermModel instantiateTermModel(@NonNull SiteModel site, @NonNull String taxonomyName) { - TermModel newTerm = new TermModel(); + TermModel newTerm = new TermModel(taxonomyName); newTerm.setLocalSiteId(site.getId()); - newTerm.setTaxonomy(taxonomyName); // Insert the term into the db, updating the object to include the local ID TermModel insertedTerm = insertTermForResult(newTerm); diff --git a/example/src/androidTest/java/org/wordpress/android/fluxc/release/ReleaseStack_TaxonomyTestXMLRPC.java b/example/src/androidTest/java/org/wordpress/android/fluxc/release/ReleaseStack_TaxonomyTestXMLRPC.java index 3f15580672..a0cb9c4648 100644 --- a/example/src/androidTest/java/org/wordpress/android/fluxc/release/ReleaseStack_TaxonomyTestXMLRPC.java +++ b/example/src/androidTest/java/org/wordpress/android/fluxc/release/ReleaseStack_TaxonomyTestXMLRPC.java @@ -124,8 +124,7 @@ public void testFetchSingleCategory() throws InterruptedException { mNextEvent = TestEvents.TERM_UPDATED; mCountDownLatch = new CountDownLatch(1); - TermModel term = new TermModel(); - term.setTaxonomy(TaxonomyStore.DEFAULT_TAXONOMY_CATEGORY); + TermModel term = new TermModel(TaxonomyStore.DEFAULT_TAXONOMY_CATEGORY); term.setSlug("uncategorized"); term.setRemoteTermId(1); mDispatcher.dispatch(TaxonomyActionBuilder.newFetchTermAction(new RemoteTermPayload(term, sSite))); @@ -452,9 +451,8 @@ private void deleteTerm(TermModel term) throws InterruptedException { @Nullable private TermModel instantiateTermModel(@NonNull SiteModel site, @NonNull String taxonomyName) { - TermModel newTerm = new TermModel(); + TermModel newTerm = new TermModel(taxonomyName); newTerm.setLocalSiteId(site.getId()); - newTerm.setTaxonomy(taxonomyName); // Insert the term into the db, updating the object to include the local ID TermModel insertedTerm = insertTermForResult(newTerm); diff --git a/example/src/main/java/org/wordpress/android/fluxc/example/TaxonomiesFragment.java b/example/src/main/java/org/wordpress/android/fluxc/example/TaxonomiesFragment.java index 8d4122f2a4..8ddf958e93 100644 --- a/example/src/main/java/org/wordpress/android/fluxc/example/TaxonomiesFragment.java +++ b/example/src/main/java/org/wordpress/android/fluxc/example/TaxonomiesFragment.java @@ -94,11 +94,11 @@ private void fetchTagsFirstSite() { } private void createCategory() { - TermModel newCategory = new TermModel(); - newCategory.setLocalSiteId(getFirstSite().getId()); - newCategory.setTaxonomy(TaxonomyStore.DEFAULT_TAXONOMY_CATEGORY); - newCategory.setName("FluxC-category-" + new Random().nextLong()); - newCategory.setDescription("From FluxC example app"); + TermModel newCategory = new TermModel( + TaxonomyStore.DEFAULT_TAXONOMY_CATEGORY, + "FluxC-Category-" + new Random().nextLong(), + 0 + ); RemoteTermPayload payload = new RemoteTermPayload(newCategory, getFirstSite()); mDispatcher.dispatch(TaxonomyActionBuilder.newPushTermAction(payload)); } diff --git a/example/src/test/java/org/wordpress/android/fluxc/taxonomy/TaxonomyStoreUnitTest.java b/example/src/test/java/org/wordpress/android/fluxc/taxonomy/TaxonomyStoreUnitTest.java index a2e9d6ea30..4eb3fb63d1 100644 --- a/example/src/test/java/org/wordpress/android/fluxc/taxonomy/TaxonomyStoreUnitTest.java +++ b/example/src/test/java/org/wordpress/android/fluxc/taxonomy/TaxonomyStoreUnitTest.java @@ -46,8 +46,7 @@ public void setUp() { @Test public void testSimpleInsertionAndRetrieval() { - TermModel termModel = new TermModel(); - termModel.setRemoteTermId(42); + TermModel termModel = new TermModel(TaxonomyStore.DEFAULT_TAXONOMY_CATEGORY); TaxonomySqlUtils.insertOrUpdateTerm(termModel); assertEquals(1, TaxonomyTestUtils.getTermsCount()); diff --git a/example/src/test/java/org/wordpress/android/fluxc/taxonomy/TaxonomyTestUtils.java b/example/src/test/java/org/wordpress/android/fluxc/taxonomy/TaxonomyTestUtils.java index 594085e6d2..cf4c54b16d 100644 --- a/example/src/test/java/org/wordpress/android/fluxc/taxonomy/TaxonomyTestUtils.java +++ b/example/src/test/java/org/wordpress/android/fluxc/taxonomy/TaxonomyTestUtils.java @@ -1,5 +1,7 @@ package org.wordpress.android.fluxc.taxonomy; +import androidx.annotation.NonNull; + import com.yarolegovich.wellsql.WellSql; import org.wordpress.android.fluxc.model.TermModel; @@ -8,34 +10,37 @@ import java.util.List; class TaxonomyTestUtils { - private static TermModel generateSampleTerm() { - TermModel example = new TermModel(); - example.setLocalSiteId(6); - example.setRemoteTermId(5); - example.setSlug("travel"); - example.setName("Travel"); - example.setDescription("Post about travelling"); - return example; + @NonNull + private static TermModel generateSampleTerm(@NonNull String taxonomy) { + return new TermModel( + 0, + 6, + 5, + taxonomy, + "Travel", + "travel", + "Post about travelling", + 0, + 0 + ); } + @NonNull public static TermModel generateSampleCategory() { - TermModel exampleCategory = generateSampleTerm(); - exampleCategory.setTaxonomy(TaxonomyStore.DEFAULT_TAXONOMY_CATEGORY); - return exampleCategory; + return generateSampleTerm(TaxonomyStore.DEFAULT_TAXONOMY_CATEGORY); } + @NonNull public static TermModel generateSampleTag() { - TermModel exampleTag = generateSampleTerm(); - exampleTag.setTaxonomy(TaxonomyStore.DEFAULT_TAXONOMY_TAG); - return exampleTag; + return generateSampleTerm(TaxonomyStore.DEFAULT_TAXONOMY_TAG); } + @NonNull public static TermModel generateSampleAuthor() { - TermModel exampleAuthor = generateSampleTerm(); - exampleAuthor.setTaxonomy("author"); - return exampleAuthor; + return generateSampleTerm("author"); } + @NonNull static List getTerms() { return WellSql.select(TermModel.class).getAsModel(); } diff --git a/example/src/test/java/org/wordpress/android/fluxc/taxonomy/TermModelTest.java b/example/src/test/java/org/wordpress/android/fluxc/taxonomy/TermModelTest.java index 5314bfaac1..2a0e81d53f 100644 --- a/example/src/test/java/org/wordpress/android/fluxc/taxonomy/TermModelTest.java +++ b/example/src/test/java/org/wordpress/android/fluxc/taxonomy/TermModelTest.java @@ -9,12 +9,12 @@ public class TermModelTest { @Test public void testEquals() { - TermModel testCategory = TaxonomyTestUtils.generateSampleCategory(); + TermModel testCategory1 = TaxonomyTestUtils.generateSampleCategory(); TermModel testCategory2 = TaxonomyTestUtils.generateSampleCategory(); - testCategory2.setRemoteTermId(testCategory.getRemoteTermId() + 1); - assertFalse(testCategory.equals(testCategory2)); - testCategory2.setRemoteTermId(testCategory.getRemoteTermId()); - assertTrue(testCategory.equals(testCategory2)); + testCategory2.setRemoteTermId(testCategory1.getRemoteTermId() + 1); + assertFalse(testCategory1.equals(testCategory2)); + testCategory2.setRemoteTermId(testCategory1.getRemoteTermId()); + assertTrue(testCategory1.equals(testCategory2)); } } diff --git a/fluxc/src/main/java/org/wordpress/android/fluxc/model/TermModel.java b/fluxc/src/main/java/org/wordpress/android/fluxc/model/TermModel.java index d4ced64de4..a18283d533 100644 --- a/fluxc/src/main/java/org/wordpress/android/fluxc/model/TermModel.java +++ b/fluxc/src/main/java/org/wordpress/android/fluxc/model/TermModel.java @@ -15,7 +15,6 @@ import java.io.Serializable; @Table -@SuppressWarnings("NotNullFieldNotInitialized") public class TermModel extends Payload implements Identifiable, Serializable { private static final long serialVersionUID = -1484257248446576276L; @@ -30,6 +29,75 @@ public class TermModel extends Payload implements Identifiable @Column private long mParentRemoteId; @Column private int mPostCount; + @Deprecated + @SuppressWarnings("DeprecatedIsStillUsed") + public TermModel() { + this.mId = 0; + this.mLocalSiteId = 0; + this.mRemoteTermId = 0; + this.mTaxonomy = ""; + this.mName = ""; + this.mSlug = null; + this.mDescription = null; + this.mParentRemoteId = 0; + this.mPostCount = 0; + } + + /** + * Use when starting with an empty term. + */ + public TermModel(@NonNull String taxonomy) { + this.mId = 0; + this.mLocalSiteId = 0; + this.mRemoteTermId = 0; + this.mTaxonomy = taxonomy; + this.mName = ""; + this.mSlug = null; + this.mDescription = null; + this.mParentRemoteId = 0; + this.mPostCount = 0; + } + + /** + * Use when adding a new term. + */ + public TermModel( + @NonNull String taxonomy, + @NonNull String name, + long parentRemoteId + ) { + this.mId = 0; + this.mLocalSiteId = 0; + this.mRemoteTermId = 0; + this.mTaxonomy = taxonomy; + this.mName = name; + this.mSlug = null; + this.mDescription = null; + this.mParentRemoteId = parentRemoteId; + this.mPostCount = 0; + } + + public TermModel( + int id, + int localSiteId, + long remoteTermId, + @NonNull String taxonomy, + @NonNull String name, + @Nullable String slug, + @Nullable String description, + long parentRemoteId, + int postCount) { + this.mId = id; + this.mLocalSiteId = localSiteId; + this.mRemoteTermId = remoteTermId; + this.mTaxonomy = taxonomy; + this.mName = name; + this.mSlug = slug; + this.mDescription = description; + this.mParentRemoteId = parentRemoteId; + this.mPostCount = postCount; + } + @Override public int getId() { return mId; diff --git a/fluxc/src/main/java/org/wordpress/android/fluxc/network/rest/wpcom/taxonomy/TaxonomyRestClient.java b/fluxc/src/main/java/org/wordpress/android/fluxc/network/rest/wpcom/taxonomy/TaxonomyRestClient.java index b1e74164b0..3e4f79b0e5 100644 --- a/fluxc/src/main/java/org/wordpress/android/fluxc/network/rest/wpcom/taxonomy/TaxonomyRestClient.java +++ b/fluxc/src/main/java/org/wordpress/android/fluxc/network/rest/wpcom/taxonomy/TaxonomyRestClient.java @@ -53,11 +53,11 @@ public void fetchTerm(@NonNull final TermModel term, @NonNull final SiteModel si final WPComGsonRequest request = WPComGsonRequest.buildGetRequest(url, null, TermWPComRestResponse.class, response -> { - TermModel fetchedTerm = termResponseToTermModel(response); - fetchedTerm.setId(term.getId()); - fetchedTerm.setTaxonomy(taxonomy); - fetchedTerm.setLocalSiteId(site.getId()); - + TermModel fetchedTerm = termResponseToTermModel( + term.getId(), + site.getId(), + taxonomy, + response); FetchTermResponsePayload payload = new FetchTermResponsePayload(fetchedTerm, site); mDispatcher.dispatch(TaxonomyActionBuilder.newFetchedTermAction(payload)); }, @@ -83,9 +83,11 @@ public void fetchTerms(@NonNull final SiteModel site, @NonNull final String taxo List termArray = new ArrayList<>(); TermModel term; for (TermWPComRestResponse termResponse : response.terms) { - term = termResponseToTermModel(termResponse); - term.setTaxonomy(taxonomyName); - term.setLocalSiteId(site.getId()); + term = termResponseToTermModel( + 0, + site.getId(), + taxonomyName, + termResponse); termArray.add(term); } @@ -114,12 +116,11 @@ public void pushTerm(@NonNull final TermModel term, @NonNull final SiteModel sit final WPComGsonRequest request = WPComGsonRequest.buildPostRequest(url, body, TermWPComRestResponse.class, response -> { - TermModel uploadedTerm = termResponseToTermModel(response); - - uploadedTerm.setId(term.getId()); - uploadedTerm.setLocalSiteId(site.getId()); - uploadedTerm.setTaxonomy(taxonomy); - + TermModel uploadedTerm = termResponseToTermModel( + term.getId(), + site.getId(), + taxonomy, + response); RemoteTermPayload payload = new RemoteTermPayload(uploadedTerm, site); mDispatcher.dispatch(TaxonomyActionBuilder.newPushedTermAction(payload)); }, @@ -159,15 +160,22 @@ public void deleteTerm(@NonNull final TermModel term, @NonNull final SiteModel s } @NonNull - private TermModel termResponseToTermModel(@NonNull TermWPComRestResponse from) { - TermModel term = new TermModel(); - term.setRemoteTermId(from.ID); - term.setName(StringEscapeUtils.unescapeHtml4(from.name)); - term.setSlug(from.slug); - term.setDescription(StringEscapeUtils.unescapeHtml4(from.description)); - term.setParentRemoteId(from.parent); - term.setPostCount(from.post_count); - return term; + private TermModel termResponseToTermModel( + int termId, + int siteId, + @NonNull String taxonomy, + @NonNull TermWPComRestResponse from) { + return new TermModel( + termId, + siteId, + from.ID, + taxonomy, + StringEscapeUtils.unescapeHtml4(from.name), + from.slug, + StringEscapeUtils.unescapeHtml4(from.description), + from.parent, + from.post_count + ); } @NonNull diff --git a/fluxc/src/main/java/org/wordpress/android/fluxc/network/xmlrpc/taxonomy/TaxonomyXMLRPCClient.java b/fluxc/src/main/java/org/wordpress/android/fluxc/network/xmlrpc/taxonomy/TaxonomyXMLRPCClient.java index 20d4e225bc..3f5d6946d6 100644 --- a/fluxc/src/main/java/org/wordpress/android/fluxc/network/xmlrpc/taxonomy/TaxonomyXMLRPCClient.java +++ b/fluxc/src/main/java/org/wordpress/android/fluxc/network/xmlrpc/taxonomy/TaxonomyXMLRPCClient.java @@ -279,24 +279,23 @@ private TermModel termResponseObjectToTermModel(Object termObject, SiteModel sit } Map termMap = (Map) termObject; - TermModel term = new TermModel(); - String termId = MapUtils.getMapStr(termMap, "term_id"); if (TextUtils.isEmpty(termId)) { // If we don't have a term ID, move on return null; } - term.setLocalSiteId(site.getId()); - term.setRemoteTermId(Integer.valueOf(termId)); - term.setSlug(MapUtils.getMapStr(termMap, "slug")); - term.setName(StringEscapeUtils.unescapeHtml4(MapUtils.getMapStr(termMap, "name"))); - term.setDescription(StringEscapeUtils.unescapeHtml4(MapUtils.getMapStr(termMap, "description"))); - term.setParentRemoteId(MapUtils.getMapLong(termMap, "parent")); - term.setTaxonomy(MapUtils.getMapStr(termMap, "taxonomy")); - term.setPostCount(MapUtils.getMapInt(termMap, "count", 0)); - - return term; + return new TermModel( + 0, + site.getId(), + Long.parseLong(termId), + MapUtils.getMapStr(termMap, "taxonomy"), + StringEscapeUtils.unescapeHtml4(MapUtils.getMapStr(termMap, "name")), + MapUtils.getMapStr(termMap, "slug"), + StringEscapeUtils.unescapeHtml4(MapUtils.getMapStr(termMap, "description")), + MapUtils.getMapLong(termMap, "parent"), + MapUtils.getMapInt(termMap, "count", 0) + ); } private static Map termModelToContentStruct(TermModel term) {