package com.taobao.top.analysis.statistics.map; import java.text.ParseException; import java.util.Calendar; import java.util.Date; import org.apache.commons.lang.math.NumberUtils; import com.taobao.top.analysis.node.job.JobTask; import com.taobao.top.analysis.statistics.data.ReportEntry; import com.taobao.top.analysis.util.ThreadLocalVar; /** * 时间类型的MapClass实现 * * @author fangweng * @Email fangweng@taobao.com * 2011-11-26 * */ public class TimeMapper extends TimeKeyMapper { /** * */ private static final long serialVersionUID = 971861884374324170L; @Override protected Object generateValue(ReportEntry entry, Object[] contents, JobTask jobtask) { Calendar calendar = Calendar.getInstance(); long timestamp = 0; String timeContent = contents[Integer.valueOf(entry .getKeys()[0]) - 1].toString(); if(NumberUtils.isNumber(timeContent) && !timeContent.contains(":")) { timestamp = Long.valueOf(timeContent); } else { try { if(timeContent.contains(".")) { timeContent = timeContent.substring(0, timeContent.indexOf(".")); } timestamp = ThreadLocalVar.getDateFormat().parse(timeContent).getTime(); } catch (ParseException e) { if(!threshold.sholdBlock()) { logger.error("content is " + timeContent, e); } } } calendar.setTime(new Date(timestamp)); if (entry.getMapParams() != null && !entry.getMapParams().equals("")) { if (entry.getMapParams().startsWith("minute")) { // 可定制化 int interval = 0; int minute = calendar.get(Calendar.MINUTE); if (!entry.getMapParams().equals("minute")) interval = Integer.valueOf(entry.getMapParams() .substring("minute:".length())); if (interval > 0) { int _timeCounter = 0; while (minute >= _timeCounter) { _timeCounter += interval; } minute = _timeCounter; if (minute == 60) { minute = 0; calendar.add(Calendar.HOUR, 1); } } int hour = calendar.get(Calendar.HOUR_OF_DAY); String hourStr; if (hour < 10) hourStr = new StringBuilder().append("0").append(hour) .toString(); else hourStr = String.valueOf(hour); if (minute < 10) return new StringBuilder() .append(calendar.get(Calendar.YEAR)).append("-") .append(calendar.get(Calendar.MONTH) + 1) .append("-") .append(calendar.get(Calendar.DAY_OF_MONTH)) .append(" ").append(hourStr).append(":0") .append(minute).toString(); else return new StringBuilder() .append(calendar.get(Calendar.YEAR)).append("-") .append(calendar.get(Calendar.MONTH) + 1) .append("-") .append(calendar.get(Calendar.DAY_OF_MONTH)) .append(" ").append(hourStr).append(":") .append(minute).toString(); } else if (entry.getReduceParams().startsWith("Lminute")) { // 可定制化 int interval = 0; int minute = calendar.get(Calendar.MINUTE); if (!entry.getReduceParams().equals("Lminute")) interval = Integer.valueOf(entry.getReduceParams() .substring("Lminute:".length())); if (interval > 0) { int _timeCounter = 0; while (minute >= _timeCounter) { _timeCounter += interval; } minute = _timeCounter; if (minute == 60) { minute = 0; calendar.add(Calendar.HOUR, 1); } } calendar.set(Calendar.MINUTE, minute); calendar.set(Calendar.SECOND, 0); calendar.set(Calendar.MILLISECOND, 0); return String.valueOf(calendar.getTimeInMillis()); } else { int day = calendar.get(Calendar.DAY_OF_MONTH); if (day < 10) return new StringBuilder() .append(calendar.get(Calendar.YEAR)).append("-") .append(calendar.get(Calendar.MONTH) + 1) .append("-0") .append(calendar.get(Calendar.DAY_OF_MONTH)) .toString(); else return new StringBuilder() .append(calendar.get(Calendar.YEAR)).append("-") .append(calendar.get(Calendar.MONTH) + 1) .append("-") .append(calendar.get(Calendar.DAY_OF_MONTH)) .toString(); } } else { int hour = calendar.get(Calendar.HOUR_OF_DAY); if (hour < 10) return new StringBuilder().append(calendar.get(Calendar.YEAR)) .append("-").append(calendar.get(Calendar.MONTH) + 1) .append("-") .append(calendar.get(Calendar.DAY_OF_MONTH)) .append(" 0").append(hour).toString(); else return new StringBuilder().append(calendar.get(Calendar.YEAR)) .append("-").append(calendar.get(Calendar.MONTH) + 1) .append("-") .append(calendar.get(Calendar.DAY_OF_MONTH)) .append(" ").append(hour).toString(); } } }