Package org.eclipse.ecf.internal.bulletinboard.commons

Source Code of org.eclipse.ecf.internal.bulletinboard.commons.AbstractBulletinBoard

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);
  }

}
TOP

Related Classes of org.eclipse.ecf.internal.bulletinboard.commons.AbstractBulletinBoard

TOP
Copyright © 2018 www.massapi.com. All rights reserved.
All source code are property of their respective owners. Java is a trademark of Sun Microsystems, Inc and owned by ORACLE Inc. Contact coftware#gmail.com.