001    /**
002     * Copyright (c) 2000-2013 Liferay, Inc. All rights reserved.
003     *
004     * The contents of this file are subject to the terms of the Liferay Enterprise
005     * Subscription License ("License"). You may not use this file except in
006     * compliance with the License. You can obtain a copy of the License by
007     * contacting Liferay, Inc. See the License for the specific language governing
008     * permissions and limitations under the License, including but not limited to
009     * distribution rights of the Software.
010     *
011     *
012     *
013     */
014    
015    package com.liferay.portlet.wiki.action;
016    
017    import com.liferay.portal.kernel.flash.FlashMagicBytesUtil;
018    import com.liferay.portal.kernel.log.Log;
019    import com.liferay.portal.kernel.log.LogFactoryUtil;
020    import com.liferay.portal.kernel.repository.model.FileEntry;
021    import com.liferay.portal.kernel.servlet.ServletResponseUtil;
022    import com.liferay.portal.kernel.util.FileUtil;
023    import com.liferay.portal.kernel.util.ParamUtil;
024    import com.liferay.portal.kernel.util.StringPool;
025    import com.liferay.portal.kernel.workflow.WorkflowConstants;
026    import com.liferay.portal.portletfilerepository.PortletFileRepositoryUtil;
027    import com.liferay.portal.struts.ActionConstants;
028    import com.liferay.portal.struts.PortletAction;
029    import com.liferay.portal.util.PortalUtil;
030    import com.liferay.portlet.documentlibrary.NoSuchFileException;
031    import com.liferay.portlet.documentlibrary.model.DLFileEntry;
032    import com.liferay.portlet.trash.util.TrashUtil;
033    import com.liferay.portlet.wiki.NoSuchPageException;
034    import com.liferay.portlet.wiki.importers.mediawiki.MediaWikiImporter;
035    import com.liferay.portlet.wiki.model.WikiPage;
036    import com.liferay.portlet.wiki.service.WikiPageServiceUtil;
037    
038    import java.io.InputStream;
039    
040    import javax.portlet.PortletConfig;
041    import javax.portlet.ResourceRequest;
042    import javax.portlet.ResourceResponse;
043    
044    import javax.servlet.http.HttpServletRequest;
045    import javax.servlet.http.HttpServletResponse;
046    
047    import org.apache.struts.action.ActionForm;
048    import org.apache.struts.action.ActionForward;
049    import org.apache.struts.action.ActionMapping;
050    
051    /**
052     * @author Jorge Ferrer
053     */
054    public class GetPageAttachmentAction extends PortletAction {
055    
056            @Override
057            public void serveResource(
058                            ActionMapping actionMapping, ActionForm actionForm,
059                            PortletConfig portletConfig, ResourceRequest resourceRequest,
060                            ResourceResponse resourceResponse)
061                    throws Exception {
062    
063                    HttpServletRequest request = PortalUtil.getHttpServletRequest(
064                            resourceRequest);
065                    HttpServletResponse response = PortalUtil.getHttpServletResponse(
066                            resourceResponse);
067    
068                    try {
069                            long nodeId = ParamUtil.getLong(resourceRequest, "nodeId");
070                            String title = ParamUtil.getString(resourceRequest, "title");
071                            String fileName = ParamUtil.getString(resourceRequest, "fileName");
072                            int status = ParamUtil.getInteger(
073                                    resourceRequest, "status", WorkflowConstants.STATUS_APPROVED);
074    
075                            getFile(nodeId, title, fileName, status, request, response);
076    
077                            setForward(resourceRequest, ActionConstants.COMMON_NULL);
078                    }
079                    catch (Exception e) {
080                            PortalUtil.sendError(e, request, response);
081                    }
082            }
083    
084            @Override
085            public ActionForward strutsExecute(
086                            ActionMapping actionMapping, ActionForm actionForm,
087                            HttpServletRequest request, HttpServletResponse response)
088                    throws Exception {
089    
090                    try {
091                            long nodeId = ParamUtil.getLong(request, "nodeId");
092                            String title = ParamUtil.getString(request, "title");
093                            String fileName = ParamUtil.getString(request, "fileName");
094    
095                            if (fileName.startsWith(
096                                            MediaWikiImporter.SHARED_IMAGES_TITLE + StringPool.SLASH)) {
097    
098                                    String[] fileNameParts = fileName.split(
099                                            MediaWikiImporter.SHARED_IMAGES_TITLE + StringPool.SLASH);
100    
101                                    fileName = fileNameParts[1];
102    
103                                    title = MediaWikiImporter.SHARED_IMAGES_TITLE;
104                            }
105    
106                            int status = ParamUtil.getInteger(
107                                    request, "status", WorkflowConstants.STATUS_APPROVED);
108    
109                            getFile(nodeId, title, fileName, status, request, response);
110    
111                            return null;
112                    }
113                    catch (Exception e) {
114                            if ((e instanceof NoSuchPageException) ||
115                                    (e instanceof NoSuchFileException)) {
116    
117                                    if (_log.isWarnEnabled()) {
118                                            _log.warn(e);
119                                    }
120                            }
121                            else {
122                                    PortalUtil.sendError(e, request, response);
123                            }
124    
125                            return null;
126                    }
127            }
128    
129            protected void getFile(
130                            long nodeId, String title, String fileName, int status,
131                            HttpServletRequest request, HttpServletResponse response)
132                    throws Exception {
133    
134                    WikiPage wikiPage = WikiPageServiceUtil.getPage(nodeId, title);
135    
136                    FileEntry fileEntry = PortletFileRepositoryUtil.getPortletFileEntry(
137                            wikiPage.getGroupId(), wikiPage.getAttachmentsFolderId(), fileName);
138    
139                    DLFileEntry dlFileEntry = (DLFileEntry)fileEntry.getModel();
140    
141                    if ((status != WorkflowConstants.STATUS_IN_TRASH) &&
142                            dlFileEntry.isInTrash()) {
143    
144                            return;
145                    }
146    
147                    if (dlFileEntry.isInTrash()) {
148                            fileName = TrashUtil.getOriginalTitle(dlFileEntry.getTitle());
149                    }
150    
151                    InputStream is = fileEntry.getContentStream();
152    
153                    FlashMagicBytesUtil.Result flashMagicBytesUtilResult =
154                            FlashMagicBytesUtil.check(is);
155    
156                    if (flashMagicBytesUtilResult.isFlash()) {
157                            fileName = FileUtil.stripExtension(fileName) + ".swf";
158                    }
159    
160                    is = flashMagicBytesUtilResult.getInputStream();
161    
162                    ServletResponseUtil.sendFile(
163                            request, response, fileName, is, fileEntry.getSize(),
164                            fileEntry.getMimeType());
165            }
166    
167            @Override
168            protected boolean isCheckMethodOnProcessAction() {
169                    return _CHECK_METHOD_ON_PROCESS_ACTION;
170            }
171    
172            private static final boolean _CHECK_METHOD_ON_PROCESS_ACTION = false;
173    
174            private static Log _log = LogFactoryUtil.getLog(
175                    GetPageAttachmentAction.class);
176    
177    }