package com.github.dreamhead.moco.resource; import com.github.dreamhead.moco.CookieAttribute; import com.github.dreamhead.moco.HttpProtocolVersion; import com.github.dreamhead.moco.HttpRequest; import com.github.dreamhead.moco.MocoConfig; import com.github.dreamhead.moco.Request; import com.github.dreamhead.moco.model.MessageContent; import com.github.dreamhead.moco.resource.reader.ClasspathFileResourceReader; import com.github.dreamhead.moco.resource.reader.ContentResourceReader; import com.github.dreamhead.moco.resource.reader.FileResourceReader; import com.github.dreamhead.moco.resource.reader.TemplateResourceReader; import com.github.dreamhead.moco.resource.reader.Variable; import com.github.dreamhead.moco.util.Cookies; import com.github.dreamhead.moco.util.FileContentType; import com.google.common.base.Optional; import com.google.common.collect.ImmutableMap; import com.google.common.net.MediaType; import java.nio.charset.Charset; import static com.github.dreamhead.moco.model.MessageContent.content; import static com.github.dreamhead.moco.resource.IdFactory.id; import static com.github.dreamhead.moco.resource.ResourceConfigApplierFactory.DO_NOTHING_APPLIER; import static com.github.dreamhead.moco.resource.ResourceConfigApplierFactory.cookieConfigApplier; import static com.github.dreamhead.moco.resource.ResourceConfigApplierFactory.fileConfigApplier; import static com.github.dreamhead.moco.resource.ResourceConfigApplierFactory.templateConfigApplier; import static com.github.dreamhead.moco.resource.ResourceConfigApplierFactory.uriConfigApplier; public final class ResourceFactory { public static ContentResource textResource(final String text) { return contentResource(id("text"), DO_NOTHING_APPLIER, new ContentResourceReader() { @Override public MediaType getContentType(final HttpRequest request) { return FileContentType.DEFAULT_CONTENT_TYPE_WITH_CHARSET; } @Override public MessageContent readFor(final Optional<? extends Request> request) { return content(text); } }); } public static ContentResource fileResource(final Resource filename, final Optional<Charset> charset, final Optional<MocoConfig> config) { return contentResource(id(MocoConfig.FILE_ID), fileConfigApplier(MocoConfig.FILE_ID, filename), new FileResourceReader(filename, charset, config)); } public static ContentResource classpathFileResource(final Resource filename, final Optional<Charset> charset) { return contentResource(id("pathresource"), DO_NOTHING_APPLIER, new ClasspathFileResourceReader(filename, charset)); } public static Resource methodResource(final String method) { return resource(id("method"), DO_NOTHING_APPLIER, new ResourceReader() { @Override public MessageContent readFor(final Optional<? extends Request> request) { return content(method.toUpperCase()); } }); } public static Resource versionResource(final Resource version) { return resource(id("version"), DO_NOTHING_APPLIER, new ResourceReader() { @Override public MessageContent readFor(final Optional<? extends Request> request) { String text = HttpProtocolVersion.versionOf(version.readFor(request).toString()).text(); return content(text); } }); } public static Resource versionResource(final HttpProtocolVersion version) { return resource(id("version"), DO_NOTHING_APPLIER, new ResourceReader() { @Override public MessageContent readFor(final Optional<? extends Request> request) { return content(version.text()); } }); } public static Resource cookieResource(final String key, final Resource resource, final CookieAttribute... options) { return resource(id("cookie"), cookieConfigApplier(key, resource), new ResourceReader() { @Override public MessageContent readFor(final Optional<? extends Request> request) { MessageContent messageContent = resource.readFor(request); return content(new Cookies().encodeCookie(key, messageContent.toString(), options)); } }); } public static ContentResource templateResource(final ContentResource template, final ImmutableMap<String, ? extends Variable> variables) { return contentResource(id("template"), templateConfigApplier(template, variables), new TemplateResourceReader(template, variables)); } public static Resource uriResource(final String uri) { return resource(id(MocoConfig.URI_ID), uriConfigApplier(MocoConfig.URI_ID, uri), new ResourceReader() { @Override public MessageContent readFor(final Optional<? extends Request> request) { return content(uri); } }); } private static ContentResource contentResource(final Identifiable id, final ResourceConfigApplier applier, final ContentResourceReader reader) { return new ContentResource(id, applier, reader); } private static Resource resource(final Identifiable id, final ResourceConfigApplier applier, final ResourceReader reader) { return new Resource(id, applier, reader); } private ResourceFactory() { } }