docs: public static <T extends HistogramDataPoint, K> Map<K, T> generateHistogramSkeleton(HistogramBean<T> rval, DateTime from, DateTime to,
              HistogramIntervalType interval, Class<T> dataType, Class<K> keyType) {
          Map<K, T> index = new HashMap<>();
  
          Calendar fromCal = from.toGregorianCalendar();
          Calendar toCal = to.toGregorianCalendar();
  
          switch(interval) {
              case day:
                  fromCal.set(Calendar.HOUR_OF_DAY, 0);
                  fromCal.set(Calendar.MINUTE, 0);
                  fromCal.set(Calendar.SECOND, 0);
                  fromCal.set(Calendar.MILLISECOND, 0);
                  break;
              case hour:
                  fromCal.set(Calendar.MINUTE, 0);
                  fromCal.set(Calendar.SECOND, 0);
                  fromCal.set(Calendar.MILLISECOND, 0);
                  break;
              case minute:
                  fromCal.set(Calendar.SECOND, 0);
                  fromCal.set(Calendar.MILLISECOND, 0);
                  break;
              case month:
                  fromCal.set(Calendar.DAY_OF_MONTH, 1);
                  fromCal.set(Calendar.HOUR_OF_DAY, 0);
                  fromCal.set(Calendar.MINUTE, 0);
                  fromCal.set(Calendar.SECOND, 0);
                  fromCal.set(Calendar.MILLISECOND, 0);
                  break;
              case week:
                  fromCal.set(Calendar.DAY_OF_WEEK, Calendar.SUNDAY);
                  fromCal.set(Calendar.HOUR_OF_DAY, 0);
                  fromCal.set(Calendar.MINUTE, 0);
                  fromCal.set(Calendar.SECOND, 0);
                  fromCal.set(Calendar.MILLISECOND, 0);
                  break;
              default:
                  break;
          }
  
          while (fromCal.before(toCal)) {
              String label = formatDateWithMillis(fromCal);
              T point;
              try {
                  point = dataType.newInstance();
              } catch (InstantiationException | IllegalAccessException e) {
                  throw new RuntimeException(e);
              }
              point.setLabel(label);
              rval.addDataPoint(point);
              if (keyType == String.class ) {
                  index.put((K) label, point);
              } else {
                  index.put((K) new Long(fromCal.getTimeInMillis()), point);
              }
              switch (interval) {
                  case day:
                      fromCal.add(Calendar.DAY_OF_YEAR, 1);
                      break;
                  case hour:
                      fromCal.add(Calendar.HOUR_OF_DAY, 1);
                      break;
                  case minute:
                      fromCal.add(Calendar.MINUTE, 1);
                      break;
                  case month:
                      fromCal.add(Calendar.MONTH, 1);
                      break;
                  case week:
                      fromCal.add(Calendar.WEEK_OF_YEAR, 1);
                      break;
                  default:
                      break;
              }
          }
  
          return index;
  
      }