package net.oschina.app.bean;
import java.io.IOException;
import java.io.InputStream;
import java.io.Serializable;
import java.util.ArrayList;
import java.util.List;
import net.oschina.app.AppException;
import net.oschina.app.common.StringUtils;
import org.xmlpull.v1.XmlPullParser;
import org.xmlpull.v1.XmlPullParserException;
import android.util.Xml;
/**
* 新闻实体类
* @author liux (http://my.oschina.net/liux)
* @version 1.0
* @created 2012-3-21
*/
public class News extends Entity{
public final static String NODE_ID = "id";
public final static String NODE_TITLE = "title";
public final static String NODE_URL = "url";
public final static String NODE_BODY = "body";
public final static String NODE_AUTHORID = "authorid";
public final static String NODE_AUTHOR = "author";
public final static String NODE_PUBDATE = "pubDate";
public final static String NODE_COMMENTCOUNT = "commentCount";
public final static String NODE_FAVORITE = "favorite";
public final static String NODE_START = "news";
public final static String NODE_SOFTWARELINK = "softwarelink";
public final static String NODE_SOFTWARENAME = "softwarename";
public final static String NODE_NEWSTYPE = "newstype";
public final static String NODE_TYPE = "type";
public final static String NODE_ATTACHMENT = "attachment";
public final static String NODE_AUTHORUID2 = "authoruid2";
public final static int NEWSTYPE_NEWS = 0x00;//0 新闻
public final static int NEWSTYPE_SOFTWARE = 0x01;//1 软件
public final static int NEWSTYPE_POST = 0x02;//2 帖子
public final static int NEWSTYPE_BLOG = 0x03;//3 博客
private String title;
private String url;
private String body;
private String author;
private int authorId;
private int commentCount;
private String pubDate;
private String softwareLink;
private String softwareName;
private int favorite;
private NewsType newType;
private List<Relative> relatives;
public News(){
this.newType = new NewsType();
this.relatives = new ArrayList<Relative>();
}
public class NewsType implements Serializable{
public int type;
public String attachment;
public int authoruid2;
}
public static class Relative implements Serializable{
public String title;
public String url;
}
public List<Relative> getRelatives() {
return relatives;
}
public void setRelatives(List<Relative> relatives) {
this.relatives = relatives;
}
public NewsType getNewType() {
return newType;
}
public void setNewType(NewsType newType) {
this.newType = newType;
}
public int getFavorite() {
return favorite;
}
public void setFavorite(int favorite) {
this.favorite = favorite;
}
public String getSoftwareLink() {
return softwareLink;
}
public void setSoftwareLink(String softwareLink) {
this.softwareLink = softwareLink;
}
public String getSoftwareName() {
return softwareName;
}
public void setSoftwareName(String softwareName) {
this.softwareName = softwareName;
}
public String getPubDate() {
return this.pubDate;
}
public void setPubDate(String pubDate) {
this.pubDate = pubDate;
}
public String getTitle() {
return title;
}
public void setTitle(String title) {
this.title = title;
}
public String getUrl() {
return url;
}
public void setUrl(String url) {
this.url = url;
}
public String getBody() {
return body;
}
public void setBody(String body) {
this.body = body;
}
public String getAuthor() {
return author;
}
public void setAuthor(String author) {
this.author = author;
}
public int getAuthorId() {
return authorId;
}
public void setAuthorId(int authorId) {
this.authorId = authorId;
}
public int getCommentCount() {
return commentCount;
}
public void setCommentCount(int commentCount) {
this.commentCount = commentCount;
}
public static News parse(InputStream inputStream) throws IOException, AppException {
News news = null;
Relative relative = null;
//获得XmlPullParser解析器
XmlPullParser xmlParser = Xml.newPullParser();
try {
xmlParser.setInput(inputStream, UTF8);
//获得解析到的事件类别,这里有开始文档,结束文档,开始标签,结束标签,文本等等事件。
int evtType=xmlParser.getEventType();
//一直循环,直到文档结束
while(evtType!=XmlPullParser.END_DOCUMENT){
String tag = xmlParser.getName();
switch(evtType){
case XmlPullParser.START_TAG:
if(tag.equalsIgnoreCase(NODE_START))
{
news = new News();
}
else if(news != null)
{
if(tag.equalsIgnoreCase(NODE_ID))
{
news.id = StringUtils.toInt(xmlParser.nextText(),0);
}
else if(tag.equalsIgnoreCase(NODE_TITLE))
{
news.setTitle(xmlParser.nextText());
}
else if(tag.equalsIgnoreCase(NODE_URL))
{
news.setUrl(xmlParser.nextText());
}
else if(tag.equalsIgnoreCase(NODE_BODY))
{
news.setBody(xmlParser.nextText());
}
else if(tag.equalsIgnoreCase(NODE_AUTHOR))
{
news.setAuthor(xmlParser.nextText());
}
else if(tag.equalsIgnoreCase(NODE_AUTHORID))
{
news.setAuthorId(StringUtils.toInt(xmlParser.nextText(),0));
}
else if(tag.equalsIgnoreCase(NODE_COMMENTCOUNT))
{
news.setCommentCount(StringUtils.toInt(xmlParser.nextText(),0));
}
else if(tag.equalsIgnoreCase(NODE_PUBDATE))
{
news.setPubDate(xmlParser.nextText());
}
else if(tag.equalsIgnoreCase(NODE_SOFTWARELINK))
{
news.setSoftwareLink(xmlParser.nextText());
}
else if(tag.equalsIgnoreCase(NODE_SOFTWARENAME))
{
news.setSoftwareName(xmlParser.nextText());
}
else if(tag.equalsIgnoreCase(NODE_FAVORITE))
{
news.setFavorite(StringUtils.toInt(xmlParser.nextText(),0));
}
else if(tag.equalsIgnoreCase(NODE_TYPE))
{
news.getNewType().type = StringUtils.toInt(xmlParser.nextText(),0);
}
else if(tag.equalsIgnoreCase(NODE_ATTACHMENT))
{
news.getNewType().attachment = xmlParser.nextText();
}
else if(tag.equalsIgnoreCase(NODE_AUTHORUID2))
{
news.getNewType().authoruid2 = StringUtils.toInt(xmlParser.nextText(),0);
}
else if(tag.equalsIgnoreCase("relative"))
{
relative = new Relative();
}
else if(relative != null)
{
if(tag.equalsIgnoreCase("rtitle"))
{
relative.title = xmlParser.nextText();
}
else if(tag.equalsIgnoreCase("rurl"))
{
relative.url = xmlParser.nextText();
}
}
//通知信息
else if(tag.equalsIgnoreCase("notice"))
{
news.setNotice(new Notice());
}
else if(news.getNotice() != null)
{
if(tag.equalsIgnoreCase("atmeCount"))
{
news.getNotice().setAtmeCount(StringUtils.toInt(xmlParser.nextText(),0));
}
else if(tag.equalsIgnoreCase("msgCount"))
{
news.getNotice().setMsgCount(StringUtils.toInt(xmlParser.nextText(),0));
}
else if(tag.equalsIgnoreCase("reviewCount"))
{
news.getNotice().setReviewCount(StringUtils.toInt(xmlParser.nextText(),0));
}
else if(tag.equalsIgnoreCase("newFansCount"))
{
news.getNotice().setNewFansCount(StringUtils.toInt(xmlParser.nextText(),0));
}
}
}
break;
case XmlPullParser.END_TAG:
//如果遇到标签结束,则把对象添加进集合中
if (tag.equalsIgnoreCase("relative") && news!=null && relative!=null) {
news.getRelatives().add(relative);
relative = null;
}
break;
}
//如果xml没有结束,则导航到下一个节点
evtType=xmlParser.next();
}
} catch (XmlPullParserException e) {
throw AppException.xml(e);
} finally {
inputStream.close();
}
return news;
}
}