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