package com.googlecode.objectify.impl.translate;
import com.googlecode.objectify.annotation.Translate;
import com.googlecode.objectify.impl.Path;
/**
* <p>Translator factory which lets users define a custom translator for a field.</p>
*
* @author Jeff Schnitzer <jeff@infohazard.org>
*/
public class TranslateTranslatorFactory implements TranslatorFactory<Object, Object>
{
boolean earlyOnly;
/**
* @param earlyOnly determines whether this instance ignores @Translate annotations with early=false
*/
public TranslateTranslatorFactory(boolean earlyOnly) {
this.earlyOnly = earlyOnly;
}
@Override
public Translator<Object, Object> create(TypeKey<Object> tk, CreateContext ctx, Path path) {
final Translate translateAnno = tk.getAnnotation(Translate.class);
if (translateAnno == null)
return null;
if (earlyOnly && !translateAnno.early())
return null;
@SuppressWarnings("unchecked")
TranslatorFactory<Object, Object> transFact = (TranslatorFactory<Object, Object>)ctx.getFactory().construct(translateAnno.value());
Translator<Object, Object> trans = transFact.create(tk, ctx, path);
if (trans == null) {
path.throwIllegalState("TranslatorFactory " + transFact + " was unable to produce a Translator for " + tk.getType());
return null; // never gets here
} else {
return trans;
}
}
}