1
0
mirror of https://github.com/owncloud/android-library.git synced 2025-06-08 16:36:13 +00:00

Complete error handling and add error message from server to response

This commit is contained in:
David A. Velasco 2015-10-23 15:27:37 +02:00
parent 3d34e504ff
commit ad60bc9e8e
7 changed files with 167 additions and 62 deletions

View File

@ -107,7 +107,8 @@ public class RemoteOperationResult implements Serializable {
INVALID_COPY_INTO_DESCENDANT, INVALID_COPY_INTO_DESCENDANT,
PARTIAL_MOVE_DONE, PARTIAL_MOVE_DONE,
PARTIAL_COPY_DONE, PARTIAL_COPY_DONE,
INVALID_CHARACTER_DETECT_IN_SERVER SHARE_WRONG_PARAMETER,
WRONG_SERVER_RESPONSE, INVALID_CHARACTER_DETECT_IN_SERVER
} }
private boolean mSuccess = false; private boolean mSuccess = false;

View File

@ -140,8 +140,7 @@ public class CreateRemoteShareOperation extends RemoteOperation {
if(isSuccess(status)) { if(isSuccess(status)) {
String response = post.getResponseBodyAsString(); String response = post.getResponseBodyAsString();
ArrayList<Object> resultData = new ArrayList<Object>();
result = new RemoteOperationResult(ResultCode.OK);
// Parse xml response --> obtain the response in ShareFiles ArrayList // Parse xml response --> obtain the response in ShareFiles ArrayList
// convert String into InputStream // convert String into InputStream
@ -149,37 +148,44 @@ public class CreateRemoteShareOperation extends RemoteOperation {
ShareXMLParser xmlParser = new ShareXMLParser(); ShareXMLParser xmlParser = new ShareXMLParser();
mShares = xmlParser.parseXMLResponse(is); mShares = xmlParser.parseXMLResponse(is);
if (xmlParser.isSuccess()) { if (xmlParser.isSuccess()) {
if (mShares != null) { if (mShares != null && mShares.size() > 0) {
Log_OC.d(TAG, "Created " + mShares.size() + " share(s)"); Log_OC.d(TAG, "Created " + mShares.size() + " share(s)");
result = new RemoteOperationResult(ResultCode.OK); result = new RemoteOperationResult(ResultCode.OK);
ArrayList<Object> sharesObjects = new ArrayList<Object>();
for (OCShare share: mShares) { for (OCShare share: mShares) {
sharesObjects.add(share); resultData.add(share);
} }
result.setData(sharesObjects); result.setData(resultData);
if (mGetShareDetails) { if (mGetShareDetails) {
// retrieve more info // retrieve more info
OCShare emptyShare = (OCShare) sharesObjects.get(0); OCShare emptyShare = (OCShare) resultData.get(0);
GetRemoteShareOperation getInfo = new GetRemoteShareOperation(emptyShare.getIdRemoteShared()); GetRemoteShareOperation getInfo = new GetRemoteShareOperation(emptyShare.getIdRemoteShared());
result = getInfo.execute(client); result = getInfo.execute(client);
} }
} else { } else {
result = new RemoteOperationResult(ResultCode.UNKNOWN_ERROR); result = new RemoteOperationResult(ResultCode.WRONG_SERVER_RESPONSE);
Log_OC.e(TAG, "Successful response with no share in it"); Log_OC.e(TAG, "Successful status with no share in it");
} }
} else if (xmlParser.isFileNotFound()){ } else if (xmlParser.isWrongParameter()){
result = new RemoteOperationResult(ResultCode.SHARE_NOT_FOUND); result = new RemoteOperationResult(ResultCode.SHARE_WRONG_PARAMETER);
resultData.add(xmlParser.getMessage());
result.setData(resultData);
} else if (xmlParser.isFailure()) { } else if (xmlParser.isNotFound()){
// TODO need deeper processing result = new RemoteOperationResult(ResultCode.SHARE_NOT_FOUND);
resultData.add(xmlParser.getMessage());
result.setData(resultData);
} else if (xmlParser.isForbidden()) {
result = new RemoteOperationResult(ResultCode.SHARE_FORBIDDEN); result = new RemoteOperationResult(ResultCode.SHARE_FORBIDDEN);
resultData.add(xmlParser.getMessage());
result.setData(resultData);
} else { } else {
result = new RemoteOperationResult(false, status, post.getResponseHeaders()); result = new RemoteOperationResult(ResultCode.WRONG_SERVER_RESPONSE);
} }
} else { } else {

View File

@ -25,8 +25,6 @@
package com.owncloud.android.lib.resources.shares; package com.owncloud.android.lib.resources.shares;
import android.net.Uri;
import com.owncloud.android.lib.common.OwnCloudClient; import com.owncloud.android.lib.common.OwnCloudClient;
import com.owncloud.android.lib.common.operations.RemoteOperation; import com.owncloud.android.lib.common.operations.RemoteOperation;
import com.owncloud.android.lib.common.operations.RemoteOperationResult; import com.owncloud.android.lib.common.operations.RemoteOperationResult;
@ -71,21 +69,46 @@ public class GetRemoteShareOperation extends RemoteOperation {
get = new GetMethod(client.getBaseUri() + ShareUtils.SHARING_API_PATH + "/" + Long.toString(mRemoteId)); get = new GetMethod(client.getBaseUri() + ShareUtils.SHARING_API_PATH + "/" + Long.toString(mRemoteId));
//get.addRequestHeader(OCS_API_HEADER, OCS_API_HEADER_VALUE); //get.addRequestHeader(OCS_API_HEADER, OCS_API_HEADER_VALUE);
status = client.executeMethod(get); status = client.executeMethod(get);
if(isSuccess(status)) { if(isSuccess(status)) {
String response = get.getResponseBodyAsString(); String response = get.getResponseBodyAsString();
ArrayList<Object> resultData = new ArrayList<Object>();
// Parse xml response --> obtain the response in ShareFiles ArrayList // Parse xml response --> obtain the response in ShareFiles ArrayList
// convert String into InputStream // convert String into InputStream
InputStream is = new ByteArrayInputStream(response.getBytes()); InputStream is = new ByteArrayInputStream(response.getBytes());
ShareXMLParser xmlParser = new ShareXMLParser(); ShareXMLParser xmlParser = new ShareXMLParser();
List<OCShare> shares = xmlParser.parseXMLResponse(is); List<OCShare> shares = xmlParser.parseXMLResponse(is);
if (shares != null && shares.size() > 0) { if (xmlParser.isSuccess()) {
Log_OC.d(TAG, "Got " + shares.size() + " shares"); if (shares != null && shares.size() > 0) {
result = new RemoteOperationResult(ResultCode.OK); Log_OC.d(TAG, "Got " + shares.size() + " shares");
ArrayList<Object> sharesObjects = new ArrayList<Object>(); result = new RemoteOperationResult(ResultCode.OK);
sharesObjects.add(shares.get(0)); resultData.add(shares.get(0));
result.setData(sharesObjects); result.setData(resultData);
} else {
result = new RemoteOperationResult(ResultCode.WRONG_SERVER_RESPONSE);
Log_OC.e(TAG, "Successful status with no share in it");
}
} else if (xmlParser.isWrongParameter()){
result = new RemoteOperationResult(ResultCode.SHARE_WRONG_PARAMETER);
resultData.add(xmlParser.getMessage());
result.setData(resultData);
} else if (xmlParser.isNotFound()){
result = new RemoteOperationResult(ResultCode.SHARE_NOT_FOUND);
resultData.add(xmlParser.getMessage());
result.setData(resultData);
} else if (xmlParser.isForbidden()) {
result = new RemoteOperationResult(ResultCode.SHARE_FORBIDDEN);
resultData.add(xmlParser.getMessage());
result.setData(resultData);
} else {
result = new RemoteOperationResult(ResultCode.WRONG_SERVER_RESPONSE);
} }
} else { } else {
result = new RemoteOperationResult(false, status, get.getResponseHeaders()); result = new RemoteOperationResult(false, status, get.getResponseHeaders());
} }

View File

@ -37,7 +37,6 @@ import com.owncloud.android.lib.common.operations.RemoteOperation;
import com.owncloud.android.lib.common.operations.RemoteOperationResult; import com.owncloud.android.lib.common.operations.RemoteOperationResult;
import com.owncloud.android.lib.common.operations.RemoteOperationResult.ResultCode; import com.owncloud.android.lib.common.operations.RemoteOperationResult.ResultCode;
import com.owncloud.android.lib.common.utils.Log_OC; import com.owncloud.android.lib.common.utils.Log_OC;
import com.owncloud.android.lib.resources.status.OwnCloudVersion;
/** /**
* Provide a list shares for a specific file. * Provide a list shares for a specific file.
@ -103,32 +102,53 @@ public class GetRemoteSharesForFileOperation extends RemoteOperation {
if(isSuccess(status)) { if(isSuccess(status)) {
String response = get.getResponseBodyAsString(); String response = get.getResponseBodyAsString();
ArrayList<Object> resultData = new ArrayList<Object>();
result = new RemoteOperationResult(ResultCode.OK);
// Parse xml response --> obtain the response in ShareFiles ArrayList // Parse xml response --> obtain the response in ShareFiles ArrayList
// convert String into InputStream // convert String into InputStream
InputStream is = new ByteArrayInputStream(response.getBytes()); InputStream is = new ByteArrayInputStream(response.getBytes());
ShareXMLParser xmlParser = new ShareXMLParser(); ShareXMLParser xmlParser = new ShareXMLParser();
mShares = xmlParser.parseXMLResponse(is); mShares = xmlParser.parseXMLResponse(is);
if (mShares != null) { if (xmlParser.isSuccess()) {
Log_OC.d(TAG, "Got " + mShares.size() + " shares"); if (mShares != null) { // 0 shares is a right response
result = new RemoteOperationResult(ResultCode.OK); Log_OC.d(TAG, "Got " + mShares.size() + " shares");
ArrayList<Object> sharesObjects = new ArrayList<Object>(); result = new RemoteOperationResult(ResultCode.OK);
for (OCShare share: mShares) { for (OCShare share: mShares) {
// Build the link // Build the link
if ( share.getShareType() == ShareType.PUBLIC_LINK && if ( share.getShareType() == ShareType.PUBLIC_LINK &&
share.getShareLink() == null && share.getShareLink() == null &&
share.getToken().length() > 0 share.getToken().length() > 0
) { ) {
String linkToken = ShareUtils.getSharingToken( String linkToken = ShareUtils.getSharingToken(
client.getOwnCloudVersion()); client.getOwnCloudVersion());
share.setShareLink(client.getBaseUri() + linkToken + share.setShareLink(client.getBaseUri() + linkToken +
share.getToken()); share.getToken());
}
resultData.add(share);
} }
sharesObjects.add(share); result.setData(resultData);
} else {
result = new RemoteOperationResult(ResultCode.WRONG_SERVER_RESPONSE);
Log_OC.e(TAG, "Successful status with no share in it");
} }
result.setData(sharesObjects);
} else if (xmlParser.isWrongParameter()){
result = new RemoteOperationResult(ResultCode.SHARE_WRONG_PARAMETER);
resultData.add(xmlParser.getMessage());
result.setData(resultData);
} else if (xmlParser.isNotFound()){
result = new RemoteOperationResult(ResultCode.SHARE_NOT_FOUND);
resultData.add(xmlParser.getMessage());
result.setData(resultData);
} else if (xmlParser.isForbidden()) {
result = new RemoteOperationResult(ResultCode.SHARE_FORBIDDEN);
resultData.add(xmlParser.getMessage());
result.setData(resultData);
} else {
result = new RemoteOperationResult(ResultCode.WRONG_SERVER_RESPONSE);
} }
} else { } else {

View File

@ -68,23 +68,45 @@ public class GetRemoteSharesOperation extends RemoteOperation {
get = new GetMethod(client.getBaseUri() + ShareUtils.SHARING_API_PATH); get = new GetMethod(client.getBaseUri() + ShareUtils.SHARING_API_PATH);
get.addRequestHeader(OCS_API_HEADER, OCS_API_HEADER_VALUE); get.addRequestHeader(OCS_API_HEADER, OCS_API_HEADER_VALUE);
status = client.executeMethod(get); status = client.executeMethod(get);
if(isSuccess(status)) { if(isSuccess(status)) {
String response = get.getResponseBodyAsString(); String response = get.getResponseBodyAsString();
ArrayList<Object> resultData = new ArrayList<Object>();
// Parse xml response --> obtain the response in ShareFiles ArrayList // Parse xml response --> obtain the response in ShareFiles ArrayList
// convert String into InputStream // convert String into InputStream
InputStream is = new ByteArrayInputStream(response.getBytes()); InputStream is = new ByteArrayInputStream(response.getBytes());
ShareXMLParser xmlParser = new ShareXMLParser(); ShareXMLParser xmlParser = new ShareXMLParser();
mShares = xmlParser.parseXMLResponse(is); mShares = xmlParser.parseXMLResponse(is);
if (mShares != null) { if (xmlParser.isSuccess()) {
Log_OC.d(TAG, "Got " + mShares.size() + " shares"); if (mShares != null) { // 0 shares is a right response
result = new RemoteOperationResult(ResultCode.OK); Log_OC.d(TAG, "Got " + mShares.size() + " shares");
ArrayList<Object> sharesObjects = new ArrayList<Object>(); result = new RemoteOperationResult(ResultCode.OK);
for (OCShare share: mShares) { for (OCShare share : mShares) {
sharesObjects.add(share); resultData.add(share);
}
result.setData(resultData);
} }
result.setData(sharesObjects);
} else if (xmlParser.isWrongParameter()){
result = new RemoteOperationResult(ResultCode.SHARE_WRONG_PARAMETER);
resultData.add(xmlParser.getMessage());
result.setData(resultData);
} else if (xmlParser.isNotFound()){
result = new RemoteOperationResult(ResultCode.SHARE_NOT_FOUND);
resultData.add(xmlParser.getMessage());
result.setData(resultData);
} else if (xmlParser.isForbidden()) {
result = new RemoteOperationResult(ResultCode.SHARE_FORBIDDEN);
resultData.add(xmlParser.getMessage());
result.setData(resultData);
} else {
result = new RemoteOperationResult(ResultCode.WRONG_SERVER_RESPONSE);
} }
} else { } else {
result = new RemoteOperationResult(false, status, get.getResponseHeaders()); result = new RemoteOperationResult(false, status, get.getResponseHeaders());
} }

View File

@ -26,6 +26,7 @@ package com.owncloud.android.lib.resources.shares;
import java.io.ByteArrayInputStream; import java.io.ByteArrayInputStream;
import java.io.InputStream; import java.io.InputStream;
import java.util.ArrayList;
import org.apache.commons.httpclient.HttpStatus; import org.apache.commons.httpclient.HttpStatus;
import org.apache.jackrabbit.webdav.client.methods.DeleteMethod; import org.apache.jackrabbit.webdav.client.methods.DeleteMethod;
@ -77,8 +78,7 @@ public class RemoveRemoteShareOperation extends RemoteOperation {
if(isSuccess(status)) { if(isSuccess(status)) {
String response = delete.getResponseBodyAsString(); String response = delete.getResponseBodyAsString();
ArrayList<Object> resultData = new ArrayList<Object>();
result = new RemoteOperationResult(ResultCode.OK);
// Parse xml response // Parse xml response
// convert String into InputStream // convert String into InputStream
@ -87,10 +87,23 @@ public class RemoveRemoteShareOperation extends RemoteOperation {
xmlParser.parseXMLResponse(is); xmlParser.parseXMLResponse(is);
if (xmlParser.isSuccess()) { if (xmlParser.isSuccess()) {
result = new RemoteOperationResult(ResultCode.OK); result = new RemoteOperationResult(ResultCode.OK);
} else if (xmlParser.isFileNotFound()){ } else if (xmlParser.isWrongParameter()){
result = new RemoteOperationResult(ResultCode.SHARE_WRONG_PARAMETER);
resultData.add(xmlParser.getMessage());
result.setData(resultData);
} else if (xmlParser.isNotFound()){
result = new RemoteOperationResult(ResultCode.SHARE_NOT_FOUND); result = new RemoteOperationResult(ResultCode.SHARE_NOT_FOUND);
resultData.add(xmlParser.getMessage());
result.setData(resultData);
} else if (xmlParser.isForbidden()) {
result = new RemoteOperationResult(ResultCode.SHARE_FORBIDDEN);
resultData.add(xmlParser.getMessage());
result.setData(resultData);
} else { } else {
result = new RemoteOperationResult(false, status, delete.getResponseHeaders()); result = new RemoteOperationResult(ResultCode.WRONG_SERVER_RESPONSE);
} }
Log_OC.d(TAG, "Unshare " + id + ": " + result.getLogMessage()); Log_OC.d(TAG, "Unshare " + id + ": " + result.getLogMessage());

View File

@ -57,7 +57,7 @@ public class ShareXMLParser {
private static final String NODE_META = "meta"; private static final String NODE_META = "meta";
private static final String NODE_STATUS = "status"; private static final String NODE_STATUS = "status";
private static final String NODE_STATUS_CODE = "statuscode"; private static final String NODE_STATUS_CODE = "statuscode";
//private static final String NODE_MESSAGE = "message"; private static final String NODE_MESSAGE = "message";
private static final String NODE_DATA = "data"; private static final String NODE_DATA = "data";
private static final String NODE_ELEMENT = "element"; private static final String NODE_ELEMENT = "element";
@ -82,11 +82,13 @@ public class ShareXMLParser {
private static final String TYPE_FOLDER = "folder"; private static final String TYPE_FOLDER = "folder";
private static final int SUCCESS = 100; private static final int SUCCESS = 100;
private static final int FAILURE = 403; private static final int ERROR_WRONG_PARAMETER = 403;
private static final int FILE_NOT_FOUND = 404; private static final int ERROR_FORBIDDEN = 403;
private static final int ERROR_NOT_FOUND = 404;
private String mStatus; private String mStatus;
private int mStatusCode; private int mStatusCode;
private String mMessage;
// Getters and Setters // Getters and Setters
public String getStatus() { public String getStatus() {
@ -104,19 +106,34 @@ public class ShareXMLParser {
public void setStatusCode(int statusCode) { public void setStatusCode(int statusCode) {
this.mStatusCode = statusCode; this.mStatusCode = statusCode;
} }
public String getMessage() {
return mMessage;
}
public void setMessage(String message) {
this.mMessage = message;
}
// Constructor // Constructor
public ShareXMLParser() { public ShareXMLParser() {
mStatusCode = 100; mStatusCode = -1;
} }
public boolean isSuccess() { public boolean isSuccess() {
return mStatusCode == SUCCESS; return mStatusCode == SUCCESS;
} }
public boolean isFailure() {
return mStatusCode == FAILURE; public boolean isForbidden() {
return mStatusCode == ERROR_FORBIDDEN;
} }
public boolean isFileNotFound() {
return mStatusCode == FILE_NOT_FOUND; public boolean isNotFound() {
return mStatusCode == ERROR_NOT_FOUND;
}
public boolean isWrongParameter() {
return mStatusCode == ERROR_WRONG_PARAMETER;
} }
/** /**
@ -197,6 +214,9 @@ public class ShareXMLParser {
} else if (name.equalsIgnoreCase(NODE_STATUS_CODE)) { } else if (name.equalsIgnoreCase(NODE_STATUS_CODE)) {
setStatusCode(Integer.parseInt(readNode(parser, NODE_STATUS_CODE))); setStatusCode(Integer.parseInt(readNode(parser, NODE_STATUS_CODE)));
} else if (name.equalsIgnoreCase(NODE_MESSAGE)) {
setMessage(readNode(parser, NODE_MESSAGE));
} else { } else {
skip(parser); skip(parser);
} }