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