mirror of
				https://github.com/owncloud/android-library.git
				synced 2025-10-30 01:48:14 +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.methods.GetMethod; | ||||
| import org.apache.commons.httpclient.methods.PostMethod; | ||||
| import org.apache.http.HttpStatus; | ||||
| 
 | ||||
| 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