mirror of
				https://github.com/owncloud/android-library.git
				synced 2025-10-31 02:17:41 +00:00 
			
		
		
		
	OC-2677: Add GetSharesForFilesRemoteOperation. Add XMLParser
This commit is contained in:
		
							parent
							
								
									cc71eeaa21
								
							
						
					
					
						commit
						781e738347
					
				| @ -30,7 +30,6 @@ import java.util.ArrayList; | |||||||
| 
 | 
 | ||||||
| import org.apache.commons.httpclient.NameValuePair; | import org.apache.commons.httpclient.NameValuePair; | ||||||
| import org.apache.commons.httpclient.methods.GetMethod; | import org.apache.commons.httpclient.methods.GetMethod; | ||||||
| import org.apache.commons.httpclient.methods.PostMethod; |  | ||||||
| import org.apache.http.HttpStatus; | import org.apache.http.HttpStatus; | ||||||
| 
 | 
 | ||||||
| import android.util.Log; | import android.util.Log; | ||||||
|  | |||||||
| @ -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<OCShare> 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<OCShare> readOCS (XmlPullParser parser) throws XmlPullParserException, IOException { | ||||||
|  | 		ArrayList<OCShare> shares = new ArrayList<OCShare>(); | ||||||
|  | 		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<OCShare> readData(XmlPullParser parser) throws XmlPullParserException, IOException { | ||||||
|  | 		ArrayList<OCShare> shares = new ArrayList<OCShare>(); | ||||||
|  | 
 | ||||||
|  | 		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; | ||||||
|  | 			} | ||||||
|  | 		} | ||||||
|  | 	} | ||||||
|  | } | ||||||
		Loading…
	
	
			
			x
			
			
		
	
		Reference in New Issue
	
	Block a user