It generates a list of dates from the given start date and end date for every month for the given week number(1st/2nd/3rd/4th week of the month) and for the given day (Sun,Mon,Tue ...Sat) 
For example
Start date = 1/1/2012
end date = 31/3/2012
frequency = 1 (1st/2nd/3rd/4th week of the month)
day = monday (Sunday to saturday)
Output is
---------
2/1/2012
6/2/2012
5/3/2012
For example
Start date = 1/1/2012
end date = 31/3/2012
frequency = 1 (1st/2nd/3rd/4th week of the month)
day = monday (Sunday to saturday)
Output is
---------
2/1/2012
6/2/2012
5/3/2012
private List<Object> generateRepEveryDates(Cx cx, RepetitiveGroupInfo repetitiveGroupInfo) throws AppException {
//RepetitiveGroupInfo is a bean and it has the attributes of Start date, end date, day, frequency,
  List<Object> repList = new ArrayList<Object>();
  Calendar calendar = Calendar.getInstance();
                                         //Get a start date
  Date repStartDate = repetitiveGroupInfo.getStartDate();
                                          
                                          //Set a end date
  Date repEndDate = repetitiveGroupInfo.getEndDate();
//Keep startdate as temp date to be constant
  Date tempDate = repStartDate;
//Its a day of week(Monday/Tuesday... Sunday)
  int repFreqDaysValue = repetitiveGroupInfo.getDay().getId().intValue();
//Frequency is 1st/2nd/3rd/4th week of the month
  int freqEveryValue = repetitiveGroupInfo.getFrequencyEvery().intValue();
  tempDate = calculateDate(repFreqDaysValue, tempDate);
//calculating first date of repetitive date. it must ne greater than start date
  tempDate = DateTool.add(tempDate, 7 * (freqEveryValue - 1), TimeUnit.DAY);
  if (Val.isAfterOrEqual(tempDate, repStartDate)) {
   repList.add(tempDate);
  }
//calculating from second date of repetitive date till the end date
  while (Val.isAfterOrEqual(repEndDate, tempDate)) {
   tempDate = DateTool.add(tempDate, 1, TimeUnit.MONTH);
   tempDate = calculateDate(repFreqDaysValue, tempDate);
   calendar.setTime(tempDate);
   int currentMonth = calendar.get(Calendar.MONTH);
   tempDate = DateTool.add(tempDate, 7 * (freqEveryValue - 1), TimeUnit.DAY);
   int afterAddedWeeks = calendar.get(Calendar.MONTH);
// checking whether last calsulated repetitive date is before the end date
   if (Val.isAfterOrEqual(repEndDate, tempDate)) {
    if (currentMonth == afterAddedWeeks) {
     repList.add(tempDate);
    }
   }
  }
  return repList;
 }
 private Date calculateDate(int repFreqDaysValue, Date currentDate) throws AppException {
  int index = 0;
  Date calcDate = currentDate;
  Calendar calendarObj = Calendar.getInstance();
  calendarObj.setTime(calcDate);
  calendarObj.set(Calendar.DATE, 1);
  calcDate = calendarObj.getTime();
  index = calendarObj.get(Calendar.DAY_OF_WEEK);
  index = index - 1;
  if (index > repFreqDaysValue) {
   index = (7 - index) + repFreqDaysValue;
   calcDate = DateTool.add(calcDate, index, TimeUnit.DAY);
  } else if (index < repFreqDaysValue) {
   index = repFreqDaysValue - index;
   calcDate = DateTool.add(calcDate, index, TimeUnit.DAY);
  }
  return calcDate;
 }