package com.marinilli.b2.c12;

import java.util.*;

/**
 * Chapter 12 - A VErsionString implementation
 *
 * A set of three possible types:
 * <ul>
 *   <li><code>VersionId</code></li>
 *   <li><code>PlusVersion</code></li>
 *   <li><code>StarVersion</code></li>
 * </ul>
 *
 * @author Mauro Marinilli
 * @version 1.0
 */
public class VersionString extends Versionable{
  private ArrayList versionables;

  /**
   * the Constructor
   */
  public VersionString(String s) {
    versionables = new ArrayList();
    if(s != null) {
      StringTokenizer stringtokenizer = new StringTokenizer(s, " ", false);
      for(; stringtokenizer.hasMoreElements();)
        addVersionable( createVersionable(stringtokenizer.nextToken()) );
    }
  }

  /**
   * Implements the superclass method
   */
  public boolean match(Versionable v) {
    return false;
  }

  /**
   * Adds a new Versionable (but not a VersionString itself!) to the
   * Version string.
   */
  public boolean addVersionable(Versionable v){
    if (v instanceof VersionString)
      return false;//it is not possible to have versionStrings containing other VersionStrings!
    return versionables.add(v);
  }

  /**
   * Returns a human-readable representation of the versionString
   */
  public String toString() {
    StringBuffer stringbuffer = new StringBuffer();
    for(int i= 0; i< versionables.size(); i++) {
      stringbuffer.append(versionables.get(i).toString());
      stringbuffer.append(' ');
    }
    return stringbuffer.toString();
  }


  /**
   * return true if the given VersionId is contained
   */
  public boolean contains(VersionId vid) {
    Iterator iter = versionables.iterator();
    while (iter.hasNext()) {
      Versionable item = (Versionable)iter.next();
      if (vid.match(item))
        return true;
    }
    return false;
  }

}