package de.kamelstall.modsde.xml;
import org.apache.http.HttpResponse;
import org.xml.sax.Attributes;
import android.sax.Element;
import android.sax.EndElementListener;
import android.sax.EndTextElementListener;
import android.sax.RootElement;
import android.sax.StartElementListener;
import android.util.Xml;
import android.util.Xml.Encoding;
import de.kamelstall.modsde.comm.MdeStatus;
import de.kamelstall.modsde.xml.model.BBThread;
import de.kamelstall.modsde.xml.model.Post;
import de.kamelstall.modsde.xml.model.User;
public class ThreadParser {
public static String url(Integer threadID, Integer page) {
return MdeStatus.URL_THREAD + threadID + ((page > 1) ? "&page=" + page : "");
}
public BBThread parse(HttpResponse response) {
final BBThread thread = new BBThread();
final Post currentPost = new Post();
final User currentUser = new User();
RootElement root = new RootElement(BBThread.TAG);
root.setStartElementListener(new StartElementListener() {
@Override
public void start(Attributes attributes) {
thread.reset();
thread.id = Integer.parseInt(attributes.getValue(BBThread.A_ID));
}
});
root.getChild("title").setEndTextElementListener(new EndTextElementListener() {
@Override
public void end(String body) {
thread.title = body;
}
});
root.getChild("subtitle").setEndTextElementListener(new EndTextElementListener() {
@Override
public void end(String body) {
thread.subtitle = body;
}
});
root.getChild("number-of-replies").setStartElementListener(new StartElementListener() {
@Override
public void start(Attributes attributes) {
thread.numReplies = Integer.parseInt(attributes.getValue("value"));
}
});
root.getChild("number-of-hits").setStartElementListener(new StartElementListener() {
@Override
public void start(Attributes attributes) {
thread.numReplies = Integer.parseInt(attributes.getValue("value"));
}
});
Element flags = root.getChild(BBThread.FLAGS);
flags.getChild(BBThread.IS_CLOSED).setStartElementListener(new StartElementListener() {
@Override
public void start(Attributes attributes) {
thread.isClosed = "1".equals(attributes.getValue(BBThread.FLAGS_VALUE));
}
});
flags.getChild(BBThread.IS_STICKY).setStartElementListener(new StartElementListener() {
@Override
public void start(Attributes attributes) {
thread.isSticky = "1".equals(attributes.getValue(BBThread.FLAGS_VALUE));
}
});
flags.getChild(BBThread.IS_IMPORTANT).setStartElementListener(new StartElementListener() {
@Override
public void start(Attributes attributes) {
thread.isImportant = "1".equals(attributes.getValue(BBThread.FLAGS_VALUE));
}
});
flags.getChild(BBThread.IS_ANNOUNCEMENT).setStartElementListener(new StartElementListener() {
@Override
public void start(Attributes attributes) {
thread.isAnnouncement = "1".equals(attributes.getValue(BBThread.FLAGS_VALUE));
}
});
flags.getChild(BBThread.IS_GLOBAL).setStartElementListener(new StartElementListener() {
@Override
public void start(Attributes attributes) {
thread.isGlobal = "1".equals(attributes.getValue(BBThread.FLAGS_VALUE));
}
});
root.getChild(BBThread.INBOARD).setStartElementListener(new StartElementListener() {
@Override
public void start(Attributes attributes) {
thread.inBoard = Integer.parseInt(attributes.getValue(BBThread.A_ID));
}
});
root.getChild("posts").setStartElementListener(new StartElementListener() {
@Override
public void start(Attributes attributes) {
thread.page = Integer.parseInt(attributes.getValue(BBThread.A_PAGE));
thread.offset = Integer.parseInt(attributes.getValue(BBThread.A_OFFSET));
thread.count = Integer.parseInt(attributes.getValue(BBThread.A_COUNT));
}
});
Element post = root.getChild("posts").getChild("post");
post.setStartElementListener(new StartElementListener() {
@Override
public void start(Attributes attributes) {
currentPost.reset();
currentPost.PID = Integer.parseInt(attributes.getValue("id"));
}
});
post.setEndElementListener(new EndElementListener() {
@Override
public void end() {
thread.posts.add(currentPost.copy());
}
});
Element user = post.getChild("user");
user.setStartElementListener(new StartElementListener() {
@Override
public void start(Attributes attributes) {
currentUser.reset();
currentUser.id = Integer.parseInt(attributes.getValue("id"));
currentUser.groupID = Integer.parseInt(attributes.getValue("group-id"));
}
});
user.setEndTextElementListener(new EndTextElementListener() {
@Override
public void end(String body) {
currentUser.name = body;
currentPost.user = currentUser.copy();
}
});
post.getChild("date").setStartElementListener(new StartElementListener() {
@Override
public void start(Attributes attributes) {
currentPost.timestamp = Integer.parseInt(attributes.getValue("timestamp"));
}
});
Element message = post.getChild("message");
message.getChild("edited").setStartElementListener(new StartElementListener() {
@Override
public void start(Attributes attributes) {
currentPost.messageEditCount = Integer.parseInt(attributes.getValue("count"));
}
});
Element lastEditUser = message.getChild("edited").getChild("lastedit").getChild("user");
lastEditUser.setStartElementListener(new StartElementListener() {
@Override
public void start(Attributes attributes) {
currentUser.reset();
currentUser.id = Integer.parseInt(attributes.getValue("id"));
}
});
lastEditUser.setEndTextElementListener(new EndTextElementListener() {
@Override
public void end(String body) {
currentUser.name = body;
currentPost.lastEditUser = currentUser.copy();
}
});
message.getChild("content").setEndTextElementListener(new EndTextElementListener() {
@Override
public void end(String body) {
currentPost.messageContent = body;
}
});
message.getChild("title").setEndTextElementListener(new EndTextElementListener() {
@Override
public void end(String body) {
currentPost.messageTitle = body;
}
});
post.getChild("avatar").setStartElementListener(new StartElementListener() {
@Override
public void start(Attributes attributes) {
currentPost.avatarId = Integer.parseInt(attributes.getValue("id"));
}
});
post.getChild("avatar").setEndTextElementListener(new EndTextElementListener() {
@Override
public void end(String body) {
currentPost.avatarFileName = body;
}
});
post.getChild("in-thread").setStartElementListener(new StartElementListener() {
@Override
public void start(Attributes attributes) {
currentPost.TID = Integer.parseInt(attributes.getValue("id"));
}
});
post.getChild("in-thread").setEndTextElementListener(new EndTextElementListener() {
@Override
public void end(String body) {
currentPost.threadName = body;
}
});
post.getChild("in-board").setStartElementListener(new StartElementListener() {
@Override
public void start(Attributes attributes) {
currentPost.BID = Integer.parseInt(attributes.getValue("id"));
}
});
try {
Encoding encoding = null;
if (response.getEntity().getContentEncoding() != null) {
encoding = Encoding.valueOf(response.getEntity().getContentEncoding().getValue());
}
if (encoding == null) {
encoding = Xml.Encoding.UTF_8;
}
Xml.parse(response.getEntity().getContent(), encoding, root.getContentHandler());
response.getEntity().consumeContent();
} catch (Exception e) {
throw new RuntimeException(e);
}
return thread;
}
}
|