1   /**
2    * Copyright (c) 2000-2009 Liferay, Inc. All rights reserved.
3    *
4    * Permission is hereby granted, free of charge, to any person obtaining a copy
5    * of this software and associated documentation files (the "Software"), to deal
6    * in the Software without restriction, including without limitation the rights
7    * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
8    * copies of the Software, and to permit persons to whom the Software is
9    * furnished to do so, subject to the following conditions:
10   *
11   * The above copyright notice and this permission notice shall be included in
12   * all copies or substantial portions of the Software.
13   *
14   * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
15   * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
16   * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
17   * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
18   * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
19   * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
20   * SOFTWARE.
21   */
22  
23  package com.liferay.portlet.journal.action;
24  
25  import com.liferay.portal.kernel.language.LanguageUtil;
26  import com.liferay.portal.kernel.servlet.ImageServletTokenUtil;
27  import com.liferay.portal.kernel.upload.UploadServletRequest;
28  import com.liferay.portal.kernel.util.Constants;
29  import com.liferay.portal.kernel.util.FileUtil;
30  import com.liferay.portal.kernel.util.ParamUtil;
31  import com.liferay.portal.kernel.util.StringPool;
32  import com.liferay.portal.kernel.util.Validator;
33  import com.liferay.portal.kernel.xml.Document;
34  import com.liferay.portal.kernel.xml.Element;
35  import com.liferay.portal.kernel.xml.SAXReaderUtil;
36  import com.liferay.portal.model.User;
37  import com.liferay.portal.service.ImageLocalServiceUtil;
38  import com.liferay.portal.theme.ThemeDisplay;
39  import com.liferay.portal.util.PortalUtil;
40  import com.liferay.portal.util.WebKeys;
41  import com.liferay.portlet.journal.model.JournalArticle;
42  import com.liferay.portlet.journal.model.impl.JournalArticleImpl;
43  import com.liferay.portlet.journal.service.JournalArticleImageLocalServiceUtil;
44  import com.liferay.portlet.journal.service.JournalArticleLocalServiceUtil;
45  import com.liferay.portlet.journal.service.JournalArticleServiceUtil;
46  import com.liferay.portlet.journal.util.JournalUtil;
47  import com.liferay.util.PwdGenerator;
48  
49  import java.io.File;
50  
51  import java.util.Date;
52  import java.util.Iterator;
53  import java.util.Map;
54  
55  import javax.servlet.http.HttpServletRequest;
56  import javax.servlet.http.HttpServletResponse;
57  
58  import org.apache.struts.action.Action;
59  import org.apache.struts.action.ActionForm;
60  import org.apache.struts.action.ActionForward;
61  import org.apache.struts.action.ActionMapping;
62  
63  /**
64   * <a href="ViewArticleContentAction.java.html"><b><i>View Source</i></b></a>
65   *
66   * @author Brian Wing Shun Chan
67   * @author Raymond Augé
68   *
69   */
70  public class ViewArticleContentAction extends Action {
71  
72      public ActionForward execute(
73              ActionMapping mapping, ActionForm form, HttpServletRequest request,
74              HttpServletResponse response)
75          throws Exception {
76  
77          UploadServletRequest uploadRequest = null;
78  
79          try {
80              String cmd = ParamUtil.getString(request, Constants.CMD);
81  
82              ThemeDisplay themeDisplay = (ThemeDisplay)request.getAttribute(
83                  WebKeys.THEME_DISPLAY);
84  
85              long groupId = ParamUtil.getLong(request, "groupId");
86              String articleId = ParamUtil.getString(request, "articleId");
87              double version = ParamUtil.getDouble(
88                  request, "version", JournalArticleImpl.DEFAULT_VERSION);
89  
90              String languageId = LanguageUtil.getLanguageId(request);
91  
92              String output = null;
93  
94              if (cmd.equals(Constants.PREVIEW)) {
95                  uploadRequest = PortalUtil.getUploadServletRequest(request);
96  
97                  String title = ParamUtil.getString(uploadRequest, "title");
98                  String description = ParamUtil.getString(
99                      uploadRequest, "description");
100                 String type = ParamUtil.getString(uploadRequest, "type");
101                 String structureId = ParamUtil.getString(
102                     uploadRequest, "structureId");
103                 String templateId = ParamUtil.getString(
104                     uploadRequest, "templateId");
105 
106                 Date now = new Date();
107 
108                 Date createDate = now;
109                 Date modifiedDate = now;
110                 Date displayDate = now;
111 
112                 User user = PortalUtil.getUser(uploadRequest);
113 
114                 String xml = ParamUtil.getString(uploadRequest, "xml");
115 
116                 Document doc = SAXReaderUtil.read(xml);
117 
118                 Element root = doc.getRootElement();
119 
120                 String previewArticleId =
121                     "PREVIEW_" +
122                     PwdGenerator.getPassword(PwdGenerator.KEY3, 10);
123 
124                 format(
125                     groupId, articleId, version, previewArticleId, root,
126                     uploadRequest);
127 
128                 Map<String, String> tokens = JournalUtil.getTokens(
129                     groupId, themeDisplay);
130 
131                 tokens.put("article_resource_pk", "-1");
132 
133                 JournalArticle article = new JournalArticleImpl();
134 
135                 article.setGroupId(groupId);
136                 article.setCompanyId(user.getCompanyId());
137                 article.setUserId(user.getUserId());
138                 article.setUserName(user.getFullName());
139                 article.setCreateDate(createDate);
140                 article.setModifiedDate(modifiedDate);
141                 article.setArticleId(articleId);
142                 article.setVersion(version);
143                 article.setTitle(title);
144                 article.setDescription(description);
145                 article.setContent(xml);
146                 article.setType(type);
147                 article.setStructureId(structureId);
148                 article.setTemplateId(templateId);
149                 article.setDisplayDate(displayDate);
150 
151                 output = JournalArticleLocalServiceUtil.getArticleContent(
152                     article, templateId, null, languageId, themeDisplay);
153             }
154             else {
155                 output = JournalArticleServiceUtil.getArticleContent(
156                     groupId, articleId, version, languageId, themeDisplay);
157             }
158 
159             request.setAttribute(WebKeys.JOURNAL_ARTICLE_CONTENT, output);
160 
161             if (output.startsWith("<?xml ")) {
162                 return mapping.findForward(
163                     "portlet.journal.raw_article_content");
164             }
165             else {
166                 return mapping.findForward(
167                     "portlet.journal.view_article_content");
168             }
169         }
170         catch (Exception e) {
171             PortalUtil.sendError(e, request, response);
172 
173             return null;
174         }
175         finally {
176             if (uploadRequest != null) {
177                 uploadRequest.cleanUp();
178             }
179         }
180     }
181 
182     protected void format(
183             long groupId, String articleId, double version,
184             String previewArticleId, Element root,
185             UploadServletRequest uploadRequest)
186         throws Exception {
187 
188         Iterator<Element> itr = root.elements().iterator();
189 
190         while (itr.hasNext()) {
191             Element el = itr.next();
192 
193             Element dynamicContent = el.element("dynamic-content");
194 
195             String elInstanceId = el.attributeValue(
196                 "instance-id", StringPool.BLANK);
197             String elName = el.attributeValue("name", StringPool.BLANK);
198             String elType = el.attributeValue("type", StringPool.BLANK);
199             String elContent = StringPool.BLANK;
200             String elLanguage = StringPool.BLANK;
201 
202             if (dynamicContent != null) {
203                 elContent = dynamicContent.getTextTrim();
204 
205                 elLanguage = dynamicContent.attributeValue(
206                     "language-id", StringPool.BLANK);
207 
208                 if (!elLanguage.equals(StringPool.BLANK)) {
209                     elLanguage = "_" + elLanguage;
210                 }
211             }
212 
213             if (elType.equals("image") && Validator.isNull(elContent)) {
214                 File file = uploadRequest.getFile(
215                     "structure_image_" + elName + elLanguage);
216                 byte[] bytes = FileUtil.getBytes(file);
217 
218                 if ((bytes != null) && (bytes.length > 0)) {
219                     long imageId =
220                         JournalArticleImageLocalServiceUtil.getArticleImageId(
221                             groupId, previewArticleId, version, elInstanceId,
222                             elName, elLanguage, true);
223 
224                     String token = ImageServletTokenUtil.getToken(imageId);
225 
226                     dynamicContent.setText(
227                         "/image/journal/article?img_id=" + imageId + "&t=" +
228                             token);
229 
230                     ImageLocalServiceUtil.updateImage(imageId, bytes);
231                 }
232                 else {
233                     if (Validator.isNotNull(articleId)) {
234                         long imageId = JournalArticleImageLocalServiceUtil.
235                             getArticleImageId(
236                                 groupId, articleId, version, elInstanceId,
237                                 elName, elLanguage);
238 
239                         String token = ImageServletTokenUtil.getToken(imageId);
240 
241                         dynamicContent.setText(
242                             "/image/journal/article?img_id=" + imageId +
243                                 "&t=" + token);
244                     }
245                 }
246             }
247 
248             format(
249                 groupId, articleId, version, previewArticleId, el,
250                 uploadRequest);
251         }
252     }
253 
254 }