001    /**
002     * Copyright (c) 2000-2013 Liferay, Inc. All rights reserved.
003     *
004     * This library is free software; you can redistribute it and/or modify it under
005     * the terms of the GNU Lesser General Public License as published by the Free
006     * Software Foundation; either version 2.1 of the License, or (at your option)
007     * any later version.
008     *
009     * This library is distributed in the hope that it will be useful, but WITHOUT
010     * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS
011     * FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public License for more
012     * details.
013     */
014    
015    package com.liferay.portlet.wiki.action;
016    
017    import com.liferay.portal.kernel.log.Log;
018    import com.liferay.portal.kernel.log.LogFactoryUtil;
019    import com.liferay.portal.kernel.repository.model.FileEntry;
020    import com.liferay.portal.kernel.servlet.ServletResponseUtil;
021    import com.liferay.portal.kernel.util.ParamUtil;
022    import com.liferay.portal.kernel.workflow.WorkflowConstants;
023    import com.liferay.portal.portletfilerepository.PortletFileRepositoryUtil;
024    import com.liferay.portal.struts.ActionConstants;
025    import com.liferay.portal.struts.PortletAction;
026    import com.liferay.portal.util.PortalUtil;
027    import com.liferay.portlet.documentlibrary.NoSuchFileException;
028    import com.liferay.portlet.documentlibrary.model.DLFileEntry;
029    import com.liferay.portlet.documentlibrary.model.DLFileVersion;
030    import com.liferay.portlet.trash.util.TrashUtil;
031    import com.liferay.portlet.wiki.NoSuchPageException;
032    import com.liferay.portlet.wiki.model.WikiPage;
033    import com.liferay.portlet.wiki.service.WikiPageServiceUtil;
034    
035    import javax.portlet.PortletConfig;
036    import javax.portlet.ResourceRequest;
037    import javax.portlet.ResourceResponse;
038    
039    import javax.servlet.http.HttpServletRequest;
040    import javax.servlet.http.HttpServletResponse;
041    
042    import org.apache.struts.action.ActionForm;
043    import org.apache.struts.action.ActionForward;
044    import org.apache.struts.action.ActionMapping;
045    
046    /**
047     * @author Jorge Ferrer
048     */
049    public class GetPageAttachmentAction extends PortletAction {
050    
051            @Override
052            public void serveResource(
053                            ActionMapping actionMapping, ActionForm actionForm,
054                            PortletConfig portletConfig, ResourceRequest resourceRequest,
055                            ResourceResponse resourceResponse)
056                    throws Exception {
057    
058                    HttpServletRequest request = PortalUtil.getHttpServletRequest(
059                            resourceRequest);
060                    HttpServletResponse response = PortalUtil.getHttpServletResponse(
061                            resourceResponse);
062    
063                    try {
064                            long nodeId = ParamUtil.getLong(resourceRequest, "nodeId");
065                            String title = ParamUtil.getString(resourceRequest, "title");
066                            String fileName = ParamUtil.getString(resourceRequest, "fileName");
067                            int status = ParamUtil.getInteger(
068                                    resourceRequest, "status", WorkflowConstants.STATUS_APPROVED);
069    
070                            getFile(nodeId, title, fileName, status, request, response);
071    
072                            setForward(resourceRequest, ActionConstants.COMMON_NULL);
073                    }
074                    catch (Exception e) {
075                            PortalUtil.sendError(e, request, response);
076                    }
077            }
078    
079            @Override
080            public ActionForward strutsExecute(
081                            ActionMapping actionMapping, ActionForm actionForm,
082                            HttpServletRequest request, HttpServletResponse response)
083                    throws Exception {
084    
085                    try {
086                            long nodeId = ParamUtil.getLong(request, "nodeId");
087                            String title = ParamUtil.getString(request, "title");
088                            String fileName = ParamUtil.getString(request, "fileName");
089                            int status = ParamUtil.getInteger(
090                                    request, "status", WorkflowConstants.STATUS_APPROVED);
091    
092                            getFile(nodeId, title, fileName, status, request, response);
093    
094                            return null;
095                    }
096                    catch (Exception e) {
097                            if ((e instanceof NoSuchPageException) ||
098                                    (e instanceof NoSuchFileException)) {
099    
100                                    if (_log.isWarnEnabled()) {
101                                            _log.warn(e);
102                                    }
103                            }
104                            else {
105                                    PortalUtil.sendError(e, request, response);
106                            }
107    
108                            return null;
109                    }
110            }
111    
112            protected void getFile(
113                            long nodeId, String title, String fileName, int status,
114                            HttpServletRequest request, HttpServletResponse response)
115                    throws Exception {
116    
117                    WikiPage wikiPage = WikiPageServiceUtil.getPage(nodeId, title);
118    
119                    FileEntry fileEntry = PortletFileRepositoryUtil.getPortletFileEntry(
120                            wikiPage.getGroupId(), wikiPage.getAttachmentsFolderId(), fileName);
121    
122                    DLFileEntry dlFileEntry = (DLFileEntry)fileEntry.getModel();
123    
124                    DLFileVersion dlFileVersion = dlFileEntry.getFileVersion();
125    
126                    if ((status != WorkflowConstants.STATUS_IN_TRASH) &&
127                            (dlFileVersion.isInTrash() || dlFileEntry.isInTrashContainer())) {
128    
129                            return;
130                    }
131    
132                    if (dlFileVersion.isInTrash()) {
133                            fileName = TrashUtil.getOriginalTitle(dlFileEntry.getTitle());
134                    }
135    
136                    ServletResponseUtil.sendFile(
137                            request, response, fileName, fileEntry.getContentStream(),
138                            fileEntry.getSize(), fileEntry.getMimeType());
139            }
140    
141            @Override
142            protected boolean isCheckMethodOnProcessAction() {
143                    return _CHECK_METHOD_ON_PROCESS_ACTION;
144            }
145    
146            private static final boolean _CHECK_METHOD_ON_PROCESS_ACTION = false;
147    
148            private static Log _log = LogFactoryUtil.getLog(
149                    GetPageAttachmentAction.class);
150    
151    }