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