All Downloads are FREE. Search and download functionalities are using the official Maven repository.

fit.decorator.util.DataType Maven / Gradle / Ivy

package fit.decorator.util;

import java.text.ParseException;
import java.text.SimpleDateFormat;
import java.util.Calendar;
import java.util.Date;
import java.util.GregorianCalendar;
import java.util.HashMap;
import java.util.Map;

import fit.decorator.exceptions.InvalidInputException;

public abstract class DataType {
  private static final String STRING_TYPE = "string";
  private static final String DOUBLE_TYPE = "double";
  private static final String INTEGER_TYPE = "integer";
  private static final String INT_TYPE = "int";
  private static final String DATE_TYPE = "date";

  protected static final DataType INTEGER = new DataType() {
    @Override
    protected Object valueOf(String value) throws Exception {
      return Integer.valueOf(value);
    }

    @Override
    protected String addTo(String originalValue, Object value, int numberofTime) {
      int intValue = ((Integer) value).intValue() * numberofTime;
      return String.valueOf(Integer.parseInt(originalValue) + intValue);
    }

    @Override
    public String toString() {
      return "DataType = '" + INT_TYPE + "'";
    }
  };

  protected static final DataType DOUBLE = new DataType() {
    @Override
    protected Object valueOf(String value) throws Exception {
      return Double.valueOf(value);
    }

    @Override
    protected String addTo(String originalValue, Object value, int numberofTime) {
      double doubleValue = ((Double) value).doubleValue() * numberofTime;
      double results = Double.parseDouble(originalValue) + doubleValue;
      return String.valueOf(new Double(results).floatValue());
    }

    @Override
    public String toString() {
      return "DataType = '" + DOUBLE_TYPE + "'";
    }
  };

  protected static final DataType STRING = new DataType() {
    @Override
    protected Object valueOf(String value) throws Exception {
      return value;
    }

    @Override
    protected String addTo(String originalValue, Object value, int numberofTime) {
      return originalValue + multiply(value.toString(), numberofTime);
    }

    private String multiply(String value, int numberofTime) {
      StringBuilder result = new StringBuilder();
      for (int i = 0; i < numberofTime; ++i) {
        result.append(value);
      }
      return result.toString();
    }

    @Override
    public String toString() {
      return "DataType = '" + STRING_TYPE + "'";
    }
  };

  protected static final DataType DATE = new DataType() {
    private SimpleDateFormat dateFormat = new SimpleDateFormat("MM/dd/yyyy");

    @Override
    protected String addTo(String originalValue, Object value, int numberofTime) {
      GregorianCalendar gc = new GregorianCalendar();
      Date originalDate;
      try {
        originalDate = dateFormat.parse(originalValue);
        gc.setTime(originalDate);
      } catch (ParseException e) {
        // print stack trace and continue
        e.printStackTrace();
      }
      int totalNnumberOfDaysToAdd = ((Integer) value).intValue() * numberofTime;
      gc.add(Calendar.DAY_OF_YEAR, totalNnumberOfDaysToAdd);
      return dateFormat.format(gc.getTime());
    }

    @Override
    protected Object valueOf(String value) throws Exception {
      return Integer.valueOf(value);
    }

    @Override
    public String toString() {
      return "DataType = '" + DATE_TYPE + "'";
    }
  };

  private static final Map predefinedTypes = new HashMap<>();
  private static final Map userDefinedTypes = new HashMap<>();

  static {
    predefinedTypes.put(INT_TYPE, INTEGER);
    predefinedTypes.put(INTEGER_TYPE, INTEGER);
    predefinedTypes.put(DOUBLE_TYPE, DOUBLE);
    predefinedTypes.put(STRING_TYPE, STRING);
    predefinedTypes.put(DATE_TYPE, DATE);
  }

  public Object parse(String value) throws InvalidInputException {
    try {
      return valueOf(value);
    } catch (Exception e) {
      throw new InvalidInputException("value '" + value + "' is not a valid " + toString());
    }
  }

  protected abstract String addTo(String originalValue, Object value, int numberofTime);

  protected abstract Object valueOf(String value) throws Exception;

  static DataType instance(String dataType) throws InvalidInputException {
    Object type = getDataType(dataType, predefinedTypes);
    if (type == null) {
      type = getDataType(dataType, userDefinedTypes);
      type = defaultToStringTypeIfNull(type);
    }
    return (DataType) type;
  }

  private static Object defaultToStringTypeIfNull(Object type) {
    if (type == null)
      type = STRING;
    return type;
  }

  private static Object getDataType(String dataType, Map types) {
    return types.get(dataType.toLowerCase());
  }

  public static void registerUserDefinedDataTypes(String key, DataType dataType) {
    userDefinedTypes.put(key.toLowerCase(), dataType);
  }

  public static void clearUserDefinedDataTypes(String key) {
    userDefinedTypes.remove(key.toLowerCase());
  }

  public static void clearUserDefinedDataTypes() {
    userDefinedTypes.clear();
  }

}




© 2015 - 2024 Weber Informatics LLC | Privacy Policy