| /******************************************************************************* |
| * 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.phpbb; |
| |
| import java.io.IOException; |
| import java.util.Date; |
| import java.util.List; |
| import java.util.regex.Matcher; |
| import java.util.regex.Pattern; |
| |
| 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.AbstractBulletinBoard; |
| import org.eclipse.ecf.internal.bulletinboard.commons.webapp.PostRequest; |
| import org.eclipse.ecf.internal.provider.phpbb.identity.ThreadID; |
| import org.eclipse.ecf.internal.provider.phpbb.identity.ThreadMessageID; |
| |
| public class Thread extends PHPBBObject implements IThread { |
| // private static final Logger log = Logger.getLogger(Thread.class); |
| |
| private static final String E_READ_ONLY = "This thread is read only."; |
| |
| private ThreadID id; |
| |
| protected Forum forum; |
| |
| private ThreadMessage prePostMessage; |
| |
| private IMember author; |
| |
| public ThreadMessageID lastReadMessageId; |
| |
| public Thread() { |
| super(null, READ_WRITE); |
| 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 { |
| // TODO Auto-generated method stub |
| return getNewMessages(); |
| } |
| |
| public List<IThreadMessage> getNewMessages() throws BBException { |
| ThreadBrowser2 browser = new ThreadBrowser2((AbstractBulletinBoard) 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 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 { |
| ThreadMessage msg = (ThreadMessage) createReplyMessage(); |
| msg.setReplyTo(replyTo); |
| return msg; |
| } |
| |
| 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(), |
| "posting.php"); |
| NameValuePair[] params = new NameValuePair[] { |
| new NameValuePair("subject", msg.getName()), |
| new NameValuePair("message", msg.getMessage()), |
| new NameValuePair("t", String.valueOf(id.getLongValue())), |
| new NameValuePair("mode", "reply"), |
| // checkbox : disabled new NameValuePair("disable_smilies", |
| // "on"), |
| // checkbox : disabled new NameValuePair("disable_bbcode", |
| // "on"), |
| // checkbox : disabled new NameValuePair("notify", "on"), |
| new NameValuePair("post", "Submit") }; |
| request.addParameters(params); |
| String resp = null; |
| try { |
| request.execute(); |
| resp = request.getResponseBodyAsString(); |
| String info = ((PHPBBParser) bb.getParser()) |
| .parseInformationMessage(resp); |
| Matcher m = Pattern.compile( |
| "<a href=\"viewtopic.php\\?p=([0-9]+)(?:.*?)\">").matcher( |
| info); |
| if (m.find()) { |
| synchronized (this) { |
| try { |
| lastReadMessageId = (ThreadMessageID) new ThreadMessageFactory() |
| .createBBObjectId(bb.getNamespace(), bb |
| .getURL(), m.group(1)); |
| return lastReadMessageId; |
| } catch (NumberFormatException e) { |
| // TODO Auto-generated catch block |
| e.printStackTrace(); |
| } catch (IDCreateException e) { |
| // TODO Auto-generated catch block |
| e.printStackTrace(); |
| } |
| } |
| } else { |
| throw new BBException("The message was not posted."); |
| } |
| } catch (IOException 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; |
| } |
| |
| @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; |
| } |
| |
| } |