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.StringMaker;
31  import com.liferay.portal.kernel.util.StringPool;
32  import com.liferay.portal.kernel.util.StringUtil;
33  import com.liferay.portal.kernel.util.Validator;
34  import com.liferay.portal.kernel.zip.ZipWriter;
35  import com.liferay.portal.model.Image;
36  import com.liferay.portal.model.Layout;
37  import com.liferay.portal.model.LayoutTypePortlet;
38  import com.liferay.portal.model.PortletPreferences;
39  import com.liferay.portal.security.permission.PermissionChecker;
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.List;
81  import java.util.Map;
82  import java.util.Properties;
83  
84  import javax.servlet.http.HttpServletRequest;
85  import javax.servlet.http.HttpServletResponse;
86  import javax.servlet.jsp.PageContext;
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 req,
113             HttpServletResponse res)
114         throws Exception {
115 
116         try {
117             ThemeDisplay themeDisplay =
118                 (ThemeDisplay)req.getAttribute(WebKeys.THEME_DISPLAY);
119 
120             PermissionChecker permissionChecker =
121                 themeDisplay.getPermissionChecker();
122 
123             if (permissionChecker.isOmniadmin()) {
124                 long groupId = ParamUtil.getLong(
125                     req, "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(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 newPk = _primaryKeys.get(pk);
251 
252         if (newPk == null) {
253             newPk = new Long(_primaryKeyCount);
254 
255             _primaryKeyCount++;
256 
257             _primaryKeys.put(pk, newPk);
258         }
259 
260         return newPk.longValue();
261     }
262 
263     protected void insertDataCMSContent(
264             long groupId, ZipWriter zipWriter,
265             List<JournalContentSearch> journalContentSearches)
266         throws Exception {
267 
268         StringMaker sm = new StringMaker();
269 
270         List<IGImage> igImages = new ArrayList<IGImage>();
271 
272         List<IGFolder> igFolders = IGFolderLocalServiceUtil.getFolders(
273             groupId);
274 
275         for (IGFolder folder : igFolders) {
276             sm.append("insert into IGFolder (");
277             sm.append("folderId, groupId, companyId, userId, createDate, ");
278             sm.append("modifiedDate, parentFolderId, name");
279             sm.append(") values (");
280             addPKColumn(sm, folder.getFolderId());
281             addColumn(sm, folder.getGroupId());
282             addColumn(sm, folder.getCompanyId());
283             //addColumn(sm, folder.getUserId());
284             addColumn(sm, DEFAULT_USER_ID);
285             addColumn(sm, folder.getCreateDate());
286             addColumn(sm, folder.getModifiedDate());
287             addColumn(sm, folder.getParentFolderId());
288             addColumn(sm, folder.getName());
289             removeTrailingComma(sm);
290             sm.append(");\n");
291 
292             igImages.addAll(
293                 IGImageLocalServiceUtil.getImages(folder.getFolderId()));
294         }
295 
296         sm.append("\n");
297 
298         Collections.sort(igImages);
299 
300         for (IGImage image : igImages) {
301             sm.append("insert into IGImage (");
302             sm.append("imageId, companyId, userId, createDate, modifiedDate, ");
303             sm.append("folderId, description, smallImageId, largeImageId");
304             sm.append(") values (");
305             addPKColumn(sm, image.getImageId());
306             addColumn(sm, image.getCompanyId());
307             //addColumn(sm, image.getUserId());
308             addColumn(sm, DEFAULT_USER_ID);
309             addColumn(sm, image.getCreateDate());
310             addColumn(sm, image.getModifiedDate());
311             addPKColumn(sm, image.getFolderId());
312             addColumn(sm, image.getDescription());
313             addPKColumn(sm, image.getSmallImageId());
314             addPKColumn(sm, image.getLargeImageId());
315             removeTrailingComma(sm);
316             sm.append(");\n");
317         }
318 
319         sm.append("\n");
320 
321         List<JournalArticle> articles =
322             JournalArticleLocalServiceUtil.getArticles(groupId);
323 
324         for (JournalArticle article : articles) {
325             if (article.isApproved() &&
326                 JournalArticleLocalServiceUtil.isLatestVersion(
327                     article.getGroupId(), article.getArticleId(),
328                     article.getVersion())) {
329 
330                 sm.append("insert into JournalArticle (");
331                 sm.append("id_, resourcePrimKey, groupId, companyId, userId, ");
332                 sm.append("userName, createDate, modifiedDate, articleId, ");
333                 sm.append("version, title, description, content, type_, ");
334                 sm.append("structureId, templateId, displayDate, approved, ");
335                 sm.append("approvedByUserId, approvedByUserName, expired, ");
336                 sm.append("indexable");
337                 sm.append(") values (");
338                 addPKColumn(sm, article.getId());
339                 addPKColumn(sm, article.getResourcePrimKey());
340                 addColumn(sm, article.getGroupId());
341                 addColumn(sm, article.getCompanyId());
342                 //addColumn(sm, article.getUserId());
343                 //addColumn(sm, article.getUserName());
344                 addColumn(sm, DEFAULT_USER_ID);
345                 addColumn(sm, DEFAULT_USER_NAME);
346                 addColumn(sm, article.getCreateDate());
347                 addColumn(sm, article.getModifiedDate());
348                 addPKColumn(sm, article.getArticleId());
349                 addColumn(sm, JournalArticleImpl.DEFAULT_VERSION);
350                 addColumn(sm, article.getTitle());
351                 addColumn(sm, article.getDescription());
352                 addColumn(sm, replaceIds(article.getContent()));
353                 addColumn(sm, article.getType());
354                 addPKColumn(sm, article.getStructureId());
355                 addPKColumn(sm, article.getTemplateId());
356                 addColumn(sm, article.getDisplayDate(), false);
357                 addColumn(sm, article.getApproved());
358                 //addColumn(sm, article.getApprovedByUserId());
359                 //addColumn(sm, article.getApprovedByUserName());
360                 addColumn(sm, DEFAULT_USER_ID);
361                 addColumn(sm, DEFAULT_USER_NAME);
362                 //addColumn(sm, article.getApprovedDate(), false);
363                 addColumn(sm, article.getExpired());
364                 //addColumn(sm, article.getExpirationDate(), false);
365                 //addColumn(sm, article.getReviewDate(), false);
366                 addColumn(sm, article.getIndexable());
367                 removeTrailingComma(sm);
368                 sm.append(");\n");
369             }
370         }
371 
372         sm.append("\n");
373 
374         List<JournalArticleImage> articleImages =
375             JournalArticleImageLocalServiceUtil.getArticleImages(groupId);
376 
377         for (JournalArticleImage articleImage : articleImages) {
378             sm.append("insert into JournalArticleImage (");
379             sm.append("articleImageId, groupId, articleId, version, elName, ");
380             sm.append("languageId, tempImage");
381             sm.append(") values (");
382             addPKColumn(sm, articleImage.getArticleImageId());
383             addColumn(sm, articleImage.getGroupId());
384             addPKColumn(sm, articleImage.getArticleId());
385             addColumn(sm, articleImage.getVersion());
386             addColumn(sm, articleImage.getElName());
387             addColumn(sm, articleImage.getLanguageId());
388             addColumn(sm, articleImage.getTempImage());
389             removeTrailingComma(sm);
390             sm.append(");\n");
391         }
392 
393         sm.append("\n");
394 
395         List<JournalArticleResource> articleResources =
396             JournalArticleResourceLocalServiceUtil.getArticleResources(groupId);
397 
398         for (JournalArticleResource articleResource : articleResources) {
399             sm.append("insert into JournalArticleResource (");
400             sm.append("resourcePrimKey, groupId, articleId");
401             sm.append(") values (");
402             addPKColumn(sm, articleResource.getResourcePrimKey());
403             addColumn(sm, articleResource.getGroupId());
404             addPKColumn(sm, articleResource.getArticleId());
405             removeTrailingComma(sm);
406             sm.append(");\n");
407         }
408 
409         sm.append("\n");
410 
411         for (JournalContentSearch contentSearch : journalContentSearches) {
412             sm.append("insert into JournalContentSearch (");
413             sm.append("contentSearchId, groupId, companyId, privateLayout, ");
414             sm.append("layoutId, portletId, articleId");
415             sm.append(") values (");
416             addPKColumn(sm, contentSearch.getContentSearchId());
417             addColumn(sm, contentSearch.getGroupId());
418             addColumn(sm, contentSearch.getCompanyId());
419             addColumn(sm, contentSearch.isPrivateLayout());
420             addColumn(sm, contentSearch.getLayoutId());
421             addColumn(sm, contentSearch.getPortletId());
422             addPKColumn(sm, contentSearch.getArticleId());
423             removeTrailingComma(sm);
424             sm.append(");\n");
425         }
426 
427         sm.append("\n");
428 
429         List<JournalStructure> structures =
430             JournalStructureLocalServiceUtil.getStructures(groupId);
431 
432         for (JournalStructure structure : structures) {
433             sm.append("insert into JournalStructure (");
434             sm.append("id_, groupId, companyId, userId, userName, ");
435             sm.append("createDate, modifiedDate, structureId, name, ");
436             sm.append("description, xsd");
437             sm.append(") values (");
438             addPKColumn(sm, structure.getId());
439             addColumn(sm, structure.getGroupId());
440             addColumn(sm, structure.getCompanyId());
441             //addColumn(sm, structure.getUserId());
442             //addColumn(sm, structure.getUserName());
443             addColumn(sm, DEFAULT_USER_ID);
444             addColumn(sm, DEFAULT_USER_NAME);
445             addColumn(sm, structure.getCreateDate());
446             addColumn(sm, structure.getModifiedDate());
447             addPKColumn(sm, structure.getStructureId());
448             addColumn(sm, structure.getName());
449             addColumn(sm, structure.getDescription());
450             addColumn(sm, replaceIds(structure.getXsd()));
451             removeTrailingComma(sm);
452             sm.append(");\n");
453         }
454 
455         sm.append("\n");
456 
457         List<JournalTemplate> templates =
458             JournalTemplateLocalServiceUtil.getTemplates(groupId);
459 
460         for (JournalTemplate template : templates) {
461             sm.append("insert into JournalTemplate (");
462             sm.append("id_, groupId, companyId, userId, userName, ");
463             sm.append("createDate, modifiedDate, templateId, structureId, ");
464             sm.append("name, description, xsl, langType, smallImage, ");
465             sm.append("smallImageId, smallImageURL");
466             sm.append(") values (");
467             addPKColumn(sm, template.getId());
468             addColumn(sm, template.getGroupId());
469             addColumn(sm, template.getCompanyId());
470             //addColumn(sm, template.getUserId());
471             //addColumn(sm, template.getUserName());
472             addColumn(sm, DEFAULT_USER_ID);
473             addColumn(sm, DEFAULT_USER_NAME);
474             addColumn(sm, template.getCreateDate());
475             addColumn(sm, template.getModifiedDate());
476             addPKColumn(sm, template.getTemplateId());
477             addPKColumn(sm, template.getStructureId());
478             addColumn(sm, template.getName());
479             addColumn(sm, template.getDescription());
480             addColumn(sm, replaceIds(template.getXsl()));
481             addColumn(sm, template.getLangType());
482             addColumn(sm, template.getSmallImage());
483             addPKColumn(sm, template.getSmallImageId());
484             addColumn(sm, template.getSmallImageURL());
485             removeTrailingComma(sm);
486             sm.append(");\n");
487         }
488 
489         removeTrailingNewLine(sm);
490 
491         zipWriter.addEntry("portal-data-cms-content.sql", sm);
492     }
493 
494     protected void insertDataCMSLayout(
495             long groupId, ZipWriter zipWriter,
496             List<JournalContentSearch> journalContentSearches)
497         throws Exception {
498 
499         StringMaker sm = new StringMaker();
500 
501         List<Layout> layouts = LayoutLocalServiceUtil.getLayouts(
502             groupId, false);
503 
504         sm.append("update LayoutSet ");
505         sm.append("set themeId = 'liferayjedi_WAR_liferayjeditheme', ");
506         sm.append("pageCount = ");
507         sm.append(layouts.size());
508         sm.append(" where groupId = ");
509         sm.append(groupId);
510         sm.append(" and privateLayout = FALSE;\n\n");
511 
512         Collections.sort(layouts, new LayoutComparator(true));
513 
514         for (Layout layout : layouts) {
515             getNewPrimaryKey(layout.getPlid());
516         }
517 
518         for (Layout layout : layouts) {
519             Properties props = layout.getTypeSettingsProperties();
520 
521             long linkToPlid = GetterUtil.getLong(
522                 props.getProperty("linkToPlid"));
523 
524             if (linkToPlid > 0) {
525                 long newLinkToPlid = getNewPrimaryKey(linkToPlid);
526 
527                 props.setProperty("linkToPlid", String.valueOf(newLinkToPlid));
528             }
529 
530             sm.append("insert into Layout (");
531             sm.append("plid, groupId, companyId, privateLayout, layoutId, ");
532             sm.append("parentLayoutId, name, title, type_, typeSettings, ");
533             sm.append("hidden_, friendlyURL, iconImage, iconImageId, ");
534             //sm.append("themeId, colorSchemeId, wapThemeId, wapColorSchemeId, ");
535             sm.append("css, priority");
536             sm.append(") values (");
537             addPKColumn(sm, layout.getPlid());
538             addColumn(sm, layout.getGroupId());
539             addColumn(sm, layout.getCompanyId());
540             addColumn(sm, layout.isPrivateLayout());
541             addColumn(sm, layout.getLayoutId());
542             addColumn(sm, layout.getParentLayoutId());
543             addColumn(sm, layout.getName());
544             addColumn(sm, layout.getTitle());
545             addColumn(sm, layout.getType());
546             addColumn(sm, layout.getTypeSettings());
547             addColumn(sm, layout.isHidden());
548             addColumn(sm, layout.getFriendlyURL());
549             addColumn(sm, layout.isIconImage());
550             addColumn(sm, layout.getIconImageId());
551             //addColumn(sm, layout.getThemeId());
552             //addColumn(sm, layout.getColorSchemeId());
553             //addColumn(sm, layout.getWapThemeId());
554             //addColumn(sm, layout.getWapColorSchemeId());
555             addColumn(sm, layout.getCss());
556             addColumn(sm, layout.getPriority());
557             removeTrailingComma(sm);
558             sm.append(");\n");
559         }
560 
561         sm.append("\n");
562 
563         for (Layout layout : layouts) {
564             LayoutTypePortlet layoutType =
565                 (LayoutTypePortlet)layout.getLayoutType();
566 
567             List<String> portletIds = layoutType.getPortletIds();
568 
569             Collections.sort(portletIds);
570 
571             for (int i = 0; i < portletIds.size(); i++) {
572                 String portletId = portletIds.get(i);
573 
574                 try {
575                     PortletPreferences portletPreferences =
576                         PortletPreferencesLocalServiceUtil.
577                             getPortletPreferences(
578                                 PortletKeys.PREFS_OWNER_ID_DEFAULT,
579                                 PortletKeys.PREFS_OWNER_TYPE_LAYOUT,
580                                 layout.getPlid(), portletId);
581 
582                     String prefsXml = portletPreferences.getPreferences();
583 
584                     PortletPreferencesImpl prefs = (PortletPreferencesImpl)
585                         PortletPreferencesSerializer.fromDefaultXML(
586                             portletPreferences.getPreferences());
587 
588                     String articleId =
589                         prefs.getValue("article-id", StringPool.BLANK);
590 
591                     articleId = articleId.toUpperCase();
592 
593                     if (Validator.isNotNull(articleId)) {
594                         if (!JournalArticleLocalServiceUtil.hasArticle(
595                                 layout.getGroupId(), articleId)) {
596 
597                             continue;
598                         }
599 
600                         // Make sure article id is upper case in the preferences
601                         // XML
602 
603                         prefs.setValue(
604                             "article-id", getNewPrimaryKey(articleId));
605 
606                         prefsXml = PortletPreferencesSerializer.toXML(prefs);
607 
608                         // Add to the journal content search list
609 
610                         long contentSearchId =
611                             CounterLocalServiceUtil.increment();
612 
613                         JournalContentSearch journalContentSearch =
614                             JournalContentSearchUtil.create(contentSearchId);
615 
616                         journalContentSearch.setContentSearchId(
617                             contentSearchId);
618                         journalContentSearch.setCompanyId(
619                             layout.getCompanyId());
620                         journalContentSearch.setGroupId(layout.getGroupId());
621                         journalContentSearch.setPrivateLayout(
622                             layout.isPrivateLayout());
623                         journalContentSearch.setPortletId(portletId);
624                         journalContentSearch.setLayoutId(layout.getLayoutId());
625                         journalContentSearch.setPortletId(portletId);
626                         journalContentSearch.setArticleId(
627                             getNewPrimaryKey(articleId));
628 
629                         journalContentSearches.add(journalContentSearch);
630                     }
631 
632                     sm.append("insert into PortletPreferences (");
633                     sm.append("portletPreferencesId, ownerId, ownerType, ");
634                     sm.append("plid, portletId, preferences");
635                     sm.append(") values (");
636                     addPKColumn(
637                         sm, portletPreferences.getPortletPreferencesId());
638                     addColumn(sm, portletPreferences.getOwnerId());
639                     addColumn(sm, portletPreferences.getOwnerType());
640                     addPKColumn(sm, portletPreferences.getPlid());
641                     addColumn(sm, portletId);
642                     addColumn(sm, prefsXml);
643                     removeTrailingComma(sm);
644                     sm.append(");\n");
645                 }
646                 catch (NoSuchPortletPreferencesException nsppe) {
647                     _log.warn(nsppe.getMessage());
648                 }
649             }
650 
651             sm.append("\n");
652         }
653 
654         removeTrailingNewLine(sm);
655         removeTrailingNewLine(sm);
656 
657         zipWriter.addEntry("portal-data-cms-layout.sql", sm);
658     }
659 
660     protected void insertDataImage(long groupId, ZipWriter zipWriter)
661         throws Exception {
662 
663         StringMaker sm1 = new StringMaker();
664         StringMaker sm2 = new StringMaker();
665 
666         List<Image> images = ImageLocalServiceUtil.getImagesBySize(70000);
667 
668         for (Image image : images) {
669             long imageId = image.getImageId();
670 
671             try {
672                 UserLocalServiceUtil.getUserByPortraitId(imageId);
673 
674                 continue;
675             }
676             catch (NoSuchUserException nsue) {
677             }
678 
679             try {
680                 IGImage igImage =
681                     IGImageLocalServiceUtil.getImageBySmallImageId(imageId);
682 
683                 IGFolder igFolder = igImage.getFolder();
684 
685                 if (igFolder.getGroupId() != groupId) {
686                     continue;
687                 }
688             }
689             catch (NoSuchImageException nsie) {
690             }
691 
692             try {
693                 IGImage igImage =
694                     IGImageLocalServiceUtil.getImageByLargeImageId(imageId);
695 
696                 IGFolder igFolder = igImage.getFolder();
697 
698                 if (igFolder.getGroupId() != groupId) {
699                     continue;
700                 }
701             }
702             catch (NoSuchImageException nsie) {
703             }
704 
705             try {
706                 JournalArticleImage journalArticleImage =
707                     JournalArticleImageLocalServiceUtil.getArticleImage(
708                         imageId);
709 
710                 if (journalArticleImage.getGroupId() != groupId) {
711                     continue;
712                 }
713             }
714             catch (NoSuchArticleImageException nsaie) {
715             }
716 
717             try {
718                 SCProductScreenshotLocalServiceUtil.
719                     getProductScreenshotByFullImageId(imageId);
720 
721                 continue;
722             }
723             catch (NoSuchProductScreenshotException nspse) {
724             }
725 
726             try {
727                 SCProductScreenshotLocalServiceUtil.
728                     getProductScreenshotByThumbnailId(imageId);
729 
730                 continue;
731             }
732             catch (NoSuchProductScreenshotException nspse) {
733             }
734 
735             sm1.append("insert into Image (");
736             sm1.append("imageId, modifiedDate, text_, type_, height, width, ");
737             sm1.append("size_");
738             sm1.append(") values (");
739             addPKColumn(sm1, imageId);
740             addColumn(sm1, image.getModifiedDate());
741             addColumn(sm1, image.getText(), false);
742             addColumn(sm1, image.getType());
743             addColumn(sm1, image.getHeight());
744             addColumn(sm1, image.getWidth());
745             addColumn(sm1, image.getSize());
746             removeTrailingComma(sm1);
747             sm1.append(");\n");
748 
749             sm2.append("<img alt=\"");
750             sm2.append(imageId);
751             sm2.append("\" src=\"http://localhost:8080/image?img_id=");
752             sm2.append(imageId);
753             sm2.append("\" /><br />\n");
754         }
755 
756         removeTrailingNewLine(sm1);
757 
758         zipWriter.addEntry("portal-data-image.sql", sm1);
759         zipWriter.addEntry("portal-data-image.html", sm2);
760     }
761 
762     protected void removeTrailingComma(StringMaker sm) {
763         sm.delete(sm.length() - 2, sm.length());
764     }
765 
766     protected void removeTrailingNewLine(StringMaker sm) {
767         if (sm.length() > 0) {
768             sm.delete(sm.length() - 1, sm.length());
769         }
770     }
771 
772     protected String replaceIds(String content) throws Exception {
773         content = IdReplacer.replaceLongIds(content, "?img_id=", _valueMapper);
774 
775         return content;
776     }
777 
778     private static Log _log = LogFactory.getLog(ExportAction.class);
779 
780     private MemoryValueMapper _valueMapper = new MemoryValueMapper();
781     private Map<Long, Long> _primaryKeys = _valueMapper.getMap();
782     private int _primaryKeyCount;
783 
784 }