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