package EDU.neu.ccs.demeter.tools.apstudio.graphedit;
import java.awt.*;
import java.io.*;
import java.util.*;
import EDU.neu.ccs.demeter.*;
import EDU.neu.ccs.demeter.common.tg.*;


import EDU.neu.ccs.demeter.*;
class HostSet {
  protected Hashtable exactHosts;
  public Hashtable get_exactHosts() { return exactHosts; }
  public void set_exactHosts(Hashtable new_exactHosts)
    { exactHosts = new_exactHosts; }
  protected Hashtable partnames;
  public Hashtable get_partnames() { return partnames; }
  public void set_partnames(Hashtable new_partnames)
    { partnames = new_partnames; }
  protected GlobSet globs;
  public GlobSet get_globs() { return globs; }
  public void set_globs(GlobSet new_globs)
    { globs = new_globs; }
  HostSet() { super(); }
  public HostSet(Hashtable exactHosts, Hashtable partnames, GlobSet globs) {
    super();
    set_exactHosts(exactHosts);
    set_partnames(partnames);
    set_globs(globs);
  }
  public static HostSet parse(java.io.InputStream in) throws ParseException
    { return new Parser(in)._HostSet(); }
  public static HostSet parse(String s) {
    try { return parse(new java.io.ByteArrayInputStream(s.getBytes())); }
    catch (ParseException e) { throw new RuntimeException(e.toString()); }
  }
  void add(Glob host) {
    if (host.isExact())
      addExactHost(host);
    else if (host.isPartNameGlob())
      addPartName(host.get_partname());
    else
      addGlob(host);
  }
  void addExactHost(Glob host) {
    if (exactHosts == null) exactHosts = new Hashtable();
    exactHosts.put(host, host);
  }
  void addPartName(PartName name) {
    if (partnames == null) partnames = new Hashtable();
    partnames.put(name, name);
  }
  void addGlob(Glob glob) {
    if (globs == null) globs = new GlobSet();
    globs.addElement(glob);
  }
  boolean contains(Glob glob) {
    if (exactHosts != null && exactHosts.get(glob) != null) return true;
    if (partnames != null && glob instanceof PartGlob &&
	partnames.get(glob.get_partname()) != null) return true;
    if (globs != null && globs.match(glob)) return true;
    return false;
  }
  void universal_trv0_bef(UniversalVisitor _v_) {
    _v_.before(this);
  }
  void universal_trv0_aft(UniversalVisitor _v_) {
    _v_.after(this);
  }
  void universal_trv0(UniversalVisitor _v_) {
    universal_trv0_bef(_v_);
    if (exactHosts != null) {
      _v_.before_exactHosts(this, exactHosts);
      _v_.after_exactHosts(this, exactHosts);
    }
    if (partnames != null) {
      _v_.before_partnames(this, partnames);
      _v_.after_partnames(this, partnames);
    }
    if (globs != null) {
      _v_.before_globs(this, globs);
    globs.universal_trv0(_v_);
      _v_.after_globs(this, globs);
    }
    universal_trv0_aft(_v_);
  }
}

