blob: 250c1de3aae257165325b244ae0d6c37be09ced9 [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.util.ArrayList;
import java.util.HashMap;
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.IBBCredentials;
import org.eclipse.ecf.bulletinboard.IForum;
import org.eclipse.ecf.bulletinboard.IThread;
import org.eclipse.ecf.bulletinboard.IThreadMessage;
import org.eclipse.ecf.core.ContainerConnectException;
import org.eclipse.ecf.core.identity.ID;
import org.eclipse.ecf.internal.bulletinboard.commons.AbstractBulletinBoard;
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.vbulletin.container.VBContainer;
import org.eclipse.ecf.internal.provider.vbulletin.identity.MemberID;
import org.eclipse.ecf.internal.provider.vbulletin.identity.ThreadID;
import org.eclipse.ecf.internal.provider.vbulletin.internal.MemberFactory;
import org.eclipse.ecf.internal.provider.vbulletin.internal.VBCookies;
public class VBulletin extends AbstractBulletinBoard {
private String sessionId;
private String title;
private Map<ID, Forum> cachedForums;
public VBulletin(VBContainer mainContainer) {
super(mainContainer);
}
protected void reset() {
this.cachedForums = new HashMap<ID, Forum>();
super.reset();
}
public void postConnect() {
super.postConnect();
parser = new VBParser(namespace, url);
}
public void postDisconnect() {
parser = null;
super.postDisconnect();
}
/**
* @return Returns the sessionId.
*/
protected String getSessionId() {
return sessionId;
}
public String getTitle() throws BBException {
if (this.title == null) {
GetRequest request = new GetRequest(httpClient, url, "");
String resp = null;
try {
request.execute();
resp = request.getResponseBodyAsString();
} catch (IOException e) {
throw new BBException(e);
}
request.releaseConnection();
if (resp != null) {
this.title = getParser().parseTitle(resp);
}
}
return this.title;
}
public List<IForum> getForums() throws BBException {
if (cachedForums.isEmpty()) {
GetRequest request = new GetRequest(httpClient, url, "");
try {
request.execute();
String resp = request.getResponseBodyAsString();
request.releaseConnection();
cachedForums = getParser().parseForums(resp);
for (Forum forum : cachedForums.values()) {
forum.setBulletinBoard(this);
}
} catch (IOException e) {
// log.error(e);
}
}
return new ArrayList<IForum>(cachedForums.values());
}
public List<IForum> getTopLevelForums() throws BBException {
List<IForum> topForums = new ArrayList<IForum>();
for (IForum forum : getForums()) {
if (forum.getParentForum() == null) {
topForums.add(forum);
}
}
return topForums;
}
public IForum getForum(ID id) throws BBException {
if (cachedForums.isEmpty()) {
getForums();
}
return cachedForums.get(id);
}
public IThread getThread(ID id) throws BBException {
GetRequest request = new GetRequest(httpClient, url, "showthread.php");
request.addParameter(new NameValuePair("t", String
.valueOf(((ThreadID) id).getLongValue())));
String resp = null;
try {
request.execute();
resp = request.getResponseBodyAsString();
} catch (IOException e) {
e.printStackTrace();
}
request.releaseConnection();
if (resp != null) {
Thread t = getParser().parseThreadPageForThreadAttributes(resp);
t.setBulletinBoard(this);
return t;
}
return null;
}
public IThreadMessage getMessage(ID id) throws BBException {
// TODO Auto-generated method stub
return null;
}
@Override
protected WebRequest createMemberListRequest() {
return new GetRequest(httpClient, url, "memberlist.php");
}
@Override
protected WebRequest createMemberPageRequest(ID id) {
WebRequest request = new GetRequest(httpClient, url, "member.php");
NameValuePair params[] = { new NameValuePair("u", String
.valueOf(((MemberID) id).getLongValue())) };
request.setParameters(params);
return request;
}
public boolean login(IBBCredentials credentials) throws BBException {
PostRequest request = new PostRequest(httpClient, url, "login.php");
NameValuePair params[] = {
new NameValuePair("vb_login_username", credentials
.getUsername()),
new NameValuePair("cookieuser", "1"),
new NameValuePair("vb_login_password", credentials
.getPassword()), new NameValuePair("submit", "Login"),
new NameValuePair("s", ""), new NameValuePair("do", "login"),
new NameValuePair("forceredirect", "0"),
new NameValuePair("vb_login_md5password", ""),
new NameValuePair("vb_login_md5password_utf", "") };
request.setParameters(params);
try {
request.execute();
request.releaseConnection();
Map<String, String> detectedCookies = VBCookies
.detectCookies(httpClient.getState().getCookies());
if (detectedCookies.containsKey(VBCookies.KEY_SESS_ID)) {
// We have a session id
sessionId = detectedCookies.get(VBCookies.KEY_SESS_ID);
}
if (detectedCookies.containsKey(VBCookies.KEY_USER_ID)) {
// We have a user id
ID id = new MemberFactory().createBBObjectId(namespace, url,
(String) detectedCookies.get(VBCookies.KEY_USER_ID));
if (id == null) {
return false;
} else {
loggedInMemberId = id;
return true;
}
}
} catch (Exception e) {
throw new BBException(e);
}
return false;
}
public boolean logout() throws BBException {
PostRequest request = new PostRequest(httpClient, url, "logout.php");
try {
request.execute();
request.releaseConnection();
loggedInMemberId = null;
return true;
} catch (Exception e) {
throw new BBException(e);
}
}
public VBParser getParser() {
return (VBParser) parser;
}
@Override
protected WebRequest createMemberGroupListRequest() {
WebRequest request = new GetRequest(httpClient, url, "profile.php");
request.addParameter(new NameValuePair("do", "editusergroups"));
return request;
}
}