1   /**
2    * Copyright (c) 2000-2008 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.counter.service.CounterLocalServiceUtil;
26  import com.liferay.portal.NoSuchPortletPreferencesException;
27  import com.liferay.portal.NoSuchUserException;
28  import com.liferay.portal.kernel.security.permission.PermissionChecker;
29  import com.liferay.portal.kernel.util.GetterUtil;
30  import com.liferay.portal.kernel.util.ParamUtil;
31  import com.liferay.portal.kernel.util.StringMaker;
32  import com.liferay.portal.kernel.util.StringPool;
33  import com.liferay.portal.kernel.util.StringUtil;
34  import com.liferay.portal.kernel.util.Validator;
35  import com.liferay.portal.kernel.zip.ZipWriter;
36  import com.liferay.portal.model.Image;
37  import com.liferay.portal.model.Layout;
38  import com.liferay.portal.model.LayoutTypePortlet;
39  import com.liferay.portal.model.PortletPreferences;
40  import com.liferay.portal.service.ImageLocalServiceUtil;
41  import com.liferay.portal.service.LayoutLocalServiceUtil;
42  import com.liferay.portal.service.PortletPreferencesLocalServiceUtil;
43  import com.liferay.portal.service.UserLocalServiceUtil;
44  import com.liferay.portal.struts.ActionConstants;
45  import com.liferay.portal.theme.ThemeDisplay;
46  import com.liferay.portal.upgrade.util.IdReplacer;
47  import com.liferay.portal.upgrade.util.MemoryValueMapper;
48  import com.liferay.portal.util.PortletKeys;
49  import com.liferay.portal.util.WebKeys;
50  import com.liferay.portal.util.comparator.LayoutComparator;
51  import com.liferay.portlet.PortletPreferencesImpl;
52  import com.liferay.portlet.PortletPreferencesSerializer;
53  import com.liferay.portlet.imagegallery.NoSuchImageException;
54  import com.liferay.portlet.imagegallery.model.IGFolder;
55  import com.liferay.portlet.imagegallery.model.IGImage;
56  import com.liferay.portlet.imagegallery.service.IGFolderLocalServiceUtil;
57  import com.liferay.portlet.imagegallery.service.IGImageLocalServiceUtil;
58  import com.liferay.portlet.journal.NoSuchArticleImageException;
59  import com.liferay.portlet.journal.model.JournalArticle;
60  import com.liferay.portlet.journal.model.JournalArticleImage;
61  import com.liferay.portlet.journal.model.JournalArticleResource;
62  import com.liferay.portlet.journal.model.JournalContentSearch;
63  import com.liferay.portlet.journal.model.JournalStructure;
64  import com.liferay.portlet.journal.model.JournalTemplate;
65  import com.liferay.portlet.journal.model.impl.JournalArticleImpl;
66  import com.liferay.portlet.journal.service.JournalArticleImageLocalServiceUtil;
67  import com.liferay.portlet.journal.service.JournalArticleLocalServiceUtil;
68  import com.liferay.portlet.journal.service.JournalArticleResourceLocalServiceUtil;
69  import com.liferay.portlet.journal.service.JournalStructureLocalServiceUtil;
70  import com.liferay.portlet.journal.service.JournalTemplateLocalServiceUtil;
71  import com.liferay.portlet.journal.service.persistence.JournalContentSearchUtil;
72  import com.liferay.portlet.softwarecatalog.NoSuchProductScreenshotException;
73  import com.liferay.portlet.softwarecatalog.service.SCProductScreenshotLocalServiceUtil;
74  import com.liferay.util.Time;
75  import com.liferay.util.servlet.ServletResponseUtil;
76  
77  import java.util.ArrayList;
78  import java.util.Collections;
79  import java.util.Date;
80  import java.util.Iterator;
81  import java.util.List;
82  import java.util.Map;
83  import java.util.Properties;
84  
85  import javax.servlet.http.HttpServletRequest;
86  import javax.servlet.http.HttpServletResponse;
87  import javax.servlet.jsp.PageContext;
88  
89  import org.apache.commons.logging.Log;
90  import org.apache.commons.logging.LogFactory;
91  import org.apache.struts.action.Action;
92  import org.apache.struts.action.ActionForm;
93  import org.apache.struts.action.ActionForward;
94  import org.apache.struts.action.ActionMapping;
95  
96  /**
97   * <a href="ExportAction.java.html"><b><i>View Source</i></b></a>
98   *
99   * @author Brian Wing Shun Chan
100  *
101  */
102 public class ExportAction extends Action {
103 
104     public static final String COMPANY_ID = "liferay.com";
105 
106     public static final long DEFAULT_GROUP_ID = 14;
107 
108     public static final long DEFAULT_USER_ID = 2;
109 
110     public static final String DEFAULT_USER_NAME = "Joe Bloggs";
111 
112     public ActionForward execute(
113             ActionMapping mapping, ActionForm form, HttpServletRequest req,
114             HttpServletResponse res)
115         throws Exception {
116 
117         try {
118             ThemeDisplay themeDisplay =
119                 (ThemeDisplay)req.getAttribute(WebKeys.THEME_DISPLAY);
120 
121             PermissionChecker permissionChecker =
122                 themeDisplay.getPermissionChecker();
123 
124             if (permissionChecker.isOmniadmin()) {
125                 long groupId = ParamUtil.getLong(
126                     req, "groupId", DEFAULT_GROUP_ID);
127 
128                 _primaryKeys.clear();
129                 _primaryKeyCount = 1500;
130 
131                 ZipWriter zipWriter = new ZipWriter();
132 
133                 List journalContentSearches = new ArrayList();
134 
135                 insertDataImage(groupId, zipWriter);
136                 insertDataCMSLayout(groupId, zipWriter, journalContentSearches);
137                 insertDataCMSContent(
138                     groupId, zipWriter, journalContentSearches);
139 
140                 String fileName = "journal.zip";
141 
142                 ServletResponseUtil.sendFile(res, fileName, zipWriter.finish());
143             }
144 
145             return null;
146         }
147         catch (Exception e) {
148             req.setAttribute(PageContext.EXCEPTION, e);
149 
150             return mapping.findForward(ActionConstants.COMMON_ERROR);
151         }
152     }
153 
154     protected void addColumn(StringMaker sm, boolean value) {
155         //sm.append("'");
156 
157         if (value) {
158             sm.append("TRUE");
159         }
160         else {
161             sm.append("FALSE");
162         }
163 
164         //sm.append("', ");
165         sm.append(", ");
166     }
167 
168     protected void addColumn(StringMaker sm, double value) {
169         sm.append(value);
170         sm.append(", ");
171     }
172 
173     protected void addColumn(StringMaker sm, float value) {
174         sm.append(value);
175         sm.append(", ");
176     }
177 
178     protected void addColumn(StringMaker sm, int value) {
179         sm.append(value);
180         sm.append(", ");
181     }
182 
183     protected void addColumn(StringMaker sm, long value) {
184         sm.append(value);
185         sm.append(", ");
186     }
187 
188     protected void addColumn(StringMaker sm, short value) {
189         sm.append(value);
190         sm.append(", ");
191     }
192 
193     protected void addColumn(StringMaker sm, Date value) {
194         addColumn(sm, value, true);
195     }
196 
197     protected void addColumn(StringMaker sm, Date value, boolean current) {
198         if (current) {
199             sm.append("CURRENT_TIMESTAMP, ");
200         }
201         else {
202             sm.append("SPECIFIC_TIMESTAMP_");
203             sm.append(Time.getSimpleDate(value, "yyyyMMddHHmmss"));
204             sm.append(", ");
205         }
206     }
207 
208     protected void addColumn(StringMaker sm, String value) {
209         addColumn(sm, value, true);
210     }
211 
212     protected void addColumn(StringMaker sm, String value, boolean format) {
213         if (format) {
214             value = StringUtil.replace(
215                 value,
216                 new String[] {"\\", "'", "\"", "\n", "\r"},
217                 new String[] {"\\\\", "\\'", "\\\"", "\\n", "\\r"});
218         }
219 
220         value = GetterUtil.getString(value);
221 
222         sm.append("'");
223         sm.append(value);
224         sm.append("', ");
225     }
226 
227     protected void addPKColumn(StringMaker sm, long value) {
228         sm.append(getNewPrimaryKey(value));
229         sm.append(", ");
230     }
231 
232     protected void addPKColumn(StringMaker sm, String value) {
233         sm.append("'");
234         sm.append(getNewPrimaryKey(value));
235         sm.append("', ");
236     }
237 
238     protected String getNewPrimaryKey(String pk) {
239         if (Validator.isNumber(pk)) {
240             long pkLong = GetterUtil.getLong(pk);
241 
242             return String.valueOf(getNewPrimaryKey(pkLong));
243         }
244         else {
245             return pk;
246         }
247     }
248 
249     protected long getNewPrimaryKey(long pk) {
250         Long pkObj = new Long(pk);
251 
252         Long newPkObj = (Long)_primaryKeys.get(pkObj);
253 
254         if (newPkObj == null) {
255             newPkObj = new Long(_primaryKeyCount);
256 
257             _primaryKeyCount++;
258 
259             _primaryKeys.put(pkObj, newPkObj);
260         }
261 
262         return newPkObj.longValue();
263     }
264 
265     protected void insertDataCMSContent(
266             long groupId, ZipWriter zipWriter, List journalContentSearches)
267         throws Exception {
268 
269         StringMaker sm = new StringMaker();
270 
271         List igImages = new ArrayList();
272 
273         Iterator itr = IGFolderLocalServiceUtil.getFolders(groupId).iterator();
274 
275         while (itr.hasNext()) {
276             IGFolder folder = (IGFolder)itr.next();
277 
278             sm.append("insert into IGFolder (");
279             sm.append("folderId, groupId, companyId, userId, createDate, ");
280             sm.append("modifiedDate, parentFolderId, name");
281             sm.append(") values (");
282             addPKColumn(sm, folder.getFolderId());
283             addColumn(sm, folder.getGroupId());
284             addColumn(sm, folder.getCompanyId());
285             //addColumn(sm, folder.getUserId());
286             addColumn(sm, DEFAULT_USER_ID);
287             addColumn(sm, folder.getCreateDate());
288             addColumn(sm, folder.getModifiedDate());
289             addColumn(sm, folder.getParentFolderId());
290             addColumn(sm, folder.getName());
291             removeTrailingComma(sm);
292             sm.append(");\n");
293 
294             igImages.addAll(
295                 IGImageLocalServiceUtil.getImages(folder.getFolderId()));
296         }
297 
298         sm.append("\n");
299 
300         Collections.sort(igImages);
301 
302         itr = igImages.iterator();
303 
304         while (itr.hasNext()) {
305             IGImage image = (IGImage)itr.next();
306 
307             sm.append("insert into IGImage (");
308             sm.append("imageId, companyId, userId, createDate, modifiedDate, ");
309             sm.append("folderId, description, smallImageId, largeImageId");
310             sm.append(") values (");
311             addPKColumn(sm, image.getImageId());
312             addColumn(sm, image.getCompanyId());
313             //addColumn(sm, image.getUserId());
314             addColumn(sm, DEFAULT_USER_ID);
315             addColumn(sm, image.getCreateDate());
316             addColumn(sm, image.getModifiedDate());
317             addPKColumn(sm, image.getFolderId());
318             addColumn(sm, image.getDescription());
319             addPKColumn(sm, image.getSmallImageId());
320             addPKColumn(sm, image.getLargeImageId());
321             removeTrailingComma(sm);
322             sm.append(");\n");
323         }
324 
325         sm.append("\n");
326 
327         itr = JournalArticleLocalServiceUtil.getArticles(groupId).iterator();
328 
329         while (itr.hasNext()) {
330             JournalArticle article = (JournalArticle)itr.next();
331 
332             if (article.isApproved() &&
333                 JournalArticleLocalServiceUtil.isLatestVersion(
334                     article.getGroupId(), article.getArticleId(),
335                     article.getVersion())) {
336 
337                 sm.append("insert into JournalArticle (");
338                 sm.append("id_, resourcePrimKey, groupId, companyId, userId, ");
339                 sm.append("userName, createDate, modifiedDate, articleId, ");
340                 sm.append("version, title, description, content, type_, ");
341                 sm.append("structureId, templateId, displayDate, approved, ");
342                 sm.append("approvedByUserId, approvedByUserName, expired, ");
343                 sm.append("indexable");
344                 sm.append(") values (");
345                 addPKColumn(sm, article.getId());
346                 addPKColumn(sm, article.getResourcePrimKey());
347                 addColumn(sm, article.getGroupId());
348                 addColumn(sm, article.getCompanyId());
349                 //addColumn(sm, article.getUserId());
350                 //addColumn(sm, article.getUserName());
351                 addColumn(sm, DEFAULT_USER_ID);
352                 addColumn(sm, DEFAULT_USER_NAME);
353                 addColumn(sm, article.getCreateDate());
354                 addColumn(sm, article.getModifiedDate());
355                 addPKColumn(sm, article.getArticleId());
356                 addColumn(sm, JournalArticleImpl.DEFAULT_VERSION);
357                 addColumn(sm, article.getTitle());
358                 addColumn(sm, article.getDescription());
359                 addColumn(sm, replaceIds(article.getContent()));
360                 addColumn(sm, article.getType());
361                 addPKColumn(sm, article.getStructureId());
362                 addPKColumn(sm, article.getTemplateId());
363                 addColumn(sm, article.getDisplayDate(), false);
364                 addColumn(sm, article.getApproved());
365                 //addColumn(sm, article.getApprovedByUserId());
366                 //addColumn(sm, article.getApprovedByUserName());
367                 addColumn(sm, DEFAULT_USER_ID);
368                 addColumn(sm, DEFAULT_USER_NAME);
369                 //addColumn(sm, article.getApprovedDate(), false);
370                 addColumn(sm, article.getExpired());
371                 //addColumn(sm, article.getExpirationDate(), false);
372                 //addColumn(sm, article.getReviewDate(), false);
373                 addColumn(sm, article.getIndexable());
374                 removeTrailingComma(sm);
375                 sm.append(");\n");
376             }
377         }
378 
379         sm.append("\n");
380 
381         itr = JournalArticleImageLocalServiceUtil.getArticleImages(
382             groupId).iterator();
383 
384         while (itr.hasNext()) {
385             JournalArticleImage articleImage = (JournalArticleImage)itr.next();
386 
387             sm.append("insert into JournalArticleImage (");
388             sm.append("articleImageId, groupId, articleId, version, elName, ");
389             sm.append("languageId, tempImage");
390             sm.append(") values (");
391             addPKColumn(sm, articleImage.getArticleImageId());
392             addColumn(sm, articleImage.getGroupId());
393             addPKColumn(sm, articleImage.getArticleId());
394             addColumn(sm, articleImage.getVersion());
395             addColumn(sm, articleImage.getElName());
396             addColumn(sm, articleImage.getLanguageId());
397             addColumn(sm, articleImage.getTempImage());
398             removeTrailingComma(sm);
399             sm.append(");\n");
400         }
401 
402         sm.append("\n");
403 
404         itr = JournalArticleResourceLocalServiceUtil.getArticleResources(
405             groupId).iterator();
406 
407         while (itr.hasNext()) {
408             JournalArticleResource articleResource =
409                 (JournalArticleResource)itr.next();
410 
411             sm.append("insert into JournalArticleResource (");
412             sm.append("resourcePrimKey, groupId, articleId");
413             sm.append(") values (");
414             addPKColumn(sm, articleResource.getResourcePrimKey());
415             addColumn(sm, articleResource.getGroupId());
416             addPKColumn(sm, articleResource.getArticleId());
417             removeTrailingComma(sm);
418             sm.append(");\n");
419         }
420 
421         sm.append("\n");
422 
423         itr = journalContentSearches.iterator();
424 
425         while (itr.hasNext()) {
426             JournalContentSearch contentSearch =
427                 (JournalContentSearch)itr.next();
428 
429             sm.append("insert into JournalContentSearch (");
430             sm.append("contentSearchId, groupId, companyId, privateLayout, ");
431             sm.append("layoutId, portletId, articleId");
432             sm.append(") values (");
433             addPKColumn(sm, contentSearch.getContentSearchId());
434             addColumn(sm, contentSearch.getGroupId());
435             addColumn(sm, contentSearch.getCompanyId());
436             addColumn(sm, contentSearch.isPrivateLayout());
437             addColumn(sm, contentSearch.getLayoutId());
438             addColumn(sm, contentSearch.getPortletId());
439             addPKColumn(sm, contentSearch.getArticleId());
440             removeTrailingComma(sm);
441             sm.append(");\n");
442         }
443 
444         sm.append("\n");
445 
446         itr = JournalStructureLocalServiceUtil.getStructures(
447             groupId).iterator();
448 
449         while (itr.hasNext()) {
450             JournalStructure structure = (JournalStructure)itr.next();
451 
452             sm.append("insert into JournalStructure (");
453             sm.append("id_, groupId, companyId, userId, userName, ");
454             sm.append("createDate, modifiedDate, structureId, name, ");
455             sm.append("description, xsd");
456             sm.append(") values (");
457             addPKColumn(sm, structure.getId());
458             addColumn(sm, structure.getGroupId());
459             addColumn(sm, structure.getCompanyId());
460             //addColumn(sm, structure.getUserId());
461             //addColumn(sm, structure.getUserName());
462             addColumn(sm, DEFAULT_USER_ID);
463             addColumn(sm, DEFAULT_USER_NAME);
464             addColumn(sm, structure.getCreateDate());
465             addColumn(sm, structure.getModifiedDate());
466             addPKColumn(sm, structure.getStructureId());
467             addColumn(sm, structure.getName());
468             addColumn(sm, structure.getDescription());
469             addColumn(sm, replaceIds(structure.getXsd()));
470             removeTrailingComma(sm);
471             sm.append(");\n");
472         }
473 
474         sm.append("\n");
475 
476         itr = JournalTemplateLocalServiceUtil.getTemplates(groupId).iterator();
477 
478         while (itr.hasNext()) {
479             JournalTemplate template = (JournalTemplate)itr.next();
480 
481             sm.append("insert into JournalTemplate (");
482             sm.append("id_, groupId, companyId, userId, userName, ");
483             sm.append("createDate, modifiedDate, templateId, structureId, ");
484             sm.append("name, description, xsl, langType, smallImage, ");
485             sm.append("smallImageId, smallImageURL");
486             sm.append(") values (");
487             addPKColumn(sm, template.getId());
488             addColumn(sm, template.getGroupId());
489             addColumn(sm, template.getCompanyId());
490             //addColumn(sm, template.getUserId());
491             //addColumn(sm, template.getUserName());
492             addColumn(sm, DEFAULT_USER_ID);
493             addColumn(sm, DEFAULT_USER_NAME);
494             addColumn(sm, template.getCreateDate());
495             addColumn(sm, template.getModifiedDate());
496             addPKColumn(sm, template.getTemplateId());
497             addPKColumn(sm, template.getStructureId());
498             addColumn(sm, template.getName());
499             addColumn(sm, template.getDescription());
500             addColumn(sm, replaceIds(template.getXsl()));
501             addColumn(sm, template.getLangType());
502             addColumn(sm, template.getSmallImage());
503             addPKColumn(sm, template.getSmallImageId());
504             addColumn(sm, template.getSmallImageURL());
505             removeTrailingComma(sm);
506             sm.append(");\n");
507         }
508 
509         removeTrailingNewLine(sm);
510 
511         zipWriter.addEntry("portal-data-cms-content.sql", sm);
512     }
513 
514     protected void insertDataCMSLayout(
515             long groupId, ZipWriter zipWriter, List journalContentSearches)
516         throws Exception {
517 
518         StringMaker sm = new StringMaker();
519 
520         List layouts = LayoutLocalServiceUtil.getLayouts(groupId, false);
521 
522         sm.append("update LayoutSet ");
523         sm.append("set themeId = 'liferayjedi_WAR_liferayjeditheme', ");
524         sm.append("pageCount = ");
525         sm.append(layouts.size());
526         sm.append(" where groupId = ");
527         sm.append(groupId);
528         sm.append(" and privateLayout = FALSE;\n\n");
529 
530         Collections.sort(layouts, new LayoutComparator(true));
531 
532         Iterator itr = layouts.iterator();
533 
534         while (itr.hasNext()) {
535             Layout layout = (Layout)itr.next();
536 
537             getNewPrimaryKey(layout.getPlid());
538         }
539 
540         itr = layouts.iterator();
541 
542         while (itr.hasNext()) {
543             Layout layout = (Layout)itr.next();
544 
545             Properties props = layout.getTypeSettingsProperties();
546 
547             long linkToPlid = GetterUtil.getLong(
548                 props.getProperty("linkToPlid"));
549 
550             if (linkToPlid > 0) {
551                 long newLinkToPlid = getNewPrimaryKey(linkToPlid);
552 
553                 props.setProperty("linkToPlid", String.valueOf(newLinkToPlid));
554             }
555 
556             sm.append("insert into Layout (");
557             sm.append("plid, groupId, companyId, privateLayout, layoutId, ");
558             sm.append("parentLayoutId, name, title, type_, typeSettings, ");
559             sm.append("hidden_, friendlyURL, iconImage, iconImageId, ");
560             //sm.append("themeId, colorSchemeId, wapThemeId, wapColorSchemeId, ");
561             sm.append("css, priority");
562             sm.append(") values (");
563             addPKColumn(sm, layout.getPlid());
564             addColumn(sm, layout.getGroupId());
565             addColumn(sm, layout.getCompanyId());
566             addColumn(sm, layout.isPrivateLayout());
567             addColumn(sm, layout.getLayoutId());
568             addColumn(sm, layout.getParentLayoutId());
569             addColumn(sm, layout.getName());
570             addColumn(sm, layout.getTitle());
571             addColumn(sm, layout.getType());
572             addColumn(sm, layout.getTypeSettings());
573             addColumn(sm, layout.isHidden());
574             addColumn(sm, layout.getFriendlyURL());
575             addColumn(sm, layout.isIconImage());
576             addColumn(sm, layout.getIconImageId());
577             //addColumn(sm, layout.getThemeId());
578             //addColumn(sm, layout.getColorSchemeId());
579             //addColumn(sm, layout.getWapThemeId());
580             //addColumn(sm, layout.getWapColorSchemeId());
581             addColumn(sm, layout.getCss());
582             addColumn(sm, layout.getPriority());
583             removeTrailingComma(sm);
584             sm.append(");\n");
585         }
586 
587         sm.append("\n");
588 
589         itr = layouts.iterator();
590 
591         while (itr.hasNext()) {
592             Layout layout = (Layout)itr.next();
593 
594             LayoutTypePortlet layoutType =
595                 (LayoutTypePortlet)layout.getLayoutType();
596 
597             List portletIds = layoutType.getPortletIds();
598 
599             Collections.sort(portletIds);
600 
601             for (int i = 0; i < portletIds.size(); i++) {
602                 String portletId = (String)portletIds.get(i);
603 
604                 try {
605                     PortletPreferences portletPreferences =
606                         PortletPreferencesLocalServiceUtil.
607                             getPortletPreferences(
608                                 PortletKeys.PREFS_OWNER_ID_DEFAULT,
609                                 PortletKeys.PREFS_OWNER_TYPE_LAYOUT,
610                                 layout.getPlid(), portletId);
611 
612                     String prefsXml = portletPreferences.getPreferences();
613 
614                     PortletPreferencesImpl prefs = (PortletPreferencesImpl)
615                         PortletPreferencesSerializer.fromDefaultXML(
616                             portletPreferences.getPreferences());
617 
618                     String articleId =
619                         prefs.getValue("article-id", StringPool.BLANK);
620 
621                     articleId = articleId.toUpperCase();
622 
623                     if (Validator.isNotNull(articleId)) {
624                         if (!JournalArticleLocalServiceUtil.hasArticle(
625                                 layout.getGroupId(), articleId)) {
626 
627                             continue;
628                         }
629 
630                         // Make sure article id is upper case in the preferences
631                         // XML
632 
633                         prefs.setValue(
634                             "article-id", getNewPrimaryKey(articleId));
635 
636                         prefsXml = PortletPreferencesSerializer.toXML(prefs);
637 
638                         // Add to the journal content search list
639 
640                         long contentSearchId =
641                             CounterLocalServiceUtil.increment();
642 
643                         JournalContentSearch journalContentSearch =
644                             JournalContentSearchUtil.create(contentSearchId);
645 
646                         journalContentSearch.setContentSearchId(
647                             contentSearchId);
648                         journalContentSearch.setCompanyId(
649                             layout.getCompanyId());
650                         journalContentSearch.setGroupId(layout.getGroupId());
651                         journalContentSearch.setPrivateLayout(
652                             layout.isPrivateLayout());
653                         journalContentSearch.setPortletId(portletId);
654                         journalContentSearch.setLayoutId(layout.getLayoutId());
655                         journalContentSearch.setPortletId(portletId);
656                         journalContentSearch.setArticleId(
657                             getNewPrimaryKey(articleId));
658 
659                         journalContentSearches.add(journalContentSearch);
660                     }
661 
662                     sm.append("insert into PortletPreferences (");
663                     sm.append("portletPreferencesId, ownerId, ownerType, ");
664                     sm.append("plid, portletId, preferences");
665                     sm.append(") values (");
666                     addPKColumn(
667                         sm, portletPreferences.getPortletPreferencesId());
668                     addColumn(sm, portletPreferences.getOwnerId());
669                     addColumn(sm, portletPreferences.getOwnerType());
670                     addPKColumn(sm, portletPreferences.getPlid());
671                     addColumn(sm, portletId);
672                     addColumn(sm, prefsXml);
673                     removeTrailingComma(sm);
674                     sm.append(");\n");
675                 }
676                 catch (NoSuchPortletPreferencesException nsppe) {
677                     _log.warn(nsppe.getMessage());
678                 }
679             }
680 
681             sm.append("\n");
682         }
683 
684         removeTrailingNewLine(sm);
685         removeTrailingNewLine(sm);
686 
687         zipWriter.addEntry("portal-data-cms-layout.sql", sm);
688     }
689 
690     protected void insertDataImage(long groupId, ZipWriter zipWriter)
691         throws Exception {
692 
693         StringMaker sm1 = new StringMaker();
694         StringMaker sm2 = new StringMaker();
695 
696         Iterator itr = ImageLocalServiceUtil.getImagesBySize(70000).iterator();
697 
698         while (itr.hasNext()) {
699             Image image = (Image)itr.next();
700 
701             long imageId = image.getImageId();
702 
703             try {
704                 UserLocalServiceUtil.getUserByPortraitId(imageId);
705 
706                 continue;
707             }
708             catch (NoSuchUserException nsue) {
709             }
710 
711             try {
712                 IGImage igImage =
713                     IGImageLocalServiceUtil.getImageBySmallImageId(imageId);
714 
715                 IGFolder igFolder = igImage.getFolder();
716 
717                 if (igFolder.getGroupId() != groupId) {
718                     continue;
719                 }
720             }
721             catch (NoSuchImageException nsie) {
722             }
723 
724             try {
725                 IGImage igImage =
726                     IGImageLocalServiceUtil.getImageByLargeImageId(imageId);
727 
728                 IGFolder igFolder = igImage.getFolder();
729 
730                 if (igFolder.getGroupId() != groupId) {
731                     continue;
732                 }
733             }
734             catch (NoSuchImageException nsie) {
735             }
736 
737             try {
738                 JournalArticleImage journalArticleImage =
739                     JournalArticleImageLocalServiceUtil.getArticleImage(
740                         imageId);
741 
742                 if (journalArticleImage.getGroupId() != groupId) {
743                     continue;
744                 }
745             }
746             catch (NoSuchArticleImageException nsaie) {
747             }
748 
749             try {
750                 SCProductScreenshotLocalServiceUtil.
751                     getProductScreenshotByFullImageId(imageId);
752 
753                 continue;
754             }
755             catch (NoSuchProductScreenshotException nspse) {
756             }
757 
758             try {
759                 SCProductScreenshotLocalServiceUtil.
760                     getProductScreenshotByThumbnailId(imageId);
761 
762                 continue;
763             }
764             catch (NoSuchProductScreenshotException nspse) {
765             }
766 
767             sm1.append("insert into Image (");
768             sm1.append("imageId, modifiedDate, text_, type_, height, width, ");
769             sm1.append("size_");
770             sm1.append(") values (");
771             addPKColumn(sm1, imageId);
772             addColumn(sm1, image.getModifiedDate());
773             addColumn(sm1, image.getText(), false);
774             addColumn(sm1, image.getType());
775             addColumn(sm1, image.getHeight());
776             addColumn(sm1, image.getWidth());
777             addColumn(sm1, image.getSize());
778             removeTrailingComma(sm1);
779             sm1.append(");\n");
780 
781             sm2.append("<img src=\"http://localhost:8080/image?img_id=");
782             sm2.append(imageId);
783             sm2.append("\" /><br />\n");
784         }
785 
786         removeTrailingNewLine(sm1);
787 
788         zipWriter.addEntry("portal-data-image.sql", sm1);
789         zipWriter.addEntry("portal-data-image.html", sm2);
790     }
791 
792     protected void removeTrailingComma(StringMaker sm) {
793         sm.delete(sm.length() - 2, sm.length());
794     }
795 
796     protected void removeTrailingNewLine(StringMaker sm) {
797         if (sm.length() > 0) {
798             sm.delete(sm.length() - 1, sm.length());
799         }
800     }
801 
802     protected String replaceIds(String content) throws Exception {
803         content = IdReplacer.replaceLongIds(content, "?img_id=", _valueMapper);
804 
805         return content;
806     }
807 
808     private static Log _log = LogFactory.getLog(ExportAction.class);
809 
810     private MemoryValueMapper _valueMapper = new MemoryValueMapper();
811     private Map _primaryKeys = _valueMapper.getMap();
812     private int _primaryKeyCount;
813 
814 }