package com.hypnoticocelot.jaxrs.doclet.translator; import com.google.common.base.Function; import com.sun.javadoc.FieldDoc; import com.sun.javadoc.MethodDoc; import com.sun.javadoc.Type; import java.util.ArrayList; import java.util.Iterator; import java.util.List; public class FirstNotNullTranslator implements Translator { private final List<Translator> chain; public FirstNotNullTranslator() { chain = new ArrayList<Translator>(); } public FirstNotNullTranslator addNext(Translator link) { chain.add(link); return this; } @Override public OptionalName typeName(final Type type) { return firstNotNullOf(new Function<Translator, OptionalName>() { @Override public OptionalName apply(Translator translator) { return translator.typeName(type); } }); } @Override public OptionalName fieldName(final FieldDoc field) { return firstNotNullOf(new Function<Translator, OptionalName>() { @Override public OptionalName apply(Translator translator) { return translator.fieldName(field); } }); } @Override public OptionalName methodName(final MethodDoc method) { return firstNotNullOf(new Function<Translator, OptionalName>() { @Override public OptionalName apply(Translator translator) { return translator.methodName(method); } }); } private OptionalName firstNotNullOf(Function<Translator, OptionalName> function) { OptionalName name = null; Iterator<Translator> iterator = chain.iterator(); while ((name == null || name.isMissing()) && iterator.hasNext()) { name = function.apply(iterator.next()); } return name; } }