Package org.eurekastreams.server.service.servlets

Source Code of org.eurekastreams.server.service.servlets.UploadImageServlet

/*
* Copyright (c) 2009-2010 Lockheed Martin Corporation
*
* 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.eurekastreams.server.service.servlets;

import java.io.IOException;
import java.util.Iterator;
import java.util.List;

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

import org.apache.commons.fileupload.FileItem;
import org.apache.commons.fileupload.FileItemFactory;
import org.apache.commons.fileupload.disk.DiskFileItemFactory;
import org.apache.commons.fileupload.servlet.ServletFileUpload;
import org.apache.commons.logging.Log;
import org.apache.commons.logging.LogFactory;
import org.eurekastreams.commons.actions.context.DefaultPrincipal;
import org.eurekastreams.commons.actions.context.service.ServiceActionContext;
import org.eurekastreams.commons.actions.service.ServiceAction;
import org.eurekastreams.commons.actions.service.TaskHandlerServiceAction;
import org.eurekastreams.commons.model.DomainEntity;
import org.eurekastreams.commons.server.NoCurrentUserDetails;
import org.eurekastreams.commons.server.service.ActionController;
import org.eurekastreams.server.action.request.profile.SaveImageRequest;
import org.eurekastreams.server.service.actions.strategies.HashGeneratorStrategy;
import org.eurekastreams.server.service.security.userdetails.ExtendedUserDetails;
import org.springframework.context.ApplicationContext;
import org.springframework.security.Authentication;
import org.springframework.security.context.SecurityContextHolder;
import org.springframework.security.userdetails.UserDetails;
import org.springframework.web.context.support.WebApplicationContextUtils;

/**
* The abstract servlet class for uploading an image.
*
* @param <T>
*            the type of domain entity this class maps
*/
@SuppressWarnings("serial")
public abstract class UploadImageServlet<T extends DomainEntity> extends HttpServlet implements Servlet
{
    /**
     * The logger.
     */
    private Log log = LogFactory.getLog(UploadImageServlet.class);

    /**
     * The spring factory.
     */
    private ApplicationContext springContext;

    /**
     * Uploads the image.
     *
     * @param request
     *            the request
     * @param response
     *            the response
     * @throws ServletException
     *             not expected
     * @throws IOException
     *             not expected
     */
    @Override
    @SuppressWarnings("unchecked")
    protected void doPost(final HttpServletRequest request, final HttpServletResponse response)
            throws ServletException, IOException
    {
        response.setContentType("text/plain");

        springContext = WebApplicationContextUtils.getWebApplicationContext(getServletContext());

        UserDetails userDetails = getUserDetails();
        T domainEntity = getDomainEntity(userDetails.getUsername(), request);

        HashGeneratorStrategy hasher = new HashGeneratorStrategy();
        String imageId = hasher.hash(String.valueOf(domainEntity.getId()));

        try
        {
            FileItem uploadItem = getFileItem(request);

            if (uploadItem == null)
            {
                response.getWriter().write("fail");
                return;
            }

            // Save the File

            Object actionBean = getAction(request);

            T newDomainEntity = null;

            if (actionBean instanceof ServiceAction || actionBean instanceof TaskHandlerServiceAction)
            {
                SaveImageRequest currentRequest = new SaveImageRequest(uploadItem, domainEntity.getId(), imageId);
                ActionController serviceActionController = (ActionController) springContext
                        .getBean("serviceActionController");
                DefaultPrincipal principal = new DefaultPrincipal(userDetails.getUsername(),
                        ((ExtendedUserDetails) userDetails).getPerson().getOpenSocialId(),
                        ((ExtendedUserDetails) userDetails).getPerson().getId());
                ServiceActionContext currentContext = new ServiceActionContext(currentRequest, principal);

                if (actionBean instanceof ServiceAction)
                {
                    newDomainEntity = (T) serviceActionController.execute(currentContext, (ServiceAction) actionBean);
                }
                else
                {
                    newDomainEntity = (T) serviceActionController.execute(currentContext,
                            (TaskHandlerServiceAction) actionBean);
                }
            }
            else
            {
                throw new Exception("Invalid action call within the UploadImageServlet.");
            }

            // Return the resulting person objects properties to the user.
            response.getWriter().write(imageId + "," + getResponseString(newDomainEntity));

        }
        catch (Exception e)
        {
            log.error("Error running UploadImageServlet.", e);

            response.getWriter().write("fail");
        }
    }

    /**
     * Gets the file item.
     *
     * @param request
     *            the request
     * @return the file item
     */
    private FileItem getFileItem(final HttpServletRequest request)
    {
        FileItemFactory factory = new DiskFileItemFactory();
        ServletFileUpload upload = new ServletFileUpload(factory);
        // TODO Store this somewhere?
        // Value is in Bytes

        final long maxFileSize = 4000000;
        upload.setFileSizeMax(maxFileSize);
        try
        {
            List items = upload.parseRequest(request);
            Iterator it = items.iterator();

            while (it.hasNext())
            {
                FileItem item = (FileItem) it.next();
                if (!item.isFormField() && item.getFieldName().equals("imageUploadFormElement")
                        && item.getName() != null && !item.getName().isEmpty())
                {
                    return item;
                }
            }
        }
        catch (Exception ex)
        {
            log.error("Error trying to get file item from upload", ex);
        }

        return null;
    }

    /**
     * Gets uesr details.
     *
     * @return the uesr details
     */
    private UserDetails getUserDetails()
    {
        UserDetails user = null;
        Authentication auth = SecurityContextHolder.getContext().getAuthentication();
        if (null != auth)
        {
            Object obj = auth.getPrincipal();
            if (obj instanceof UserDetails)
            {
                user = (UserDetails) obj;
            }
        }

        if (null == user)
        {
            user = new NoCurrentUserDetails();
        }

        return user;
    }

    /**
     * Gets the domain entity.
     *
     * @param inName
     *            the name used to find the domain entity
     * @param request
     *            the http request object.
     * @return the domain entity
     * @throws ServletException
     *             when anything goes wrong
     */
    protected abstract T getDomainEntity(String inName, HttpServletRequest request) throws ServletException;

    /**
     * Gets the file path string.
     *
     * @param inImageId
     *            the domain entity id
     * @return the file path string
     */
    protected abstract String getFilePath(String inImageId);

    /**
     * Gets the action.
     *
     * @param request
     *            the request.
     * @return the action
     */
    protected abstract Object getAction(HttpServletRequest request);

    /**
     * Gets the response string.
     *
     * @param inDomainEntity
     *            the domain entity
     * @return the response string
     */
    protected abstract String getResponseString(T inDomainEntity);

    /**
     * @return the spring factory
     */
    protected ApplicationContext getSpringContext()
    {
        return springContext;
    }
}
TOP

Related Classes of org.eurekastreams.server.service.servlets.UploadImageServlet

TOP
Copyright © 2018 www.massapi.com. All rights reserved.
All source code are property of their respective owners. Java is a trademark of Sun Microsystems, Inc and owned by ORACLE Inc. Contact coftware#gmail.com.