Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

[Nullability Annotations to Java Classes] Add Missing Nullability Annotations to TaxonomyXMLRPCClient (safe) #2866

Merged
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
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
);
}
irfano marked this conversation as resolved.
Show resolved Hide resolved
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;
}
}
Loading