package glaze.examples.twitter.api; import static glaze.Glaze.Get; import static glaze.client.UriBuilder.uriBuilderFrom; import glaze.examples.twitter.api.stream.Tweet; import glaze.examples.twitter.client.TwitterClient; import glaze.examples.twitter.client.TwitterFlow; import java.util.concurrent.Future; import glaze.Glaze; import glaze.client.UriBuilder; import glaze.spi.Registry; import oauth.signpost.OAuth; import oauth.signpost.OAuthConsumer; import oauth.signpost.exception.OAuthException; import com.google.common.base.Preconditions; public class TwitterApi { private static final String BASE_URI = "https://api.twitter.com/1.1"; private final TwitterClient client; private TwitterFlow flow; public TwitterApi() { this(Registry.lookup(TwitterClient.class)); } public TwitterApi(TwitterClient client) { Preconditions.checkNotNull(client); this.client = client; } public void cancelFlow() { this.flow = null; } public Tweet[] homeTimeline() { try { return promiseHomeTimeline().get(); } catch (Exception e) { throw new TwitterApiException(e); } } public Future<Tweet[]> promiseHomeTimeline() { return defaults(Get(svcPath("/statuses/home_timeline.json").build())).mapAsync(client, Tweet[].class); } public void shutdown() { cancelFlow(); client.shutdown(); } public String startFlow() throws OAuthException { return startFlow(OAuth.OUT_OF_BAND); } public String startFlow(String callback) throws OAuthException { try { this.flow = new TwitterFlow(client.getKey(), client.getSecret()); return this.flow.requestAuthorization(callback); } catch (OAuthException e) { this.flow = null; throw e; } } public OAuthConsumer verify(String verifier) throws OAuthException { synchronized (flow) { Preconditions.checkNotNull(flow); try { OAuthConsumer consumer = flow.confirmAuthorization(verifier); client.setTokens(consumer); return consumer; } finally { flow = null; } } } protected Glaze defaults(Glaze m) { // XXX context return client.isPreemptive() ? m : client.signed(m, null); } protected UriBuilder svcPath(Object... paths) { return uriBuilderFrom(BASE_URI).appendPaths(paths); } }