blob: fc196b866c522ab89e8a2790242bd3c374c6c35b [file] [log] [blame]
/*******************************************************************************
* Copyright (c) 2005, 2006 Erkki Lindpere and others.
* All rights reserved. This program and the accompanying materials
* are made available under the terms of the Eclipse Public License v1.0
* which accompanies this distribution, and is available at
* http://www.eclipse.org/legal/epl-v10.html
*
* Contributors:
* Erkki Lindpere - initial API and implementation
*******************************************************************************/
package org.eclipse.ecf.internal.provider.vbulletin;
import java.io.IOException;
import java.net.MalformedURLException;
import java.net.URL;
import java.util.Date;
import java.util.List;
import java.util.regex.Matcher;
import java.util.regex.Pattern;
import org.apache.commons.httpclient.Header;
import org.apache.commons.httpclient.NameValuePair;
import org.eclipse.ecf.bulletinboard.BBException;
import org.eclipse.ecf.bulletinboard.IForum;
import org.eclipse.ecf.bulletinboard.IMember;
import org.eclipse.ecf.bulletinboard.IPoll;
import org.eclipse.ecf.bulletinboard.IThread;
import org.eclipse.ecf.bulletinboard.IThreadMessage;
import org.eclipse.ecf.bulletinboard.IllegalWriteException;
import org.eclipse.ecf.core.identity.ID;
import org.eclipse.ecf.core.identity.IDCreateException;
import org.eclipse.ecf.internal.bulletinboard.commons.webapp.PostRequest;
import org.eclipse.ecf.internal.provider.vbulletin.identity.ThreadID;
import org.eclipse.ecf.internal.provider.vbulletin.identity.ThreadMessageID;
import org.eclipse.ecf.internal.provider.vbulletin.internal.ThreadMessageFactory;
public class Thread extends VBObject implements IThread {
private static final String E_READ_ONLY = "This thread is read only.";
private ThreadID id;
protected Forum forum;
private IMember author;
// private ThreadMessage prePostMessage;
public ThreadMessageID lastReadMessageId;
public Thread() {
super(null, READ_WRITE);
// FIXME this.prePostMessage = new ThreadMessage();
// prePostMessage.setThread(this);
}
public Thread(ThreadID id, String name) {
super(name, READ_WRITE);
this.id = id;
}
public IPoll getPoll() {
return null;
}
public IForum getForum() {
return forum;
}
public List<IThreadMessage> getMessages() throws BBException {
return getNewMessages();
}
public List<IThreadMessage> getNewMessages() throws BBException {
ThreadBrowser2 browser = new ThreadBrowser2((VBulletin) bb, this);
List<IThreadMessage> msgs = browser.fetchNewMessages();
if (msgs.size() > 0) {
lastReadMessageId = (ThreadMessageID) msgs.get(msgs.size() - 1)
.getID();
for (IThreadMessage message : msgs) {
ThreadMessage msg = (ThreadMessage) message;
msg.setBulletinBoard(bb);
msg.thread = this;
IMember author = msg.author;
((Member) author).setBulletinBoard(bb);
}
}
return msgs;
}
public List<IThreadMessage> getNewMessages(ID lastReadId)
throws BBException {
if (lastReadId != null) {
lastReadMessageId = (ThreadMessageID) lastReadId;
}
return getNewMessages();
}
public URL getURL() {
try {
return new URL(bb.getURL(), "showthread.php?t=" + id.getLongValue());
} catch (MalformedURLException e) {
// FIXME log.error(e.getMessage(), e);
return null;
}
}
public ID getID() {
return id;
}
public int getType() {
return 0;
}
public IThreadMessage createReplyMessage() throws IllegalWriteException {
if ((mode & READ_ONLY) == READ_ONLY) {
throw new IllegalWriteException(E_READ_ONLY);
}
ThreadMessage msg = new ThreadMessage();
msg.setBulletinBoard(bb);
msg.setThread(this);
return msg;
}
public IThreadMessage createReplyMessage(IThreadMessage replyTo)
throws IllegalWriteException {
return null;
}
public ID postReply(IThreadMessage message) throws IllegalWriteException,
BBException {
if ((mode & READ_ONLY) == READ_ONLY) {
throw new IllegalWriteException(E_READ_ONLY);
}
ThreadMessage msg = (ThreadMessage) message;
// FIXME assert msg.bb == bb;
assert msg.getThread() == this;
PostRequest request = new PostRequest(bb.getHttpClient(), bb.getURL(),
"newreply.php");
NameValuePair[] params = new NameValuePair[] {
new NameValuePair("emailupdate", "9999"),
new NameValuePair("rating", "0") };
request.addParameters(params);
params = new NameValuePair[] {
new NameValuePair("title", message.getName()),
new NameValuePair("message", msg.getMessage()),
new NameValuePair("iconid", "0"), new NameValuePair("s", ""),
new NameValuePair("do", "postreply"),
new NameValuePair("t", String.valueOf(id.getLongValue())) };
request.addParameters(params);
if (message.getReplyTo() != null) {
params = new NameValuePair[] { new NameValuePair("p", String
.valueOf(((ThreadMessageID) message.getReplyTo().getID())
.getLongValue())) };
request.addParameters(params);
}
params = new NameValuePair[] { new NameValuePair("posthash", ""),
new NameValuePair("poststarttime", ""),
new NameValuePair("sbutton", "Submit Reply"),
new NameValuePair("parseurl", "1"),
// checkbox : disabled new NameValuePair("disablesmilies", "1"),
};
request.addParameters(params);
try {
request.execute();
// TODO: do we have to do this?
String resp = request.getResponseBodyAsString();
Header newLocation = request.getMethod().getResponseHeader(
"Location");
if (newLocation == null) {
throw ((VBParser) bb.getParser()).createVBException(
"The message was not posted.", resp);
}
Matcher m = Pattern.compile("showthread.php\\?p=([0-9]+)").matcher(
newLocation.getValue());
if (m.find()) {
synchronized (this) {
lastReadMessageId = (ThreadMessageID) new ThreadMessageFactory()
.createBBObjectId(bb.getNamespace(), bb.getURL(),
m.group(1));
return lastReadMessageId;
}
} else {
throw ((VBParser) bb.getParser()).createVBException(
"The message was not posted.", resp);
}
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (NumberFormatException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (IDCreateException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
return null;
}
public int getSubscriptionStatus() {
return -1;
}
public boolean updateSubscription(int newSubscriptionStatus)
throws BBException {
return false;
}
public IThreadMessage getPrePostMessage() throws IllegalWriteException {
// return prePostMessage;
return null;
}
@Override
public boolean equals(Object obj) {
if (obj instanceof Thread) {
Thread grp = (Thread) obj;
return id.equals(grp.id);
}
return false;
}
@Override
public int hashCode() {
return id.hashCode();
}
public IMember getAuthor() {
return author;
}
protected void setAuthor(IMember author) {
this.author = author;
}
public int getNumberOfMessages() {
// TODO Auto-generated method stub
return 0;
}
public Date getTimePosted() {
// TODO Auto-generated method stub
return null;
}
public Date getTimeUpdated() {
// TODO Auto-generated method stub
return null;
}
}