package com.owncloud.android.oc_framework.operations.remote;
+import java.io.ByteArrayInputStream;
import java.io.IOException;
+import java.io.InputStream;
import java.util.ArrayList;
import org.apache.commons.httpclient.HttpException;
import org.apache.commons.httpclient.methods.GetMethod;
import org.apache.http.HttpStatus;
+import org.xmlpull.v1.XmlPullParserException;
import android.util.Log;
import com.owncloud.android.oc_framework.network.webdav.WebdavClient;
import com.owncloud.android.oc_framework.operations.RemoteOperation;
import com.owncloud.android.oc_framework.operations.RemoteOperationResult;
+import com.owncloud.android.oc_framework.operations.RemoteOperationResult.ResultCode;
import com.owncloud.android.oc_framework.operations.ShareRemoteFile;
+import com.owncloud.android.oc_framework.utils.ShareXMLParser;
/**
* Get the data from the server to know shared files/folders
private static final String TAG = GetRemoteSharedFilesOperation.class.getSimpleName();
// OCS Route
- private static final String SHAREAPI_ROUTE ="/ocs/v1.php/apps/files/files_sharing/api/v1/shares";
+ private static final String SHAREAPI_ROUTE ="/ocs/v1.php/apps/files_sharing/api/v1/shares";
private ArrayList<ShareRemoteFile> mSharedFiles; // List of files for result
- public GetRemoteSharedFilesOperation() {
- // TODO Auto-generated constructor stub
+ private String mUrlServer;
+
+ public ArrayList<ShareRemoteFile> getSharedFiles() {
+ return mSharedFiles;
+ }
+
+ public GetRemoteSharedFilesOperation(String urlServer) {
+ mUrlServer = urlServer;
}
@Override
RemoteOperationResult result = null;
int status = -1;
- // Get Method
- GetMethod get = new GetMethod(client.getBaseUri() + SHAREAPI_ROUTE);
- Log.d(TAG, "URL ------> " + client.getBaseUri() + SHAREAPI_ROUTE);
+ // Get Method
+ GetMethod get = new GetMethod(mUrlServer + SHAREAPI_ROUTE);
+ Log.d(TAG, "URL ------> " + mUrlServer + SHAREAPI_ROUTE);
// Get the response
try{
Log.d(TAG, "Obtain RESPONSE");
String response = get.getResponseBodyAsString();
Log.d(TAG, response);
+
+ // Parse xml response --> obtain the response in ShareFiles ArrayList
+ // convert String into InputStream
+ InputStream is = new ByteArrayInputStream(response.getBytes());
+ ShareXMLParser xmlParser = new ShareXMLParser();
+ mSharedFiles = xmlParser.parseXMLResponse(is);
+ if (mSharedFiles != null) {
+ Log.d(TAG, "Shared Files: " + mSharedFiles.size());
+ result = new RemoteOperationResult(ResultCode.OK);
+ }
}
} catch (HttpException e) {
result = new RemoteOperationResult(e);
} catch (IOException e) {
result = new RemoteOperationResult(e);
e.printStackTrace();
+ } catch (XmlPullParserException e) {
+ result = new RemoteOperationResult(e);
+ e.printStackTrace();
} finally {
get.releaseConnection();
}
private boolean isSuccess(int status) {
return (status == HttpStatus.SC_OK);
}
+
+
}
--- /dev/null
+/* ownCloud Android Library is available under MIT license
+ * Copyright (C) 2014 ownCloud (http://www.owncloud.org/)
+ *
+ * Permission is hereby granted, free of charge, to any person obtaining a copy
+ * of this software and associated documentation files (the "Software"), to deal
+ * in the Software without restriction, including without limitation the rights
+ * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
+ * copies of the Software, and to permit persons to whom the Software is
+ * furnished to do so, subject to the following conditions:
+ *
+ * The above copyright notice and this permission notice shall be included in
+ * all copies or substantial portions of the Software.
+ *
+ * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
+ * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
+ * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
+ * NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS
+ * BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN
+ * ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN
+ * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
+ * THE SOFTWARE.
+ *
+ */
+
+package com.owncloud.android.oc_framework.utils;
+
+import java.io.IOException;
+import java.io.InputStream;
+import java.util.ArrayList;
+
+import org.xmlpull.v1.XmlPullParser;
+import org.xmlpull.v1.XmlPullParserException;
+import org.xmlpull.v1.XmlPullParserFactory;
+
+import android.util.Log;
+import android.util.Xml;
+
+import com.owncloud.android.oc_framework.operations.ShareRemoteFile;
+import com.owncloud.android.oc_framework.operations.ShareType;
+
+/**
+ * Parser for Share API Response
+ * @author masensio
+ *
+ */
+
+public class ShareXMLParser {
+
+ private static final String TAG = ShareXMLParser.class.getSimpleName();
+
+ // No namespaces
+ private static final String ns = null;
+
+ // NODES for XML Parser
+ private static final String NODE_OCS = "ocs";
+
+ private static final String NODE_META = "meta";
+ private static final String NODE_STATUS = "status";
+ private static final String NODE_STATUS_CODE = "statuscode";
+ //private static final String NODE_MESSAGE = "message";
+
+ private static final String NODE_DATA = "data";
+ private static final String NODE_ELEMENT = "element";
+ //private static final String NODE_ID = "id";
+ private static final String NODE_ITEM_TYPE = "item_type";
+ private static final String NODE_ITEM_SOURCE = "item_source";
+ private static final String NODE_PARENT = "parent";
+ private static final String NODE_SHARE_TYPE = "share_type";
+ private static final String NODE_SHARE_WITH = "share_with";
+ private static final String NODE_FILE_SOURCE = "file_source";
+ private static final String NODE_PATH = "path";
+ private static final String NODE_PERMISSIONS = "permissions";
+ private static final String NODE_STIME = "stime";
+ private static final String NODE_EXPIRATION = "expiration";
+ private static final String NODE_TOKEN = "token";
+ private static final String NODE_STORAGE = "storage";
+ private static final String NODE_MAIL_SEND = "mail_send";
+ private static final String NODE_SHARE_WITH_DISPLAY_NAME = "share_with_display_name";
+
+ private static final String TYPE_FOLDER = "folder";
+
+ private String mStatus;
+ private int mStatusCode;
+
+ // Getters and Setters
+ public String getStatus() {
+ return mStatus;
+ }
+
+ public void setStatus(String status) {
+ this.mStatus = status;
+ }
+
+ public int getStatusCode() {
+ return mStatusCode;
+ }
+
+ public void setStatusCode(int statusCode) {
+ this.mStatusCode = statusCode;
+ }
+
+ // Constructor
+ public ShareXMLParser() {
+
+ }
+
+ /**
+ * Parse is as response of Share API
+ * @param is
+ * @return List of ShareRemoteFiles
+ * @throws XmlPullParserException
+ * @throws IOException
+ */
+ public ArrayList<ShareRemoteFile> parseXMLResponse(InputStream is) throws XmlPullParserException, IOException {
+
+ try {
+ // XMLPullParser
+ XmlPullParserFactory factory = XmlPullParserFactory.newInstance();
+ factory.setNamespaceAware(true);
+
+ XmlPullParser parser = Xml.newPullParser();
+ parser.setFeature(XmlPullParser.FEATURE_PROCESS_NAMESPACES, false);
+ parser.setInput(is, null);
+ parser.nextTag();
+ return readOCS(parser);
+
+ } finally {
+ is.close();
+ }
+ }
+
+ /**
+ * Parse OCS node
+ * @param parser
+ * @return List of ShareRemoteFiles
+ * @throws XmlPullParserException
+ * @throws IOException
+ */
+ private ArrayList<ShareRemoteFile> readOCS (XmlPullParser parser) throws XmlPullParserException, IOException {
+ ArrayList<ShareRemoteFile> sharedFiles = new ArrayList<ShareRemoteFile>();
+ parser.require(XmlPullParser.START_TAG, ns , NODE_OCS);
+ while (parser.next() != XmlPullParser.END_TAG) {
+ if (parser.getEventType() != XmlPullParser.START_TAG) {
+ continue;
+ }
+ String name = parser.getName();
+ // read NODE_META and NODE_DATA
+ if (name.equalsIgnoreCase(NODE_META)) {
+ readMeta(parser);
+ } else if (name.equalsIgnoreCase(NODE_DATA)) {
+ sharedFiles = readData(parser);
+ } else {
+ skip(parser);
+ }
+
+ }
+ return sharedFiles;
+
+
+ }
+
+ /**
+ * Parse Meta node
+ * @param parser
+ * @throws XmlPullParserException
+ * @throws IOException
+ */
+ private void readMeta(XmlPullParser parser) throws XmlPullParserException, IOException {
+ parser.require(XmlPullParser.START_TAG, ns, NODE_META);
+ Log.d(TAG, "---- NODE META ---");
+ while (parser.next() != XmlPullParser.END_TAG) {
+ if (parser.getEventType() != XmlPullParser.START_TAG) {
+ continue;
+ }
+ String name = parser.getName();
+
+ if (name.equalsIgnoreCase(NODE_STATUS)) {
+ setStatus(readNode(parser, NODE_STATUS));
+
+ } else if (name.equalsIgnoreCase(NODE_STATUS_CODE)) {
+ setStatusCode(Integer.parseInt(readNode(parser, NODE_STATUS_CODE)));
+
+ } else {
+ skip(parser);
+ }
+
+ }
+ }
+
+ /**
+ * Parse Data node
+ * @param parser
+ * @return
+ * @throws XmlPullParserException
+ * @throws IOException
+ */
+ private ArrayList<ShareRemoteFile> readData(XmlPullParser parser) throws XmlPullParserException, IOException {
+ ArrayList<ShareRemoteFile> sharedFiles = new ArrayList<ShareRemoteFile>();
+
+ parser.require(XmlPullParser.START_TAG, ns, NODE_DATA);
+ Log.d(TAG, "---- NODE DATA ---");
+ while (parser.next() != XmlPullParser.END_TAG) {
+ if (parser.getEventType() != XmlPullParser.START_TAG) {
+ continue;
+ }
+ String name = parser.getName();
+ if (name.equalsIgnoreCase(NODE_ELEMENT)) {
+ sharedFiles.add(readElement(parser));
+ } else {
+ skip(parser);
+ }
+ }
+
+ return sharedFiles;
+
+ }
+
+ /**
+ * Parse Element node
+ * @param parser
+ * @return
+ * @throws XmlPullParserException
+ * @throws IOException
+ */
+ private ShareRemoteFile readElement(XmlPullParser parser) throws XmlPullParserException, IOException {
+ parser.require(XmlPullParser.START_TAG, ns, NODE_ELEMENT);
+
+ ShareRemoteFile sharedFile = new ShareRemoteFile();
+
+ Log.d(TAG, "---- NODE ELEMENT ---");
+ while (parser.next() != XmlPullParser.END_TAG) {
+ if (parser.getEventType() != XmlPullParser.START_TAG) {
+ continue;
+ }
+
+ String name = parser.getName();
+
+ if (name.equalsIgnoreCase(NODE_ITEM_TYPE)) {
+ sharedFile.setIsDirectory(readNode(parser, NODE_ITEM_TYPE).equalsIgnoreCase(TYPE_FOLDER));
+
+ } else if (name.equalsIgnoreCase(NODE_ITEM_SOURCE)) {
+ sharedFile.setItemSource(Long.parseLong(readNode(parser, NODE_ITEM_SOURCE)));
+
+ } else if (name.equalsIgnoreCase(NODE_PARENT)) {
+ readNode(parser, NODE_PARENT);
+
+ } else if (name.equalsIgnoreCase(NODE_SHARE_TYPE)) {
+ int value = Integer.parseInt(readNode(parser, NODE_SHARE_TYPE));
+ sharedFile.setShareType(ShareType.fromValue(value));
+
+ } else if (name.equalsIgnoreCase(NODE_SHARE_WITH)) {
+ sharedFile.setShareWith(readNode(parser, NODE_SHARE_WITH));
+
+ } else if (name.equalsIgnoreCase(NODE_FILE_SOURCE)) {
+ sharedFile.setFileSource(Long.parseLong(readNode(parser, NODE_FILE_SOURCE)));
+
+ } else if (name.equalsIgnoreCase(NODE_PATH)) {
+ sharedFile.setPath(readNode(parser, NODE_PATH));
+
+ } else if (name.equalsIgnoreCase(NODE_PERMISSIONS)) {
+ sharedFile.setPermissions(Integer.parseInt(readNode(parser, NODE_PERMISSIONS)));
+
+ } else if (name.equalsIgnoreCase(NODE_STIME)) {
+ sharedFile.setSharedDate(Long.parseLong(readNode(parser, NODE_STIME)));
+
+ } else if (name.equalsIgnoreCase(NODE_EXPIRATION)) {
+ String value = readNode(parser, NODE_EXPIRATION);
+ if (!value.isEmpty()) {
+ sharedFile.setExpirationDate(Long.parseLong(readNode(parser, NODE_EXPIRATION))); // check if expiration is in long format or date format
+ }
+
+ } else if (name.equalsIgnoreCase(NODE_TOKEN)) {
+ sharedFile.setToken(readNode(parser, NODE_TOKEN));
+
+ } else if (name.equalsIgnoreCase(NODE_STORAGE)) {
+ readNode(parser, NODE_STORAGE);
+ } else if (name.equalsIgnoreCase(NODE_MAIL_SEND)) {
+ readNode(parser, NODE_MAIL_SEND);
+
+ } else if (name.equalsIgnoreCase(NODE_SHARE_WITH_DISPLAY_NAME)) {
+ sharedFile.setSharedWithDisplayName(readNode(parser, NODE_SHARE_WITH_DISPLAY_NAME));
+
+ } else {
+ skip(parser);
+ }
+ }
+
+ return sharedFile;
+ }
+
+ /**
+ * Parse a node, to obtain its text. Needs readText method
+ * @param parser
+ * @param node
+ * @return Text of the node
+ * @throws XmlPullParserException
+ * @throws IOException
+ */
+ private String readNode (XmlPullParser parser, String node) throws XmlPullParserException, IOException{
+ parser.require(XmlPullParser.START_TAG, ns, node);
+ String value = readText(parser);
+ Log.d(TAG, "node= " + node + ", value= " + value);
+ parser.require(XmlPullParser.END_TAG, ns, node);
+ return value;
+ }
+
+ /**
+ * Read the text from a node
+ * @param parser
+ * @return Text of the node
+ * @throws IOException
+ * @throws XmlPullParserException
+ */
+ private String readText(XmlPullParser parser) throws IOException, XmlPullParserException {
+ String result = "";
+ if (parser.next() == XmlPullParser.TEXT) {
+ result = parser.getText();
+ parser.nextTag();
+ }
+ return result;
+ }
+
+ /**
+ * Skip tags in parser procedure
+ * @param parser
+ * @throws XmlPullParserException
+ * @throws IOException
+ */
+ private void skip(XmlPullParser parser) throws XmlPullParserException, IOException {
+ if (parser.getEventType() != XmlPullParser.START_TAG) {
+ throw new IllegalStateException();
+ }
+ int depth = 1;
+ while (depth != 0) {
+ switch (parser.next()) {
+ case XmlPullParser.END_TAG:
+ depth--;
+ break;
+ case XmlPullParser.START_TAG:
+ depth++;
+ break;
+ }
+ }
+ }
+}