org.jclouds.demo.tweetstore.controller.StoreTweetsController.java Source code

Java tutorial

Introduction

Here is the source code for org.jclouds.demo.tweetstore.controller.StoreTweetsController.java

Source

/**
 *
 * Copyright (C) 2011 Cloud Conscious, LLC. <info@cloudconscious.com>
 *
 * ====================================================================
 * Licensed under the Apache License, Version 2.0 (the "License");
 * you may not use this file except in compliance with the License.
 * You may obtain a copy of the License at
 *
 * http://www.apache.org/licenses/LICENSE-2.0
 *
 * Unless required by applicable law or agreed to in writing, software
 * distributed under the License is distributed on an "AS IS" BASIS,
 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
 * See the License for the specific language governing permissions and
 * limitations under the License.
 * ====================================================================
 */
package org.jclouds.demo.tweetstore.controller;

import static com.google.common.base.Preconditions.checkNotNull;

import java.io.IOException;
import java.util.Map;

import javax.annotation.Resource;
import javax.inject.Inject;
import javax.inject.Named;
import javax.inject.Singleton;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import javax.ws.rs.core.MediaType;

import org.jclouds.blobstore.BlobMap;
import org.jclouds.blobstore.BlobStoreContext;
import org.jclouds.blobstore.domain.Blob;
import org.jclouds.demo.tweetstore.reference.TweetStoreConstants;
import org.jclouds.logging.Logger;
import org.jclouds.rest.AuthorizationException;

import twitter4j.Status;
import twitter4j.Twitter;

import com.google.common.annotations.VisibleForTesting;
import com.google.common.base.Function;

/**
 * Grab tweets related to me and store them into blobstores
 * 
 * @author Adrian Cole
 */
@Singleton
public class StoreTweetsController extends HttpServlet {

    private static final class StatusToBlob implements Function<Status, Blob> {
        private final BlobMap map;

        private StatusToBlob(BlobMap map) {
            this.map = map;
        }

        public Blob apply(Status from) {
            Blob to = map.blobBuilder().name(from.getId() + "").build();
            to.setPayload(from.getText());
            to.getPayload().getContentMetadata().setContentType(MediaType.TEXT_PLAIN);
            to.getMetadata().getUserMetadata().put(TweetStoreConstants.SENDER_NAME, from.getUser().getScreenName());
            return to;
        }
    }

    /** The serialVersionUID */
    private static final long serialVersionUID = 7215420527854203714L;

    private final Map<String, BlobStoreContext> contexts;
    private final Twitter client;
    private final String container;

    @Resource
    protected Logger logger = Logger.NULL;

    @Inject
    @VisibleForTesting
    public StoreTweetsController(Map<String, BlobStoreContext> contexts,
            @Named(TweetStoreConstants.PROPERTY_TWEETSTORE_CONTAINER) String container, Twitter client) {
        this.container = container;
        this.contexts = contexts;
        this.client = client;
    }

    @VisibleForTesting
    public void addMyTweets(String contextName, Iterable<Status> responseList) {
        BlobStoreContext context = checkNotNull(contexts.get(contextName),
                "no context for " + contextName + " in " + contexts.keySet());
        BlobMap map = context.createBlobMap(container);
        for (Status status : responseList) {
            Blob blob = null;
            try {
                blob = new StatusToBlob(map).apply(status);
                map.put(status.getId() + "", blob);
            } catch (AuthorizationException e) {
                throw e;
            } catch (Exception e) {
                logger.error(e, "Error storing tweet %s (blob[%s]) on map %s/%s", status.getId(), blob, context,
                        container);
            }
        }
    }

    @Override
    protected void doGet(HttpServletRequest request, HttpServletResponse response)
            throws ServletException, IOException {
        if (request.getHeader("X-RUN@cloud-Submitter") != null
                && request.getHeader("X-RUN@cloud-Submitter").equals("twitter")) {
            try {
                String contextName = checkNotNull(request.getHeader("context"), "missing header context");
                logger.info("retrieving tweets");
                addMyTweets(contextName, client.getMentions());
                logger.debug("done storing tweets");
                response.setContentType(MediaType.TEXT_PLAIN);
                response.getWriter().println("Done!");
            } catch (Exception e) {
                logger.error(e, "Error storing tweets");
                throw new ServletException(e);
            }
        } else {
            response.sendError(401);
        }
    }
}