com.google.ytd.embed.UploadResponseHandler.java Source code

Java tutorial

Introduction

Here is the source code for com.google.ytd.embed.UploadResponseHandler.java

Source

/* Copyright (c) 2009 Google Inc.
 *
 * 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 com.google.ytd.embed;

import java.io.IOException;
import java.util.logging.Logger;

import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

import org.json.JSONException;
import org.json.JSONObject;

import com.google.inject.Inject;
import com.google.inject.Singleton;
import com.google.ytd.dao.AdminConfigDao;
import com.google.ytd.dao.AssignmentDao;
import com.google.ytd.dao.UserAuthTokenDao;
import com.google.ytd.dao.VideoSubmissionDao;
import com.google.ytd.model.AdminConfig;
import com.google.ytd.model.Assignment;
import com.google.ytd.model.UserSession;
import com.google.ytd.model.VideoSubmission;
import com.google.ytd.util.EmailUtil;
import com.google.ytd.util.Util;
import com.google.ytd.youtube.YouTubeApiHelper;

/**
 * Servlet that is invoked as part of the browser-based YouTube video upload
 * flow. If it detects a successful upload, it creates a new VideoSubmission
 * object in the datastore that corresponds to the new video, and return a JSON
 * representation of it.
 */
@Singleton
public class UploadResponseHandler extends HttpServlet {
    private static final Logger log = Logger.getLogger(UploadResponseHandler.class.getName());

    @Inject
    private EmailUtil emailUtil;
    @Inject
    private Util util;
    @Inject
    private UserSessionManager userSessionManager;
    @Inject
    private YouTubeApiHelper youTubeApiHelper;
    @Inject
    private VideoSubmissionDao submissionDao;
    @Inject
    private UserAuthTokenDao userAuthTokenDao;
    @Inject
    private AdminConfigDao adminConfigDao;
    @Inject
    private AssignmentDao assignmentDao;

    @Override
    public void doGet(HttpServletRequest req, HttpServletResponse resp) throws IOException {
        String videoId = req.getParameter("id");
        String status = req.getParameter("status");

        UserSession userSession = userSessionManager.getUserSession(req);

        if (status.equals("200")) {
            String authSubToken = userSession.getMetaData("authSubToken");
            String articleUrl = userSession.getMetaData("articleUrl");
            String assignmentId = userSession.getMetaData("assignmentId");
            String videoTitle = userSession.getMetaData("videoTitle");
            String videoDescription = userSession.getMetaData("videoDescription");
            String youTubeName = userSession.getMetaData("youTubeName");
            String email = userSession.getMetaData("email");
            String phoneNumber = userSession.getMetaData("phoneNumber");
            String videoTags = userSession.getMetaData("videoTags");
            String videoLocation = userSession.getMetaData("videoLocation");
            String videoDate = userSession.getMetaData("videoDate");

            log.fine(String.format(
                    "Attempting to persist VideoSubmission with YouTube id '%s' " + "for assignment id '%s'...",
                    videoId, assignmentId));

            VideoSubmission submission = submissionDao.newSubmission(Long.parseLong(assignmentId));

            submission.setArticleUrl(articleUrl);
            submission.setVideoId(videoId);
            submission.setVideoTitle(videoTitle);
            submission.setVideoDescription(videoDescription);
            submission.setVideoTags(videoTags);
            submission.setVideoLocation(videoLocation);
            submission.setVideoDate(videoDate);
            submission.setYouTubeName(youTubeName);
            submission.setVideoSource(VideoSubmission.VideoSource.NEW_UPLOAD);
            submission.setNotifyEmail(email);
            submission.setPhoneNumber(phoneNumber);

            userAuthTokenDao.setUserAuthToken(youTubeName, authSubToken);

            AdminConfig adminConfig = adminConfigDao.getAdminConfig();

            youTubeApiHelper.setAuthSubToken(adminConfig.getYouTubeAuthSubToken());

            if (adminConfig.getModerationMode() == AdminConfig.ModerationModeType.NO_MOD.ordinal()) {
                // NO_MOD is set, auto approve all submission
                // TODO: This isn't enough, as the normal approval flow (adding the branding, tags, emails,
                // etc.) isn't taking place.
                submission.setStatus(VideoSubmission.ModerationStatus.APPROVED);
                youTubeApiHelper.updateModeration(videoId, true);

                // Add video to YouTube playlist if it isn't in it already.
                // This code is kind of ugly and is mostly copy/pasted from UpdateVideoSubmissionStatus
                // TODO: It should be refactored into a common helper method somewhere...
                if (!submission.isInPlaylist()) {
                    Assignment assignment = assignmentDao.getAssignmentById(assignmentId);

                    if (assignment == null) {
                        log.warning(String.format("Couldn't find assignment id '%d' for video id '%s'.",
                                assignmentId, videoId));
                    } else {
                        String playlistId = assignment.getPlaylistId();
                        if (util.isNullOrEmpty(playlistId)) {
                            log.warning(String.format("Assignment id '%d' does not have an associated playlist.",
                                    assignmentId));
                        } else {
                            if (youTubeApiHelper.insertVideoIntoPlaylist(playlistId, videoId)) {
                                submission.setIsInPlaylist(true);
                            }
                        }
                    }
                }
            } else {
                youTubeApiHelper.updateModeration(videoId, false);
            }

            submission = submissionDao.save(submission);

            log.fine("...VideoSubmission persisted.");

            emailUtil.sendNewSubmissionEmail(submission);

            try {
                JSONObject responseJsonObj = new JSONObject();
                responseJsonObj.put("videoId", videoId);
                responseJsonObj.put("status", status);
                resp.setContentType("text/html");
                resp.getWriter().println(responseJsonObj.toString());
            } catch (JSONException e) {
                log.warning(e.toString());
                resp.sendError(HttpServletResponse.SC_INTERNAL_SERVER_ERROR, e.getMessage());
            }
        } else {
            String code = req.getParameter("code");
            log.warning(String.format(
                    "Upload request for user with session id '%s' failed with " + "status '%s' and code '%s'.",
                    userSession.getId(), status, code));
            resp.sendError(HttpServletResponse.SC_INTERNAL_SERVER_ERROR, code);
        }
    }
}