package io.lumify.twitter; import static com.google.common.base.Preconditions.checkNotNull; import io.lumify.core.util.LumifyLogger; import io.lumify.core.util.LumifyLoggerFactory; import twitter4j.ResponseList; import twitter4j.Status; import twitter4j.Twitter; import twitter4j.TwitterException; import twitter4j.TwitterFactory; import twitter4j.TwitterObjectFactory; import twitter4j.conf.Configuration; import twitter4j.conf.ConfigurationBuilder; import com.google.inject.Inject; /** * Responsible for extracting tweet statuses and launching the processing pipeline */ public final class TweetExtractor { private static final LumifyLogger LOGGER = LumifyLoggerFactory.getLogger(TweetExtractor.class); private final TweetTransformer tweetTransformer; /** * * @param transformer The transformer used to process extracted tweet statuses, not null */ @Inject public TweetExtractor(final TweetTransformer transformer) { tweetTransformer = checkNotNull(transformer); } /** * Fetches tweet statuses from the 'home timeline' of the user specified by the provided {@link OAuthConfiguration} * @param authConfig The configuration information used to perform operations with the Twitter API * @throws TwitterException Thrown if an error occurred when fetching tweet data from Twitter */ public void initiateTweetProcessing(final OAuthConfiguration authConfig) throws TwitterException { checkNotNull(authConfig); final Configuration clientConfig = generateTweetClientConfig(authConfig); final TwitterFactory twitterFactory = new TwitterFactory(clientConfig); final Twitter twitterClient = twitterFactory.getInstance(); final ResponseList<Status> homeTimelineStatuses = twitterClient.getHomeTimeline(); processStatuses(homeTimelineStatuses); } private Configuration generateTweetClientConfig(final OAuthConfiguration authConfig) { final ConfigurationBuilder configBuilder = new ConfigurationBuilder() .setJSONStoreEnabled(true) .setDebugEnabled(true) .setOAuthConsumerKey(authConfig.getConsumerKey()) .setOAuthConsumerSecret(authConfig.getConsumerSecret()) .setOAuthAccessToken(authConfig.getToken()) .setOAuthAccessTokenSecret(authConfig.getTokenSecret()); return configBuilder.build(); } private void processStatuses(final ResponseList<Status> tweetStatuses) { for (final Status status : tweetStatuses) { final long tweetId = status.getId(); final String rawStatus = TwitterObjectFactory.getRawJSON(status); LOGGER.info("Processing raw tweet status id (%d) with content: %s", tweetId, rawStatus); tweetTransformer.transformTweetStatus(status); } } }