Skip to content

Commit

Permalink
Merge pull request #2866 from wordpress-mobile/analysis/add-missing-n…
Browse files Browse the repository at this point in the history
…ullability-annotations-to-taxonomyxmlrpcclient

[Nullability Annotations to Java Classes] Add Missing Nullability Annotations to `TaxonomyXMLRPCClient` (`safe`)
  • Loading branch information
irfano committed Oct 11, 2023
2 parents ba92dd0 + e17f655 commit ee1af4f
Showing 1 changed file with 103 additions and 131 deletions.
Original file line number Diff line number Diff line change
Expand Up @@ -3,6 +3,7 @@
import android.text.TextUtils;

import androidx.annotation.NonNull;
import androidx.annotation.Nullable;

import com.android.volley.RequestQueue;
import com.android.volley.Response.Listener;
Expand All @@ -15,7 +16,6 @@
import org.wordpress.android.fluxc.model.SiteModel;
import org.wordpress.android.fluxc.model.TermModel;
import org.wordpress.android.fluxc.model.TermsModel;
import org.wordpress.android.fluxc.network.BaseRequest.BaseErrorListener;
import org.wordpress.android.fluxc.network.BaseRequest.BaseNetworkError;
import org.wordpress.android.fluxc.network.HTTPAuthManager;
import org.wordpress.android.fluxc.network.UserAgent;
Expand All @@ -39,18 +39,22 @@

@Singleton
public class TaxonomyXMLRPCClient extends BaseXMLRPCClient {
@Inject public TaxonomyXMLRPCClient(Dispatcher dispatcher,
@Named("custom-ssl") RequestQueue requestQueue,
UserAgent userAgent,
HTTPAuthManager httpAuthManager) {
@Inject public TaxonomyXMLRPCClient(
Dispatcher dispatcher,
@Named("custom-ssl") RequestQueue requestQueue,
UserAgent userAgent,
HTTPAuthManager httpAuthManager) {
super(dispatcher, requestQueue, userAgent, httpAuthManager);
}

public void fetchTerm(final TermModel term, final SiteModel site) {
public void fetchTerm(@NonNull final TermModel term, @NonNull final SiteModel site) {
fetchTerm(term, site, TaxonomyAction.FETCH_TERM);
}

public void fetchTerm(final TermModel term, final SiteModel site, final TaxonomyAction origin) {
public void fetchTerm(
@NonNull final TermModel term,
@NonNull final SiteModel site,
@NonNull final TaxonomyAction origin) {
List<Object> params = new ArrayList<>(5);
params.add(site.getSelfHostedSiteId());
params.add(site.getUsername());
Expand All @@ -59,10 +63,8 @@ public void fetchTerm(final TermModel term, final SiteModel site, final Taxonomy
params.add(term.getRemoteTermId());

final XMLRPCRequest request = new XMLRPCRequest(site.getXmlRpcUrl(), XMLRPC.GET_TERM, params,
new Listener<Object>() {
@Override
public void onResponse(Object response) {
if (response != null && response instanceof Map) {
(Listener<Object>) response -> {
if (response instanceof Map) {
TermModel termModel = termResponseObjectToTermModel(response, site);
FetchTermResponsePayload payload;
if (termModel != null) {
Expand All @@ -78,83 +80,55 @@ public void onResponse(Object response) {

mDispatcher.dispatch(TaxonomyActionBuilder.newFetchedTermAction(payload));
}
}
},
new BaseErrorListener() {
@Override
public void onErrorResponse(@NonNull BaseNetworkError error) {
// Possible non-generic errors:
// 403 - "Invalid taxonomy."
// 404 - "Invalid term ID."
FetchTermResponsePayload payload = new FetchTermResponsePayload(term, site);
// TODO: Check the error message and flag this as INVALID_TAXONOMY or UNKNOWN_TERM
// Convert GenericErrorType to TaxonomyErrorType where applicable
TaxonomyError taxonomyError;
switch (error.type) {
case AUTHORIZATION_REQUIRED:
taxonomyError = new TaxonomyError(TaxonomyErrorType.UNAUTHORIZED, error.message);
break;
default:
taxonomyError = new TaxonomyError(TaxonomyErrorType.GENERIC_ERROR, error.message);
}
payload.error = taxonomyError;
payload.origin = origin;
mDispatcher.dispatch(TaxonomyActionBuilder.newFetchedTermAction(payload));
}
}
);
error -> {
// Possible non-generic errors:
// 403 - "Invalid taxonomy."
// 404 - "Invalid term ID."
FetchTermResponsePayload payload = new FetchTermResponsePayload(term, site);
payload.error = getTaxonomyError(error);
payload.origin = origin;
mDispatcher.dispatch(TaxonomyActionBuilder.newFetchedTermAction(payload));
});

add(request);
}

public void fetchTerms(final SiteModel site, final String taxonomyName) {
public void fetchTerms(@NonNull final SiteModel site, @NonNull final String taxonomyName) {
List<Object> params = new ArrayList<>(4);
params.add(site.getSelfHostedSiteId());
params.add(site.getUsername());
params.add(site.getPassword());
params.add(taxonomyName);

final XMLRPCRequest request = new XMLRPCRequest(site.getXmlRpcUrl(), XMLRPC.GET_TERMS, params,
new Listener<Object[]>() {
@Override
public void onResponse(Object[] response) {
TermsModel terms = termsResponseToTermsModel(response, site);

FetchTermsResponsePayload payload = new FetchTermsResponsePayload(terms, site, taxonomyName);

if (terms != null) {
mDispatcher.dispatch(TaxonomyActionBuilder.newFetchedTermsAction(payload));
} else {
payload.error = new TaxonomyError(TaxonomyErrorType.INVALID_RESPONSE);
mDispatcher.dispatch(TaxonomyActionBuilder.newFetchedTermsAction(payload));
}
response -> {
FetchTermsResponsePayload payload;
TermsModel terms = termsResponseToTermsModel(response, site);
if (terms != null) {
payload = new FetchTermsResponsePayload(terms, site, taxonomyName);
} else {
payload = new FetchTermsResponsePayload(
new TaxonomyError(TaxonomyErrorType.INVALID_RESPONSE),
taxonomyName
);
}
mDispatcher.dispatch(TaxonomyActionBuilder.newFetchedTermsAction(payload));
},
new BaseErrorListener() {
@Override
public void onErrorResponse(@NonNull BaseNetworkError error) {
// Possible non-generic errors:
// 403 - "Invalid taxonomy."
// TODO: Check the error message and flag this as INVALID_TAXONOMY if applicable
// Convert GenericErrorType to TaxonomyErrorType where applicable
TaxonomyError taxonomyError;
switch (error.type) {
case AUTHORIZATION_REQUIRED:
taxonomyError = new TaxonomyError(TaxonomyErrorType.UNAUTHORIZED, error.message);
break;
default:
taxonomyError = new TaxonomyError(TaxonomyErrorType.GENERIC_ERROR, error.message);
}
FetchTermsResponsePayload payload = new FetchTermsResponsePayload(taxonomyError, taxonomyName);
mDispatcher.dispatch(TaxonomyActionBuilder.newFetchedTermsAction(payload));
}
}
);
error -> {
// Possible non-generic errors:
// 403 - "Invalid taxonomy."
FetchTermsResponsePayload payload = new FetchTermsResponsePayload(
getTaxonomyError(error),
taxonomyName
);
mDispatcher.dispatch(TaxonomyActionBuilder.newFetchedTermsAction(payload));
});

add(request);
}

public void pushTerm(final TermModel term, final SiteModel site) {
public void pushTerm(@NonNull final TermModel term, @NonNull final SiteModel site) {
Map<String, Object> contentStruct = termModelToContentStruct(term);
final boolean updatingExistingTerm = term.getRemoteTermId() > 0;

Expand All @@ -169,48 +143,31 @@ public void pushTerm(final TermModel term, final SiteModel site) {

XMLRPC method = updatingExistingTerm ? XMLRPC.EDIT_TERM : XMLRPC.NEW_TERM;
final XMLRPCRequest request = new XMLRPCRequest(site.getXmlRpcUrl(), method, params,
new Listener<Object>() {
@Override
public void onResponse(Object response) {
// `term_id` is only returned for XMLRPC.NEW_TERM
if (!updatingExistingTerm) {
term.setRemoteTermId(Long.valueOf((String) response));
}

RemoteTermPayload payload = new RemoteTermPayload(term, site);
mDispatcher.dispatch(TaxonomyActionBuilder.newPushedTermAction(payload));
(Listener<Object>) response -> {
// `term_id` is only returned for XMLRPC.NEW_TERM
if (!updatingExistingTerm) {
term.setRemoteTermId(Long.parseLong((String) response));
}

RemoteTermPayload payload = new RemoteTermPayload(term, site);
mDispatcher.dispatch(TaxonomyActionBuilder.newPushedTermAction(payload));
},
new BaseErrorListener() {
@Override
public void onErrorResponse(@NonNull BaseNetworkError error) {
// Possible non-generic errors:
// 403 - "Invalid taxonomy."
// 403 - "Parent term does not exist."
// 403 - "The term name cannot be empty."
// 500 - "A term with the name provided already exists with this parent."
RemoteTermPayload payload = new RemoteTermPayload(term, site);
// TODO: Check the error message and flag this as one of the above specific errors if applicable
// Convert GenericErrorType to PostErrorType where applicable
TaxonomyError taxonomyError;
switch (error.type) {
case AUTHORIZATION_REQUIRED:
taxonomyError = new TaxonomyError(TaxonomyErrorType.UNAUTHORIZED, error.message);
break;
default:
taxonomyError = new TaxonomyError(TaxonomyErrorType.GENERIC_ERROR, error.message);
}
payload.error = taxonomyError;
mDispatcher.dispatch(TaxonomyActionBuilder.newPushedTermAction(payload));
}
}
);
error -> {
// Possible non-generic errors:
// 403 - "Invalid taxonomy."
// 403 - "Parent term does not exist."
// 403 - "The term name cannot be empty."
// 500 - "A term with the name provided already exists with this parent."
RemoteTermPayload payload = new RemoteTermPayload(term, site);
payload.error = getTaxonomyError(error);
mDispatcher.dispatch(TaxonomyActionBuilder.newPushedTermAction(payload));
});

request.disableRetries();
add(request);
}

public void deleteTerm(final TermModel term, final SiteModel site) {
public void deleteTerm(@NonNull final TermModel term, @NonNull final SiteModel site) {
List<Object> params = new ArrayList<>(4);
params.add(site.getSelfHostedSiteId());
params.add(site.getUsername());
Expand All @@ -219,36 +176,22 @@ public void deleteTerm(final TermModel term, final SiteModel site) {
params.add(term.getRemoteTermId());

final XMLRPCRequest request = new XMLRPCRequest(site.getXmlRpcUrl(), XMLRPC.DELETE_TERM, params,
new Listener<Object>() {
@Override
public void onResponse(Object response) {
RemoteTermPayload payload = new RemoteTermPayload(term, site);
mDispatcher.dispatch(TaxonomyActionBuilder.newDeletedTermAction(payload));
}
(Listener<Object>) response -> {
RemoteTermPayload payload = new RemoteTermPayload(term, site);
mDispatcher.dispatch(TaxonomyActionBuilder.newDeletedTermAction(payload));
},
new BaseErrorListener() {
@Override
public void onErrorResponse(@NonNull BaseNetworkError error) {
RemoteTermPayload payload = new RemoteTermPayload(term, site);
TaxonomyError taxonomyError;
switch (error.type) {
case AUTHORIZATION_REQUIRED:
taxonomyError = new TaxonomyError(TaxonomyErrorType.UNAUTHORIZED, error.message);
break;
default:
taxonomyError = new TaxonomyError(TaxonomyErrorType.GENERIC_ERROR, error.message);
}
payload.error = taxonomyError;
mDispatcher.dispatch(TaxonomyActionBuilder.newDeletedTermAction(payload));
}
}
);
error -> {
RemoteTermPayload payload = new RemoteTermPayload(term, site);
payload.error = getTaxonomyError(error);
mDispatcher.dispatch(TaxonomyActionBuilder.newDeletedTermAction(payload));
});

request.disableRetries();
add(request);
}

private TermsModel termsResponseToTermsModel(Object[] response, SiteModel site) {
@Nullable
private TermsModel termsResponseToTermsModel(@NonNull Object[] response, @NonNull SiteModel site) {
List<Map<?, ?>> termsList = new ArrayList<>();
for (Object responseObject : response) {
Map<?, ?> termMap = (Map<?, ?>) responseObject;
Expand All @@ -272,7 +215,8 @@ private TermsModel termsResponseToTermsModel(Object[] response, SiteModel site)
return new TermsModel(termArray);
}

private TermModel termResponseObjectToTermModel(Object termObject, SiteModel site) {
@Nullable
private TermModel termResponseObjectToTermModel(@NonNull Object termObject, @NonNull SiteModel site) {
// Sanity checks
if (!(termObject instanceof Map)) {
return null;
Expand All @@ -298,7 +242,8 @@ private TermModel termResponseObjectToTermModel(Object termObject, SiteModel sit
);
}

private static Map<String, Object> termModelToContentStruct(TermModel term) {
@NonNull
private static Map<String, Object> termModelToContentStruct(@NonNull TermModel term) {
Map<String, Object> contentStruct = new HashMap<>();

contentStruct.put("name", term.getName());
Expand All @@ -318,4 +263,31 @@ private static Map<String, Object> termModelToContentStruct(TermModel term) {

return contentStruct;
}

// TODO: Check the error message and flag this as a specific error if applicable.
// Convert GenericErrorType to TaxonomyErrorType where applicable
@NonNull
private TaxonomyError getTaxonomyError(@NonNull BaseNetworkError error) {
TaxonomyError taxonomyError;
switch (error.type) {
case AUTHORIZATION_REQUIRED:
taxonomyError = new TaxonomyError(TaxonomyErrorType.UNAUTHORIZED, error.message);
break;
case TIMEOUT:
case NO_CONNECTION:
case NETWORK_ERROR:
case NOT_FOUND:
case CENSORED:
case SERVER_ERROR:
case INVALID_SSL_CERTIFICATE:
case HTTP_AUTH_ERROR:
case INVALID_RESPONSE:
case NOT_AUTHENTICATED:
case PARSE_ERROR:
case UNKNOWN:
default:
taxonomyError = new TaxonomyError(TaxonomyErrorType.GENERIC_ERROR, error.message);
}
return taxonomyError;
}
}

0 comments on commit ee1af4f

Please sign in to comment.