public static Recur createFromExtraString(String extra) {
   if (Utils.isEmpty(extra)) {
     return new NoRecur();
   }
   String[] a = extra.split(",");
   RecurInterval interval = RecurInterval.valueOf(a[0]);
   HashMap<String, String> values = toMap(a);
   switch (interval) {
     case NO_RECUR:
       return new NoRecur(values);
     case EVERY_X_DAY:
       return new EveryXDay(values);
     case DAILY:
       return new Daily(values);
     case WEEKLY:
       return new Weekly(values);
     case SEMI_MONTHLY:
       return new SemiMonthly(values);
     case MONTHLY:
       return new Monthly(values);
     case YEARLY:
       return new Yearly(values);
   }
   return null;
 }
 @Override
 public String toString() {
   StringBuilder sb = new StringBuilder();
   sb.append(interval.name()).append(",");
   sb.append("startDate=").append(startDate).append(",");
   sb.append("period=").append(period.name()).append(",");
   sb.append("periodParam=").append(periodParam).append(",");
   toString(sb);
   return sb.toString();
 }
 @Override
 public Period[] repeat(RecurInterval interval, long startDate, long periodParam) {
   LinkedList<Period> periods = new LinkedList<Period>();
   while (periodParam-- > 0) {
     Period p = interval.next(startDate);
     startDate = p.end + 1;
     periods.add(p);
   }
   return periods.toArray(new Period[periods.size()]);
 }