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.portal.upgrade.v4_3_0.util;
24  
25  import com.liferay.portal.kernel.log.Log;
26  import com.liferay.portal.kernel.log.LogFactoryUtil;
27  import com.liferay.portal.kernel.util.GetterUtil;
28  import com.liferay.portal.kernel.util.StringPool;
29  import com.liferay.portal.kernel.util.StringUtil;
30  import com.liferay.portal.kernel.util.Validator;
31  import com.liferay.portal.kernel.xml.Document;
32  import com.liferay.portal.kernel.xml.Element;
33  import com.liferay.portal.kernel.xml.SAXReaderUtil;
34  import com.liferay.portal.upgrade.util.BaseUpgradeColumnImpl;
35  import com.liferay.portal.upgrade.util.BaseUpgradeTableImpl;
36  import com.liferay.portal.upgrade.util.IdReplacer;
37  import com.liferay.portal.upgrade.util.UpgradeColumn;
38  import com.liferay.portal.upgrade.util.ValueMapper;
39  import com.liferay.portal.upgrade.util.ValueMapperFactory;
40  import com.liferay.portlet.journal.service.JournalArticleImageLocalServiceUtil;
41  import com.liferay.portlet.journal.util.JournalUtil;
42  import com.liferay.util.PKParser;
43  
44  import java.util.Iterator;
45  
46  /**
47   * <a href="JournalArticleContentUpgradeColumnImpl.java.html"><b><i>View Source
48   * </i></b></a>
49   *
50   * @author Brian Wing Shun Chan
51   *
52   */
53  public class JournalArticleContentUpgradeColumnImpl
54      extends BaseUpgradeColumnImpl {
55  
56      public JournalArticleContentUpgradeColumnImpl(
57          UpgradeColumn companyIdColumn, UpgradeColumn groupIdColumn,
58          UpgradeColumn articleIdColumn, UpgradeColumn versionColumn,
59          UpgradeColumn structureIdColumn, ValueMapper imageIdMapper) {
60  
61          super("content");
62  
63          _companyIdColumn = companyIdColumn;
64          _groupIdColumn = groupIdColumn;
65          _articleIdColumn = articleIdColumn;
66          _versionColumn = versionColumn;
67          _structureIdColumn = structureIdColumn;
68          _imageIdMapper = imageIdMapper;
69      }
70  
71      public Object getNewValue(Object oldValue) throws Exception {
72          String content = (String)oldValue;
73  
74          content = StringUtil.replace(
75              content, BaseUpgradeTableImpl.SAFE_CHARS[1],
76              BaseUpgradeTableImpl.SAFE_CHARS[0]);
77  
78          /*if (content.indexOf("\\n") != -1) {
79              content = StringUtil.replace(
80                  content,
81                  new String[] {"\\n", "\\r"},
82                  new String[] {"\n", "\r"});
83          }*/
84  
85          String structureId = (String)_structureIdColumn.getOldValue();
86  
87          if (Validator.isNotNull(structureId)) {
88              content = formatContent(content);
89          }
90  
91          content = replaceIds(content);
92  
93          content = StringUtil.replace(
94              content, BaseUpgradeTableImpl.SAFE_CHARS[0],
95              BaseUpgradeTableImpl.SAFE_CHARS[1]);
96  
97          return content;
98      }
99  
100     protected String formatContent(String content) throws Exception {
101         String oldCompanyId = (String)_companyIdColumn.getOldValue();
102         Long newCompanyId = (Long)_companyIdColumn.getNewValue();
103         Long groupId = (Long)_groupIdColumn.getNewValue();
104         String articleId = (String)_articleIdColumn.getNewValue();
105         Double version = (Double)_versionColumn.getNewValue();
106 
107         try {
108             Document doc = SAXReaderUtil.read(content);
109 
110             Element root = doc.getRootElement();
111 
112             format(
113                 oldCompanyId, newCompanyId.longValue(), groupId.longValue(),
114                 articleId, version.doubleValue(), root);
115 
116             content = JournalUtil.formatXML(doc);
117         }
118         catch (Exception e) {
119             _log.error(
120                 "Unable to format content for {articleId=" + articleId +
121                     ",version=" + version + "}: " + e.getMessage());
122         }
123 
124         return content;
125     }
126 
127     protected void format(
128             String oldCompanyId, long newCompanyId, long groupId,
129             String articleId, double version, Element root)
130         throws Exception {
131 
132         Iterator<Element> itr = root.elements().iterator();
133 
134         while (itr.hasNext()) {
135             Element el = itr.next();
136 
137             Element dynamicContent = el.element("dynamic-content");
138 
139             String elInstanceId = StringPool.BLANK;
140             String elName = el.attributeValue("name", StringPool.BLANK);
141             String elType = el.attributeValue("type", StringPool.BLANK);
142             String elLanguage = StringPool.BLANK;
143 
144             if (dynamicContent != null) {
145                 elLanguage = dynamicContent.attributeValue(
146                     "language-id", StringPool.BLANK);
147 
148                 if (!elLanguage.equals(StringPool.BLANK)) {
149                     elLanguage = "_" + elLanguage;
150                 }
151             }
152 
153             if (elType.equals("image") || elType.equals("text")) {
154                 String oldImageId = dynamicContent.getText();
155 
156                 if (oldImageId.startsWith(_IMG_ID_PATH) ||
157                     oldImageId.startsWith("@portal_url@" + _IMG_ID_PATH) ||
158                     oldImageId.startsWith(
159                         "http://@portal_url@" + _IMG_ID_PATH) ||
160                     oldImageId.startsWith(
161                         "https://@portal_url@" + _IMG_ID_PATH)) {
162 
163                     int pos = oldImageId.indexOf(_IMG_ID_PATH);
164 
165                     String preOldImageId = oldImageId.substring(0, pos);
166 
167                     oldImageId = oldImageId.substring(
168                         pos + _IMG_ID_PATH.length(), oldImageId.length());
169 
170                     String newImageId = getNewImageId(oldCompanyId, oldImageId);
171 
172                     dynamicContent.setText(
173                         preOldImageId + _IMG_ID_PATH + newImageId);
174 
175                     if (elType.equals("image")) {
176                         dynamicContent.addAttribute("id", newImageId);
177 
178                         long articleImageId = GetterUtil.getLong(newImageId);
179 
180                         JournalArticleImageLocalServiceUtil.addArticleImageId(
181                             articleImageId, groupId, articleId, version,
182                             elInstanceId, elName, elLanguage);
183                     }
184                 }
185             }
186 
187             format(oldCompanyId, newCompanyId, groupId, articleId, version, el);
188         }
189     }
190 
191     protected String getNewImageId(String oldCompanyId, String oldImageId)
192         throws Exception {
193 
194         int pos = oldImageId.lastIndexOf("&version=");
195 
196         oldImageId =
197             oldImageId.substring(0, pos) + "." +
198                 oldImageId.substring(pos + 9, oldImageId.length());
199 
200         String newImageId = oldCompanyId + ".journal.article." + oldImageId;
201 
202         return String.valueOf(_imageIdMapper.getNewValue(newImageId));
203     }
204 
205     protected String replaceIds(String content) throws Exception {
206         ValueMapper dlFolderIdMapper =
207             AvailableMappersUtil.getDLFolderIdMapper();
208 
209         content = IdReplacer.replaceLongIds(
210             content, "/document_library/get_file?folderId=", dlFolderIdMapper);
211         content = IdReplacer.replaceLongIds(
212             content,
213             "_20_struts_action=%2Fdocument_library%2Fget_file&_20_folderId=",
214             dlFolderIdMapper);
215         content = IdReplacer.replaceLongIds(
216             content,
217             "_20_struts_action=%2Fdocument_library%2Fget_file&amp;" +
218                 "_20_folderId=",
219             dlFolderIdMapper);
220 
221         ValueMapper imageIdMapper = AvailableMappersUtil.getImageIdMapper();
222 
223         ValueMapper newImageIdMapper = ValueMapperFactory.getValueMapper();
224 
225         ValueMapper igImageIdMapper = AvailableMappersUtil.getIGImageIdMapper();
226 
227         Iterator<Object> itr = igImageIdMapper.iterator();
228 
229         while (itr.hasNext()) {
230             String oldValue = (String)itr.next();
231 
232             PKParser oldValuePKParser = new PKParser(oldValue);
233 
234             String companyId = oldValuePKParser.getString("companyId");
235             String oldIGImageId = oldValuePKParser.getString("imageId");
236 
237             String oldImageId =
238                 companyId + ".image_gallery." + oldIGImageId + ".large";
239 
240             Long newImageId = (Long)imageIdMapper.getNewValue(oldImageId);
241 
242             newImageIdMapper.mapValue(
243                 new Long(GetterUtil.getLong(oldIGImageId)), newImageId);
244         }
245 
246         content = IdReplacer.replaceLongIds(
247             content, "/image_gallery?img_id=", newImageIdMapper);
248 
249         return content;
250     }
251 
252     private static final String _IMG_ID_PATH =
253         "/image/journal/article?img_id=";
254 
255     private static Log _log =
256         LogFactoryUtil.getLog(JournalArticleContentUpgradeColumnImpl.class);
257 
258     private UpgradeColumn _companyIdColumn;
259     private UpgradeColumn _groupIdColumn;
260     private UpgradeColumn _articleIdColumn;
261     private UpgradeColumn _versionColumn;
262     private UpgradeColumn _structureIdColumn;
263     private ValueMapper _imageIdMapper;
264 
265 }