package pt.ist.fenixframework.pstm;
import org.joda.time.DateTimeFieldType;
import org.joda.time.Partial;
public class PartialExternalization {
private static DateTimeFieldType[] DATE_TIME_FIELDS = new DateTimeFieldType[] { DateTimeFieldType.era(),
DateTimeFieldType.yearOfEra(), DateTimeFieldType.centuryOfEra(), DateTimeFieldType.yearOfCentury(),
DateTimeFieldType.year(), DateTimeFieldType.monthOfYear(), DateTimeFieldType.dayOfMonth(),
DateTimeFieldType.weekyearOfCentury(), DateTimeFieldType.weekyear(), DateTimeFieldType.weekOfWeekyear(),
DateTimeFieldType.dayOfWeek(), DateTimeFieldType.halfdayOfDay(), DateTimeFieldType.hourOfHalfday(),
DateTimeFieldType.clockhourOfHalfday(), DateTimeFieldType.clockhourOfDay(), DateTimeFieldType.hourOfDay(),
DateTimeFieldType.minuteOfDay(), DateTimeFieldType.minuteOfHour(), DateTimeFieldType.secondOfDay(),
DateTimeFieldType.secondOfMinute(), DateTimeFieldType.millisOfDay(), DateTimeFieldType.millisOfSecond() };
public static String partialToString(Partial partial) {
StringBuilder buf = new StringBuilder();
for (int i = 0; i < DATE_TIME_FIELDS.length; i++) {
DateTimeFieldType field = DATE_TIME_FIELDS[i];
if (partial.isSupported(field)) {
if (buf.length() > 0) {
buf.append(",");
}
buf.append(field.getName() + "=" + partial.get(field));
}
}
return buf.toString();
}
public static Partial partialFromString(String partialAsString) {
// special case: empty string means "any date", i.e. new Partial()
if (partialAsString == "") {
return new Partial();
}
String[] fieldValues = partialAsString.split(",");
DateTimeFieldType[] usedFields = new DateTimeFieldType[fieldValues.length];
int[] usedValues = new int[fieldValues.length];
for (int i = 0; i < fieldValues.length; i++) {
String fieldValue = fieldValues[i];
String[] fieldValueParts = fieldValue.split("=");
if (fieldValueParts.length != 2) {
throw new PartialFormatException("invalid field format '" + fieldValue + "', should be '<name>=<value>'");
}
String name = fieldValueParts[0];
DateTimeFieldType fieldType = getFieldByName(name);
if (fieldType == null) {
throw new PartialFormatException("invalid partial field name '" + name + "'");
}
int value;
try {
value = Integer.parseInt(fieldValueParts[1]);
} catch (NumberFormatException e) {
throw new PartialFormatException("value for field '" + name + "' is not a number: " + fieldValueParts[1], e);
}
usedFields[i] = fieldType;
usedValues[i] = value;
}
return new Partial(usedFields, usedValues);
}
private static DateTimeFieldType getFieldByName(String name) {
for (int i = 0; i < DATE_TIME_FIELDS.length; i++) {
DateTimeFieldType fieldType = DATE_TIME_FIELDS[i];
if (name.equals(fieldType.getName())) {
return fieldType;
}
}
return null;
}
}