| package org.eclipse.ecf.internal.bulletinboard.commons; |
| |
| import java.io.IOException; |
| import java.net.MalformedURLException; |
| import java.net.URL; |
| import java.util.ArrayList; |
| import java.util.Collection; |
| import java.util.HashMap; |
| import java.util.HashSet; |
| import java.util.List; |
| import java.util.Map; |
| |
| import org.apache.commons.httpclient.HttpClient; |
| import org.apache.commons.httpclient.MultiThreadedHttpConnectionManager; |
| import org.eclipse.core.runtime.IAdapterManager; |
| import org.eclipse.ecf.bulletinboard.BBException; |
| import org.eclipse.ecf.bulletinboard.IBulletinBoardContainerAdapter; |
| import org.eclipse.ecf.bulletinboard.IMember; |
| import org.eclipse.ecf.bulletinboard.IMemberGroup; |
| import org.eclipse.ecf.core.identity.ID; |
| import org.eclipse.ecf.core.identity.Namespace; |
| import org.eclipse.ecf.internal.bulletinboard.commons.webapp.WebRequest; |
| |
| public abstract class AbstractBulletinBoard implements IBulletinBoardContainerAdapter { |
| |
| private final AbstractBBContainer mainContainer; |
| |
| protected AbstractParser parser; |
| |
| protected URL url; |
| |
| protected Namespace namespace; |
| |
| protected HttpClient httpClient; |
| |
| protected ID loggedInMemberId; |
| |
| protected Map<ID, IMember> cachedMembers; |
| |
| protected Map<ID, IMemberGroup> cachedMemberGroups; |
| |
| public AbstractBulletinBoard(AbstractBBContainer mainContainer) { |
| super(); |
| this.mainContainer = mainContainer; |
| this.namespace = mainContainer.getConnectNamespace(); |
| reset(); |
| } |
| |
| protected void reset() { |
| this.url = null; |
| this.cachedMembers = new HashMap<ID, IMember>(); |
| this.cachedMemberGroups = new HashMap<ID, IMemberGroup>(); |
| } |
| |
| public void postConnect() { |
| try { |
| this.url = new URL(getID().toExternalForm()); |
| final MultiThreadedHttpConnectionManager connectionManager = new MultiThreadedHttpConnectionManager(); |
| httpClient = new HttpClient(connectionManager); |
| } catch (final MalformedURLException e) { |
| // TODO Auto-generated catch block |
| e.printStackTrace(); |
| } |
| } |
| |
| public void postDisconnect() { |
| httpClient = null; |
| reset(); |
| } |
| |
| /** |
| * @return <code>true</code> if connected, <code>false</code> otherwise. |
| * @deprecated Connection status should be the business of the main |
| * container. |
| */ |
| public boolean isConnected() { |
| return getID() != null; |
| } |
| |
| /** |
| * @throws BBException |
| * @deprecated Connection status should be the business of the main |
| * container. |
| */ |
| public void close() throws BBException { |
| if (isConnected()) { |
| mainContainer.disconnect(); |
| } else { |
| throw new BBException("Connection already closed."); |
| } |
| } |
| |
| public ID getID() { |
| return mainContainer.getConnectedID(); |
| } |
| |
| public Object getAdapter(Class adapter) { |
| final IAdapterManager adapterManager = Activator.getDefault().getAdapterManager(); |
| if (adapterManager == null) |
| return null; |
| return adapterManager.getAdapter(this, adapter); |
| } |
| |
| public URL getURL() { |
| return url; |
| } |
| |
| public Namespace getNamespace() { |
| return namespace; |
| } |
| |
| public HttpClient getHttpClient() { |
| return httpClient; |
| } |
| |
| public AbstractParser getParser() { |
| return parser; |
| } |
| |
| protected abstract WebRequest createMemberPageRequest(ID id); |
| |
| public IMember getMember(ID id) throws BBException { |
| if (cachedMembers.containsKey(id)) { |
| return cachedMembers.get(id); |
| } else { |
| final WebRequest request = createMemberPageRequest(id); |
| |
| try { |
| request.execute(); |
| final String str = request.getResponseBodyAsString(); |
| request.releaseConnection(); |
| final IMember member = parser.parseMemberPageForName(str, id); |
| if (member != null) { |
| ((AbstractBBObject) member).setBulletinBoard(this); |
| cachedMembers.put(member.getID(), member); |
| return member; |
| } |
| } catch (final Exception e) { |
| e.printStackTrace(); |
| } |
| return null; |
| } |
| } |
| |
| public IMember getLoggedInMember() throws BBException { |
| if (loggedInMemberId == null) { |
| return null; |
| } |
| return getMember(loggedInMemberId); |
| } |
| |
| protected abstract WebRequest createMemberListRequest(); |
| |
| public List<IMember> getMembers() throws BBException { |
| // TODO: this only returns first page |
| if (cachedMembers.isEmpty()) { |
| final WebRequest request = createMemberListRequest(); |
| try { |
| request.execute(); |
| final String str = request.getResponseBodyAsString(); |
| request.releaseConnection(); |
| cachedMembers = parser.parseMembers(str); |
| for (final IMember member : cachedMembers.values()) { |
| ((AbstractBBObject) member).setBulletinBoard(this); |
| } |
| } catch (final IOException e) { |
| e.printStackTrace(); |
| } |
| } |
| return new ArrayList<IMember>(cachedMembers.values()); |
| } |
| |
| protected abstract WebRequest createMemberGroupListRequest(); |
| |
| public Collection<IMemberGroup> getMemberGroups() throws BBException { |
| if (cachedMemberGroups.isEmpty()) { |
| final WebRequest request = createMemberGroupListRequest(); |
| try { |
| request.execute(); |
| final String str = request.getResponseBodyAsString(); |
| request.releaseConnection(); |
| cachedMemberGroups = parser.parseMemberGroups(str); |
| for (final IMemberGroup grp : cachedMemberGroups.values()) { |
| ((AbstractBBObject) grp).setBulletinBoard(this); |
| } |
| } catch (final IOException e) { |
| // log.error(e); |
| } |
| } |
| return new HashSet<IMemberGroup>(cachedMemberGroups.values()); |
| } |
| |
| public IMemberGroup getMemberGroup(ID id) throws BBException { |
| if (cachedMemberGroups.isEmpty()) { |
| getMemberGroups(); |
| } |
| return cachedMemberGroups.get(id); |
| } |
| |
| } |