package restx.entity;
import com.google.common.base.Joiner;
import com.google.common.base.Optional;
import com.google.common.base.Supplier;
import restx.factory.Component;
import java.lang.reflect.Type;
import java.util.Collection;
import java.util.Set;
/**
* Date: 23/10/13
* Time: 09:53
*/
@Component
public class EntityResponseWriterRegistry {
private final EntityContentTypeResolver entityContentTypeResolver;
private final Iterable<EntityResponseWriterFactory> entityResponseWriterFactories;
public EntityResponseWriterRegistry(Iterable<EntityDefaultContentTypeProvider> entityDefaultContentTypeProviders,
Iterable<EntityResponseWriterFactory> entityResponseWriterFactories) {
entityContentTypeResolver = new EntityContentTypeResolver(entityDefaultContentTypeProviders);
this.entityResponseWriterFactories = entityResponseWriterFactories;
}
@SuppressWarnings("unchecked")
public <T> EntityResponseWriter<T> build(final Type type, Optional<String> contentType) {
String ct = entityContentTypeResolver.resolveContentType(type, contentType);
for (EntityResponseWriterFactory writerFactory : entityResponseWriterFactories) {
Optional<? extends EntityResponseWriter<Object>> writer = writerFactory.mayBuildFor(type, ct);
if (writer.isPresent()) {
return (EntityResponseWriter<T>) writer.get();
}
}
throw new IllegalStateException(String.format(
"no EntityResponseWriter built for %s %s.\n\n" +
"The list of factories are:\n%s.\n\n" +
"This may be because the content type '%s' is not handled by your RESTX install.\n\n" +
"Possible causes:\n" +
" - you set the content type manually and mistyped it\n" +
" - you are missing the EntityResponseWriterFactory for this content type in your classpath\n",
type, ct, Joiner.on("\n\t").join(entityResponseWriterFactories), ct));
}
}