blob: b64f76ad42f47d542d9e1ca830135c63988ef32a [file] [log] [blame]
// Copyright 2007 The Android Open Source Project
package com.google.wireless.gdata.spreadsheets.parser.xml;
import com.google.wireless.gdata.data.Entry;
import com.google.wireless.gdata.data.Feed;
import com.google.wireless.gdata.data.StringUtils;
import com.google.wireless.gdata.data.XmlUtils;
import com.google.wireless.gdata.parser.ParseException;
import com.google.wireless.gdata.parser.xml.XmlGDataParser;
import com.google.wireless.gdata.spreadsheets.data.CellEntry;
import com.google.wireless.gdata.spreadsheets.data.CellFeed;
import org.xmlpull.v1.XmlPullParser;
import org.xmlpull.v1.XmlPullParserException;
import java.io.IOException;
import java.io.InputStream;
/**
* Parser for non-Atom data in a GData Spreadsheets Cell-based feed.
*/
public class XmlCellsGDataParser extends XmlGDataParser {
/**
* The rel ID used by the server to identify the URLs for Cell POSTs
* (updates)
*/
private static final String CELL_FEED_POST_REL =
"http://schemas.google.com/g/2005#post";
/**
* Creates a new XmlCellsGDataParser.
*
* @param is the stream from which to read the data
* @param xmlParser the XMLPullParser to use for parsing the raw XML
* @throws ParseException if the super-class throws one
*/
public XmlCellsGDataParser(InputStream is, XmlPullParser xmlParser)
throws ParseException {
super(is, xmlParser);
}
/* (non-JavaDoc)
* Creates a new Entry that can handle the data parsed by this class.
*/
protected Entry createEntry() {
return new CellEntry();
}
/* (non-JavaDoc)
* Creates a new Feed that can handle the data parsed by this class.
*/
protected Feed createFeed() {
return new CellFeed();
}
/* (non-JavaDoc)
* Callback to handle non-Atom data present in an Atom entry tag.
*/
protected void handleExtraElementInEntry(Entry entry)
throws XmlPullParserException, IOException {
XmlPullParser parser = getParser();
if (!(entry instanceof CellEntry)) {
throw new IllegalArgumentException("Expected CellEntry!");
}
CellEntry row = (CellEntry) entry;
String name = parser.getName();
// cells can only have row, col, inputValue, & numericValue attrs
if ("cell".equals(name)) {
int count = parser.getAttributeCount();
String attrName = null;
for (int i = 0; i < count; ++i) {
attrName = parser.getAttributeName(i);
if ("row".equals(attrName)) {
row.setRow(StringUtils.parseInt(parser
.getAttributeValue(i), 0));
} else if ("col".equals(attrName)) {
row.setCol(StringUtils.parseInt(parser
.getAttributeValue(i), 0));
} else if ("numericValue".equals(attrName)) {
row.setNumericValue(parser.getAttributeValue(i));
} else if ("inputValue".equals(attrName)) {
row.setInputValue(parser.getAttributeValue(i));
}
}
// also need the data stored in the child text node
row.setValue(XmlUtils.extractChildText(parser));
}
}
/* (non-JavaDoc)
* Callback to handle non-Atom data in the feed.
*/
protected void handleExtraElementInFeed(Feed feed)
throws XmlPullParserException, IOException {
XmlPullParser parser = getParser();
if (!(feed instanceof CellFeed)) {
throw new IllegalArgumentException("Expected CellFeed!");
}
CellFeed cellFeed = (CellFeed) feed;
String name = parser.getName();
if (!"link".equals(name)) {
return;
}
int numAttrs = parser.getAttributeCount();
String rel = null;
String href = null;
String attrName = null;
for (int i = 0; i < numAttrs; ++i) {
attrName = parser.getAttributeName(i);
if ("rel".equals(attrName)) {
rel = parser.getAttributeValue(i);
} else if ("href".equals(attrName)) {
href = parser.getAttributeValue(i);
}
}
if (!(StringUtils.isEmpty(rel) || StringUtils.isEmpty(href))) {
if (CELL_FEED_POST_REL.equals(rel)) {
cellFeed.setEditUri(href);
}
}
}
}