From 781e738347a87c2b24144e03f7fe8fe32603f2f3 Mon Sep 17 00:00:00 2001 From: masensio Date: Sat, 1 Feb 2014 14:32:20 +0100 Subject: [PATCH] OC-2677: Add GetSharesForFilesRemoteOperation. Add XMLParser --- .../GetSharesForFileRemoteOperation.java | 1 - .../lib/utils/GetSharesForFileXMLParser.java | 353 ++++++++++++++++++ 2 files changed, 353 insertions(+), 1 deletion(-) create mode 100644 src/com/owncloud/android/lib/utils/GetSharesForFileXMLParser.java diff --git a/src/com/owncloud/android/lib/operations/remote/GetSharesForFileRemoteOperation.java b/src/com/owncloud/android/lib/operations/remote/GetSharesForFileRemoteOperation.java index 89423a48..07c2fea9 100644 --- a/src/com/owncloud/android/lib/operations/remote/GetSharesForFileRemoteOperation.java +++ b/src/com/owncloud/android/lib/operations/remote/GetSharesForFileRemoteOperation.java @@ -30,7 +30,6 @@ import java.util.ArrayList; import org.apache.commons.httpclient.NameValuePair; import org.apache.commons.httpclient.methods.GetMethod; -import org.apache.commons.httpclient.methods.PostMethod; import org.apache.http.HttpStatus; import android.util.Log; diff --git a/src/com/owncloud/android/lib/utils/GetSharesForFileXMLParser.java b/src/com/owncloud/android/lib/utils/GetSharesForFileXMLParser.java new file mode 100644 index 00000000..3ad8b1b5 --- /dev/null +++ b/src/com/owncloud/android/lib/utils/GetSharesForFileXMLParser.java @@ -0,0 +1,353 @@ +/* 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.lib.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.lib.operations.common.OCShare; +import com.owncloud.android.lib.operations.common.ShareType; + +/** + * Parser for Share API Response: GetSharesForFile Operation + * @author masensio + * + */ +public class GetSharesForFileXMLParser { + + private static final String TAG = GetSharesForFileXMLParser.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 GetSharesForFileXMLParser() { + // TODO Auto-generated constructor stub + } + + /** + * Parse is as response of Share API + * @param is + * @return List of ShareRemoteFiles + * @throws XmlPullParserException + * @throws IOException + */ + public ArrayList 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 readOCS (XmlPullParser parser) throws XmlPullParserException, IOException { + ArrayList shares = new ArrayList(); + 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)) { + shares = readData(parser); + } else { + skip(parser); + } + + } + return shares; + + } + + /** + * 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 readData(XmlPullParser parser) throws XmlPullParserException, IOException { + ArrayList shares = new ArrayList(); + + 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)) { + shares.add(readElement(parser)); + } else { + skip(parser); + + } + } + + return shares; + + } + + + /** + * Parse Element node + * @param parser + * @return + * @throws XmlPullParserException + * @throws IOException + */ + private OCShare readElement(XmlPullParser parser) throws XmlPullParserException, IOException { + parser.require(XmlPullParser.START_TAG, ns, NODE_ELEMENT); + + OCShare share = new OCShare(); + + 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_ELEMENT)) { + share = readElement(parser); + + } else if (name.equalsIgnoreCase(NODE_ID)) { + share.setIdRemoteShared(Integer.parseInt(readNode(parser, NODE_ID))); + + } else if (name.equalsIgnoreCase(NODE_ITEM_TYPE)) { + share.setIsDirectory(readNode(parser, NODE_ITEM_TYPE).equalsIgnoreCase(TYPE_FOLDER)); + + } else if (name.equalsIgnoreCase(NODE_ITEM_SOURCE)) { + share.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)); + share.setShareType(ShareType.fromValue(value)); + + } else if (name.equalsIgnoreCase(NODE_SHARE_WITH)) { + share.setShareWith(readNode(parser, NODE_SHARE_WITH)); + + } else if (name.equalsIgnoreCase(NODE_FILE_SOURCE)) { + share.setFileSource(Long.parseLong(readNode(parser, NODE_FILE_SOURCE))); + + } else if (name.equalsIgnoreCase(NODE_PATH)) { + share.setPath(readNode(parser, NODE_PATH)); + + } else if (name.equalsIgnoreCase(NODE_PERMISSIONS)) { + share.setPermissions(Integer.parseInt(readNode(parser, NODE_PERMISSIONS))); + + } else if (name.equalsIgnoreCase(NODE_STIME)) { + share.setSharedDate(Long.parseLong(readNode(parser, NODE_STIME))); + + } else if (name.equalsIgnoreCase(NODE_EXPIRATION)) { + String value = readNode(parser, NODE_EXPIRATION); + if (!value.isEmpty()) { + share.setExpirationDate(Long.parseLong(readNode(parser, NODE_EXPIRATION))); // check if expiration is in long format or date format + } + + } else if (name.equalsIgnoreCase(NODE_TOKEN)) { + share.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)) { + share.setSharedWithDisplayName(readNode(parser, NODE_SHARE_WITH_DISPLAY_NAME)); + + } else { + skip(parser); + } + } + + return share; + } + + /** + * 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; + } + } + } +}