1   /**
2    * Copyright (c) 2000-2010 Liferay, Inc. All rights reserved.
3    *
4    * This library is free software; you can redistribute it and/or modify it under
5    * the terms of the GNU Lesser General Public License as published by the Free
6    * Software Foundation; either version 2.1 of the License, or (at your option)
7    * any later version.
8    *
9    * This library is distributed in the hope that it will be useful, but WITHOUT
10   * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS
11   * FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public License for more
12   * details.
13   */
14  
15  package com.liferay.portlet.journal.action;
16  
17  import com.liferay.portal.kernel.language.LanguageUtil;
18  import com.liferay.portal.kernel.servlet.ImageServletTokenUtil;
19  import com.liferay.portal.kernel.upload.UploadServletRequest;
20  import com.liferay.portal.kernel.util.Constants;
21  import com.liferay.portal.kernel.util.FileUtil;
22  import com.liferay.portal.kernel.util.ParamUtil;
23  import com.liferay.portal.kernel.util.StringPool;
24  import com.liferay.portal.kernel.util.Validator;
25  import com.liferay.portal.kernel.xml.Document;
26  import com.liferay.portal.kernel.xml.Element;
27  import com.liferay.portal.kernel.xml.SAXReaderUtil;
28  import com.liferay.portal.model.User;
29  import com.liferay.portal.service.ImageLocalServiceUtil;
30  import com.liferay.portal.theme.ThemeDisplay;
31  import com.liferay.portal.util.PortalUtil;
32  import com.liferay.portal.util.WebKeys;
33  import com.liferay.portlet.journal.model.JournalArticle;
34  import com.liferay.portlet.journal.model.JournalArticleConstants;
35  import com.liferay.portlet.journal.model.impl.JournalArticleImpl;
36  import com.liferay.portlet.journal.service.JournalArticleImageLocalServiceUtil;
37  import com.liferay.portlet.journal.service.JournalArticleLocalServiceUtil;
38  import com.liferay.portlet.journal.service.JournalArticleServiceUtil;
39  import com.liferay.portlet.journal.util.JournalUtil;
40  import com.liferay.util.PwdGenerator;
41  
42  import java.io.File;
43  
44  import java.util.Date;
45  import java.util.Iterator;
46  import java.util.Map;
47  
48  import javax.servlet.http.HttpServletRequest;
49  import javax.servlet.http.HttpServletResponse;
50  
51  import org.apache.struts.action.Action;
52  import org.apache.struts.action.ActionForm;
53  import org.apache.struts.action.ActionForward;
54  import org.apache.struts.action.ActionMapping;
55  
56  /**
57   * <a href="ViewArticleContentAction.java.html"><b><i>View Source</i></b></a>
58   *
59   * @author Brian Wing Shun Chan
60   * @author Raymond Augé
61   */
62  public class ViewArticleContentAction extends Action {
63  
64      public ActionForward execute(
65              ActionMapping mapping, ActionForm form, HttpServletRequest request,
66              HttpServletResponse response)
67          throws Exception {
68  
69          UploadServletRequest uploadRequest = null;
70  
71          try {
72              String cmd = ParamUtil.getString(request, Constants.CMD);
73  
74              ThemeDisplay themeDisplay = (ThemeDisplay)request.getAttribute(
75                  WebKeys.THEME_DISPLAY);
76  
77              long groupId = ParamUtil.getLong(request, "groupId");
78              String articleId = ParamUtil.getString(request, "articleId");
79              double version = ParamUtil.getDouble(
80                  request, "version", JournalArticleConstants.DEFAULT_VERSION);
81  
82              String languageId = LanguageUtil.getLanguageId(request);
83  
84              String output = null;
85  
86              if (cmd.equals(Constants.PREVIEW)) {
87                  uploadRequest = PortalUtil.getUploadServletRequest(request);
88  
89                  String title = ParamUtil.getString(uploadRequest, "title");
90                  String description = ParamUtil.getString(
91                      uploadRequest, "description");
92                  String type = ParamUtil.getString(uploadRequest, "type");
93                  String structureId = ParamUtil.getString(
94                      uploadRequest, "structureId");
95                  String templateId = ParamUtil.getString(
96                      uploadRequest, "templateId");
97  
98                  Date now = new Date();
99  
100                 Date createDate = now;
101                 Date modifiedDate = now;
102                 Date displayDate = now;
103 
104                 User user = PortalUtil.getUser(uploadRequest);
105 
106                 String xml = ParamUtil.getString(uploadRequest, "xml");
107 
108                 Document doc = SAXReaderUtil.read(xml);
109 
110                 Element root = doc.getRootElement();
111 
112                 String previewArticleId =
113                     "PREVIEW_" +
114                         PwdGenerator.getPassword(PwdGenerator.KEY3, 10);
115 
116                 format(
117                     groupId, articleId, version, previewArticleId, root,
118                     uploadRequest);
119 
120                 Map<String, String> tokens = JournalUtil.getTokens(
121                     groupId, themeDisplay);
122 
123                 tokens.put("article_resource_pk", "-1");
124 
125                 JournalArticle article = new JournalArticleImpl();
126 
127                 article.setGroupId(groupId);
128                 article.setCompanyId(user.getCompanyId());
129                 article.setUserId(user.getUserId());
130                 article.setUserName(user.getFullName());
131                 article.setCreateDate(createDate);
132                 article.setModifiedDate(modifiedDate);
133                 article.setArticleId(articleId);
134                 article.setVersion(version);
135                 article.setTitle(title);
136                 article.setDescription(description);
137                 article.setContent(xml);
138                 article.setType(type);
139                 article.setStructureId(structureId);
140                 article.setTemplateId(templateId);
141                 article.setDisplayDate(displayDate);
142 
143                 output = JournalArticleLocalServiceUtil.getArticleContent(
144                     article, templateId, null, languageId, themeDisplay);
145             }
146             else {
147                 output = JournalArticleServiceUtil.getArticleContent(
148                     groupId, articleId, version, languageId, themeDisplay);
149             }
150 
151             request.setAttribute(WebKeys.JOURNAL_ARTICLE_CONTENT, output);
152 
153             if (output.startsWith("<?xml ")) {
154                 return mapping.findForward(
155                     "portlet.journal.raw_article_content");
156             }
157             else {
158                 return mapping.findForward(
159                     "portlet.journal.view_article_content");
160             }
161         }
162         catch (Exception e) {
163             PortalUtil.sendError(e, request, response);
164 
165             return null;
166         }
167         finally {
168             if (uploadRequest != null) {
169                 uploadRequest.cleanUp();
170             }
171         }
172     }
173 
174     protected void format(
175             long groupId, String articleId, double version,
176             String previewArticleId, Element root,
177             UploadServletRequest uploadRequest)
178         throws Exception {
179 
180         Iterator<Element> itr = root.elements().iterator();
181 
182         while (itr.hasNext()) {
183             Element el = itr.next();
184 
185             Element dynamicContent = el.element("dynamic-content");
186 
187             String elInstanceId = el.attributeValue(
188                 "instance-id", StringPool.BLANK);
189             String elName = el.attributeValue("name", StringPool.BLANK);
190             String elType = el.attributeValue("type", StringPool.BLANK);
191             String elContent = StringPool.BLANK;
192             String elLanguage = StringPool.BLANK;
193 
194             if (dynamicContent != null) {
195                 elContent = dynamicContent.getTextTrim();
196 
197                 elLanguage = dynamicContent.attributeValue(
198                     "language-id", StringPool.BLANK);
199 
200                 if (!elLanguage.equals(StringPool.BLANK)) {
201                     elLanguage = "_" + elLanguage;
202                 }
203             }
204 
205             if (elType.equals("image") && Validator.isNull(elContent)) {
206                 File file = uploadRequest.getFile(
207                     "structure_image_" + elName + elLanguage);
208                 byte[] bytes = FileUtil.getBytes(file);
209 
210                 if ((bytes != null) && (bytes.length > 0)) {
211                     long imageId =
212                         JournalArticleImageLocalServiceUtil.getArticleImageId(
213                             groupId, previewArticleId, version, elInstanceId,
214                             elName, elLanguage, true);
215 
216                     String token = ImageServletTokenUtil.getToken(imageId);
217 
218                     dynamicContent.setText(
219                         "/image/journal/article?img_id=" + imageId + "&t=" +
220                             token);
221 
222                     ImageLocalServiceUtil.updateImage(imageId, bytes);
223                 }
224                 else {
225                     if (Validator.isNotNull(articleId)) {
226                         long imageId = JournalArticleImageLocalServiceUtil.
227                             getArticleImageId(
228                                 groupId, articleId, version, elInstanceId,
229                                 elName, elLanguage);
230 
231                         String token = ImageServletTokenUtil.getToken(imageId);
232 
233                         dynamicContent.setText(
234                             "/image/journal/article?img_id=" + imageId +
235                                 "&t=" + token);
236                     }
237                 }
238             }
239 
240             format(
241                 groupId, articleId, version, previewArticleId, el,
242                 uploadRequest);
243         }
244     }
245 
246 }