// Copyright 2007 The Android Open Source Project
package com.google.wireless.gdata.spreadsheets.parser.xml;
import com.google.wireless.gdata.client.GDataParserFactory;
import com.google.wireless.gdata.data.Entry;
import com.google.wireless.gdata.parser.GDataParser;
import com.google.wireless.gdata.parser.ParseException;
import com.google.wireless.gdata.parser.xml.XmlParserFactory;
import com.google.wireless.gdata.serializer.GDataSerializer;
import com.google.wireless.gdata.spreadsheets.data.CellEntry;
import com.google.wireless.gdata.spreadsheets.data.ListEntry;
import com.google.wireless.gdata.spreadsheets.data.SpreadsheetEntry;
import com.google.wireless.gdata.spreadsheets.data.WorksheetEntry;
import com.google.wireless.gdata.spreadsheets.serializer.xml.XmlCellEntryGDataSerializer;
import com.google.wireless.gdata.spreadsheets.serializer.xml.XmlListEntryGDataSerializer;
import org.xmlpull.v1.XmlPullParser;
import org.xmlpull.v1.XmlPullParserException;
import java.io.InputStream;
/**
* A GDataParserFactory capable of handling Spreadsheets.
*/
public class XmlSpreadsheetsGDataParserFactory implements GDataParserFactory {
/*
* @see GDataParserFactory
*/
public XmlSpreadsheetsGDataParserFactory(XmlParserFactory xmlFactory) {
this.xmlFactory = xmlFactory;
}
/** Intentionally private. */
private XmlSpreadsheetsGDataParserFactory() {
}
/*
* Creates a parser for the indicated feed, assuming the default feed type.
* The default type is specified on {@link SpreadsheetsClient#DEFAULT_FEED}.
*
* @param is The stream containing the feed to be parsed.
* @return A GDataParser capable of parsing the feed as the default type.
* @throws ParseException if the feed could not be parsed for any reason
*/
public GDataParser createParser(InputStream is) throws ParseException {
// attempt a default
return createParser(SpreadsheetEntry.class, is);
}
/*
* Creates a parser of the indicated type for the indicated feed.
*
* @param feedType The type of the feed; must be one of the constants on
* {@link SpreadsheetsClient}.
* @return A parser capable of parsing the feed as the indicated type.
* @throws ParseException if the feed could not be parsed for any reason
*/
public GDataParser createParser(Class entryClass, InputStream is)
throws ParseException {
try {
XmlPullParser xmlParser = xmlFactory.createParser();
if (entryClass == SpreadsheetEntry.class) {
return new XmlSpreadsheetsGDataParser(is, xmlParser);
} else if (entryClass == WorksheetEntry.class) {
return new XmlWorksheetsGDataParser(is, xmlParser);
} else if (entryClass == CellEntry.class) {
return new XmlCellsGDataParser(is, xmlParser);
} else if (entryClass == ListEntry.class) {
return new XmlListGDataParser(is, xmlParser);
} else {
throw new ParseException("Unrecognized feed requested.");
}
} catch (XmlPullParserException e) {
throw new ParseException("Failed to create parser", e);
}
}
/*
* Creates a serializer capable of handling the indicated entry.
*
* @param The Entry to be serialized to an XML string.
* @return A GDataSerializer capable of handling the indicated entry.
* @throws IllegalArgumentException if Entry is not a supported type (which
* currently includes only {@link ListEntry} and {@link CellEntry}.)
*/
public GDataSerializer createSerializer(Entry entry) {
if (entry instanceof ListEntry) {
return new XmlListEntryGDataSerializer(xmlFactory, entry);
} else if (entry instanceof CellEntry) {
return new XmlCellEntryGDataSerializer(xmlFactory, entry);
} else {
throw new IllegalArgumentException(
"Expected a ListEntry or CellEntry");
}
}
/** The XmlParserFactory to use to actually process XML streams. */
private XmlParserFactory xmlFactory;
}
|