package com.anjlab.tapestry5; import java.text.MessageFormat; import java.util.Calendar; import java.util.Date; import java.util.regex.Pattern; import org.apache.tapestry5.Field; import org.apache.tapestry5.MarkupWriter; import org.apache.tapestry5.Translator; import org.apache.tapestry5.ValidationException; import org.apache.tapestry5.ioc.Messages; import org.apache.tapestry5.ioc.annotations.Inject; import org.apache.tapestry5.services.FormSupport; public class TimeTranslator implements Translator<Date> { public static final String LONG_TIME_REGEXP = "^(\\d|[01]\\d|[2][0123]):[012345]\\d$"; public String getMessageKey() { return "time-format-exception"; } public String getName() { return "time"; } public Date parseClient(Field field, String clientValue, String message) throws ValidationException { try { return parseTime(new Date(), clientValue.trim()); } catch (Exception ex) { throw new ValidationException(message); } } public void render(Field field, String message, MarkupWriter writer, FormSupport formSupport) { formSupport.addValidation(field, "regexp", message, LONG_TIME_REGEXP); } public Class<Date> getType() { return Date.class; } @Inject public Messages messages; public String toClient(Date value) { return Utils.getFriendlyTime(messages, value); } /** * * @param date * @param time Строка в формате ЧЧ:ММ * @return */ public static Date parseTime(Date date, String time) { if (date == null) { throw new IllegalArgumentException("date"); } if (time == null) { throw new IllegalArgumentException("time"); } String regex = LONG_TIME_REGEXP; if (! Pattern.matches(regex, time)) { throw new IllegalArgumentException( MessageFormat.format( "Неверный формат времени: \"{0}\" не удовлетворяет регулярному выражению \"{1}\"", time, regex)); } String[] timeParts = time.split(":"); Calendar calendar = Calendar.getInstance(); calendar.setTime(date); calendar.set(Calendar.HOUR_OF_DAY, Integer.parseInt(timeParts[0])); calendar.set(Calendar.MINUTE, Integer.parseInt(timeParts[1])); calendar.set(Calendar.SECOND, 0); calendar.set(Calendar.MILLISECOND, 0); return calendar.getTime(); } }