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