package mireka.transmission.queue; import java.text.ParseException; import java.text.ParsePosition; import java.text.SimpleDateFormat; import java.util.Date; import java.util.Locale; class MailName implements Comparable<MailName> { private static final String MESSAGE_CONTENT_DOT_EXTENSION = ".eml"; public static final String MESSAGE_ENVELOPE_DOT_EXTENSION = ".properties"; private static final String ISO_DATE_FORMAT = "yyyy-MM-dd'T'HH-mm-ss.SSSZ"; private static final int ISO_DATE_LENGTH = 28; /** * not includes extension */ public final String baseFileName; /** * milliseconds from epoch */ public final long scheduleDate; public final int sequenceNumber; /** * Creates a new instance by parsing a file name. * * @param fileName * the file name to be parsed, without directories. */ public MailName(String fileName) { ParsePosition pos = new ParsePosition(0); Date date = parseDate(fileName, pos); this.scheduleDate = date.getTime(); if (parsePositinIsAtEndOfString(pos, fileName) || charOfStringAtParsePosition(fileName, pos) != '_') { this.sequenceNumber = 0; } else { incrementParsePosition(pos); this.sequenceNumber = parseSequenceNumber(fileName, pos); } this.baseFileName = fileName.substring(0, pos.getIndex()); } public MailName(long scheduleDate, int sequenceNumber) { this.scheduleDate = scheduleDate; this.sequenceNumber = sequenceNumber; SimpleDateFormat format = new SimpleDateFormat(ISO_DATE_FORMAT, Locale.US); String baseName = format.format(scheduleDate); if (sequenceNumber != 0) baseName += "_" + sequenceNumber; this.baseFileName = baseName; } private Date parseDate(String baseFileName, ParsePosition parsePosition) { String dateString = baseFileName.substring(parsePosition.getIndex(), parsePosition.getIndex() + ISO_DATE_LENGTH); SimpleDateFormat format = new SimpleDateFormat(ISO_DATE_FORMAT, Locale.US); Date date; try { date = format.parse(dateString); } catch (ParseException e) { throw new IllegalArgumentException(e); } parsePosition.setIndex(parsePosition.getIndex() + ISO_DATE_LENGTH); return date; } private boolean parsePositinIsAtEndOfString(ParsePosition parsePosition, String s) { return parsePosition.getIndex() == s.length(); } private char charOfStringAtParsePosition(String s, ParsePosition parsePosition) { return s.charAt(parsePosition.getIndex()); } private void incrementParsePosition(ParsePosition parsePosition) { parsePosition.setIndex(parsePosition.getIndex() + 1); } private int parseSequenceNumber(String s, ParsePosition parsePosition) { StringBuilder sequenceString = new StringBuilder(); char ch; while (Character.isDigit(ch = s.charAt(parsePosition.getIndex()))) { sequenceString.append(ch); incrementParsePosition(parsePosition); } return Integer.parseInt(sequenceString.toString()); } public String envelopeFileName() { return baseFileName + MESSAGE_ENVELOPE_DOT_EXTENSION; } public String contentFileName() { return baseFileName + MESSAGE_CONTENT_DOT_EXTENSION; } @Override public int compareTo(MailName o) { int relation = Long.signum(scheduleDate - o.scheduleDate); if (relation != 0) return relation; return sequenceNumber - o.sequenceNumber; } @Override public String toString() { return baseFileName; } }