package org.multibit.mbm.client; import com.sun.jersey.api.client.WebResource; import com.yammer.dropwizard.client.JerseyClient; import org.multibit.mbm.api.hal.HalMediaType; import org.multibit.mbm.auth.hmac.HmacClientFilter; import org.multibit.mbm.model.ClientUser; import javax.ws.rs.core.HttpHeaders; import java.net.URI; import java.util.Locale; /** * <p>Global singleton factory to provide the following to upstream client:</p> * <ul> * <li>Provisioning Jersey client resources using HMAC authentication</li> * <li>Configuration for accepting HAL with a given Locale</li> * <li>Configuration for providing specific user details or acting as a client (anonymous user)</li> * </ul> * * @since 0.0.1 *   */ public enum HalHmacResourceFactory { INSTANCE; private JerseyClient client = null; private String clientApiKey = null; private String clientSecretKey = null; private URI baseUri; /** * @param client The Jersey client to use for building all upstream requests */ public HalHmacResourceFactory setJerseyClient(JerseyClient client) { this.client = client; return this; } /** * @param clientApiKey The client API key used in the absence of a user request */ public HalHmacResourceFactory setClientApiKey(String clientApiKey) { this.clientApiKey = clientApiKey; return this; } /** * @param clientSecretKey The client secret key used in the absence of a user request */ public HalHmacResourceFactory setClientSecretKey(String clientSecretKey) { this.clientSecretKey = clientSecretKey; return this; } /** * @param baseUri The base URI of the upstream server */ public HalHmacResourceFactory setBaseUri(URI baseUri) { this.baseUri = baseUri; return this; } public URI getBaseUri() { return baseUri; } public WebResource newUserResource(Locale locale, String path, ClientUser clientUser) { // Configure the URI URI uri = URI.create(getBaseUri() + path); // Configure the resource WebResource resource = client.resource(uri); resource.setProperty(HmacClientFilter.MBM_API_KEY, clientUser.getApiKey()); resource.setProperty(HmacClientFilter.MBM_SECRET_KEY, clientUser.getSecretKey()); resource.accept(HalMediaType.APPLICATION_HAL_JSON); resource.header(HttpHeaders.ACCEPT_LANGUAGE, locale.toString()); // Provide further access to the request builder to allow chaining return resource; } public WebResource newClientResource(Locale locale, String path) { // Configure the URI URI uri = URI.create(getBaseUri() + path); // Configure the resource WebResource resource = client.resource(uri); resource.setProperty(HmacClientFilter.MBM_API_KEY, clientApiKey); resource.setProperty(HmacClientFilter.MBM_SECRET_KEY, clientSecretKey); resource.accept(HalMediaType.APPLICATION_HAL_JSON); resource.header(HttpHeaders.ACCEPT_LANGUAGE, locale.toString()); // Provide further access to the request builder to allow chaining return resource; } }