play.data.binding.AnnotationHelper Maven / Gradle / Ivy
Go to download
Show more of this group Show more artifacts with this name
Show all versions of framework Show documentation
Show all versions of framework Show documentation
RePlay is a fork of the Play1 framework, created by Codeborne.
package play.data.binding;
import java.lang.annotation.Annotation;
import java.text.ParseException;
import java.text.SimpleDateFormat;
import java.util.Date;
import java.util.Locale;
import org.apache.commons.lang3.StringUtils;
import play.i18n.Lang;
import play.libs.I18N;
public class AnnotationHelper {
/**
* It can be something like As(lang={"fr,de","*"}, value={"dd-MM-yyyy","MM-dd-yyyy"})
*
* @param annotations Annotations associated with on the date
* @param value The formatted date
* @return null if it cannot be converted because there is no annotation.
* @throws ParseException if problem occurred during parsing the date
*/
public static Date getDateAs(Annotation[] annotations, String value) throws ParseException {
// Look up for the BindAs annotation
if (annotations == null) {
return null;
}
for (Annotation annotation : annotations) {
if (annotation.annotationType().equals(As.class)) {
As as = (As) annotation;
Locale locale = Lang.getLocale();
String format = as.value()[0];
if (!StringUtils.isEmpty(format)) {
// This can be comma separated
Tuple tuple = getLocale(as.lang());
if (tuple != null) {
// Avoid NPE and get the last value if not specified
format =
as.value()[tuple.index < as.value().length ? tuple.index : as.value().length - 1];
locale = tuple.locale;
}
}
if (StringUtils.isEmpty(format)) {
format = I18N.getDateFormat();
}
SimpleDateFormat sdf =
locale != null ? new SimpleDateFormat(format, locale) : new SimpleDateFormat(format);
sdf.setLenient(false);
return sdf.parse(value);
}
}
return null;
}
private static Tuple getLocale(String[] langs) {
int i = 0;
for (String l : langs) {
String[] commaSeparatedLang = l.split(",");
for (String lang : commaSeparatedLang) {
if (Lang.get().equals(lang) || "*".equals(lang)) {
Locale locale = null;
if ("*".equals(lang)) {
locale = Lang.getLocale();
}
if (locale == null) {
locale = Lang.getLocale(lang);
}
if (locale != null) {
return new Tuple(i, locale);
}
}
}
i++;
}
return null;
}
/** Contains the index of the locale inside the @As */
private static class Tuple {
public int index = -1;
public Locale locale;
Tuple(int index, Locale locale) {
this.locale = locale;
this.index = index;
}
}
}