blob: 246f7915a81daaa98737c8f585b3d9754ae31b7c [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.phpbb;
import java.io.IOException;
import java.net.URISyntaxException;
import java.net.URL;
import java.util.ArrayList;
import java.util.Collection;
import java.util.HashSet;
import java.util.List;
import java.util.Map;
import org.apache.commons.httpclient.NameValuePair;
import org.eclipse.ecf.bulletinboard.BBException;
import org.eclipse.ecf.bulletinboard.IForum;
import org.eclipse.ecf.bulletinboard.IThread;
import org.eclipse.ecf.bulletinboard.IllegalWriteException;
import org.eclipse.ecf.core.identity.ID;
import org.eclipse.ecf.internal.bulletinboard.commons.AbstractBBObject;
import org.eclipse.ecf.internal.bulletinboard.commons.webapp.GetRequest;
import org.eclipse.ecf.internal.bulletinboard.commons.webapp.PostRequest;
import org.eclipse.ecf.internal.bulletinboard.commons.webapp.WebRequest;
import org.eclipse.ecf.internal.provider.phpbb.identity.ForumID;
public class Forum extends PHPBBObject implements IForum {
private static final String E_READ_ONLY = "This forum is read only.";
private Category parent;
protected ArrayList<IForum> subforums;
private String description;
protected ForumID id;
public Forum(ForumID id, String name) {
super(name, READ_WRITE);
this.id = id;
this.parent = null;
this.subforums = new ArrayList<IForum>();
}
public ID getID() {
return id;
}
protected void setParent(Category cat) {
this.parent = cat;
}
protected void setDescription(String description) {
this.description = description;
}
public String getDescription() {
return description;
}
public int getType() {
return IForum.HOLDS_THREADS;
}
public IForum getParentForum() {
return parent;
}
public List<IForum> getSubForums() {
return subforums;
}
public Collection<IThread> getThreads() {
PHPBBParser parser = (PHPBBParser) bb.getParser();
Map<ID, IThread> threadMap = null;
try {
WebRequest request = new GetRequest(bb.getHttpClient(), new URL(id
.toExternalForm()), "");
request.addParameter(new NameValuePair("f", String.valueOf(id
.getLongValue())));
request.execute();
String resp = request.getResponseBodyAsString();
request.releaseConnection();
threadMap = parser.parseThreads(resp);
for (IThread thread : threadMap.values()) {
((AbstractBBObject) thread).setBulletinBoard(bb);
((Thread) thread).forum = this;
}
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
return new HashSet<IThread>(threadMap.values());
}
public IThread createThread() throws IllegalWriteException, BBException {
if ((mode & READ_ONLY) == READ_ONLY) {
throw new IllegalWriteException(E_READ_ONLY);
}
Thread thread = new Thread();
thread.setBulletinBoard(bb);
thread.forum = this;
return thread;
}
public boolean postThread(IThread thread) throws IllegalWriteException,
BBException {
if ((mode & READ_ONLY) == READ_ONLY) {
throw new IllegalWriteException(E_READ_ONLY);
}
WebRequest request = new PostRequest(bb.getHttpClient(), bb.getURL(),
"posting.php");
NameValuePair params[];
params = new NameValuePair[] {
new NameValuePair("subject", thread.getPrePostMessage()
.getName()),
new NameValuePair("message", thread.getPrePostMessage()
.getMessage()),
new NameValuePair("f", String.valueOf(id.getLongValue())),
new NameValuePair("mode", "newtopic"),
// 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);
// We seem to always have to get the response body.
try {
request.execute();
request.getResponseBodyAsString();
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
request.releaseConnection();
return true;
}
@Override
public boolean equals(Object obj) {
if (obj instanceof Forum) {
Forum grp = (Forum) obj;
return id.equals(grp.id);
}
return false;
}
@Override
public int hashCode() {
return id.hashCode();
}
}