package restx.entity;
import com.google.common.base.Joiner;
import com.google.common.base.Optional;
import com.google.common.base.Supplier;
import java.lang.reflect.Type;
/**
* Date: 23/10/13
* Time: 09:53
*/
public class EntityContentTypeResolver {
private final Iterable<EntityDefaultContentTypeProvider> entityDefaultContentTypeProviders;
public EntityContentTypeResolver(Iterable<EntityDefaultContentTypeProvider> entityDefaultContentTypeProviders) {
this.entityDefaultContentTypeProviders = entityDefaultContentTypeProviders;
}
public String resolveContentType(final Type type, Optional<String> contentType) {
return contentType.or(new Supplier<String>() {
@Override
public String get() {
for (EntityDefaultContentTypeProvider entityDefaultContentTypeProvider : entityDefaultContentTypeProviders) {
Optional<String> contentType = entityDefaultContentTypeProvider.mayProvideDefaultContentType(type);
if (contentType.isPresent()) {
return contentType.get();
}
}
throw new IllegalStateException(String.format(
"no EntityDefaultContentTypeProvider provided for %s.\n\n" +
"The list of providers are:\n%s.\n\n" +
"By default RESTX should provide a 'application/json' default content type for any type\n" +
"through JsonEntityDefaultContentTypeProvider, if you haven't removed it on purpose you\n" +
"may have to double check your restx distribution and your classpath\n",
type, Joiner.on("\n\t").join(entityDefaultContentTypeProviders)));
}
});
}
}