package com.marinilli.b2.c12;

/**
 * Chapter 12 - abstract class for all the kinds of Version objects
 *
 * @author Mauro Marinilli
 * @version 1.0
 */

public abstract class Versionable {

  /**
   * Factory method for <code>Versionable</code> types
   *
   * Depending on the string passed in creates the appropriate type, among:
   * <code>VersionId</code><br>
   * <code>StarVersion</code><br>
   * <code>PlusVersion</code><br>
   * <code>VersionString</code><br>
   *
   */
  public static Versionable createVersionable(String vers) {
    if (vers==null)
      return new UnspecifiedVersion();
    if (vers.indexOf(' ')!=-1)
      return new VersionString(vers);
    if (vers.indexOf('+')!=-1)
      return new PlusVersion(vers);
    if (vers.indexOf('*')!=-1)
      return new StarVersion(vers);
    if ((VersionId.isNumber(vers)) || (vers.indexOf(VersionId.DOT_CHAR)!=-1))
      return new VersionId(vers);

    return new UnspecifiedVersion();//in all other cases
  }

  /**
   * Factory method for VersionId types
   */
  public static VersionId createVersionId(String vers) {
    if (vers==null)
      return new UnspecifiedVersion();
    Versionable v = createVersionable(vers);
    if (v instanceof VersionId)
      return (VersionId)v;
    return new UnspecifiedVersion();
  }

  /**
   * exact match
   */
  public abstract boolean match(Versionable v);

}