package org.testng.internal.annotations;

import org.testng.collections.Lists;
import org.testng.internal.ClassHelper;
import org.testng.internal.Utils;

import java.util.List;
import java.util.StringTokenizer;

/**
 * Convert a string values into primitive types.
 *
 * Created on Dec 20, 2005
 * @author cbeust
 */
public class Converter {

  public static boolean  getBoolean(String tagValue, boolean def) {
    boolean result = def;
    if (tagValue != null) {
      result = Boolean.valueOf(tagValue);
    }
    return result;
  }

  public static int getInt(String tagValue, int def) {
    int result = def;
    if (tagValue != null) {
      result = Integer.parseInt(tagValue);
    }
    return result;
  }

  public static String getString(String tagValue, String def) {
    String result = def;
    if (tagValue != null) {
      result = tagValue;
    }
    return result;
  }

  public static long getLong(String tagValue, long def) {
    long result = def;
    if (tagValue != null) {
      result = Long.parseLong(tagValue);
    }
    return result;
  }

  public static String[] getStringArray(String tagValue, String[] def) {
    String[] result = def;
    if (tagValue != null) {
      result = Utils.stringToArray(tagValue);
    }

    return result;
  }

  public static Class[] getClassArray(String tagValue, Class[] def) {
    Class[] result = def;
    List vResult = Lists.newArrayList();
    if (tagValue != null) {
      StringTokenizer st = new StringTokenizer(tagValue, " ,");
      while (st.hasMoreElements()) {
        String className = (String) st.nextElement();
        try {
          Class cls = Class.forName(className);
          vResult.add(cls);
        }
        catch (ClassNotFoundException e) {
          e.printStackTrace();
        }
      }
      result = (Class[]) vResult.toArray(new Class[vResult.size()]);
    }

    return result;
  }

  public static Class getClass(String namedParameter) {
    Class result = null;
    if (namedParameter != null) {
      result = ClassHelper.forName(namedParameter);
    }

    return result;
  }

}
