001
014
015 package com.liferay.portal.lar;
016
017 import com.liferay.portal.LayoutImportException;
018 import com.liferay.portal.NoSuchPortletPreferencesException;
019 import com.liferay.portal.kernel.exception.PortalException;
020 import com.liferay.portal.kernel.exception.SystemException;
021 import com.liferay.portal.kernel.language.LanguageUtil;
022 import com.liferay.portal.kernel.lar.ExportImportHelperUtil;
023 import com.liferay.portal.kernel.lar.ExportImportPathUtil;
024 import com.liferay.portal.kernel.lar.ExportImportThreadLocal;
025 import com.liferay.portal.kernel.lar.PortletDataContext;
026 import com.liferay.portal.kernel.lar.PortletDataContextFactoryUtil;
027 import com.liferay.portal.kernel.lar.PortletDataHandler;
028 import com.liferay.portal.kernel.lar.PortletDataHandlerKeys;
029 import com.liferay.portal.kernel.log.Log;
030 import com.liferay.portal.kernel.log.LogFactoryUtil;
031 import com.liferay.portal.kernel.staging.StagingUtil;
032 import com.liferay.portal.kernel.util.CharPool;
033 import com.liferay.portal.kernel.util.FileUtil;
034 import com.liferay.portal.kernel.util.GetterUtil;
035 import com.liferay.portal.kernel.util.MapUtil;
036 import com.liferay.portal.kernel.util.ReleaseInfo;
037 import com.liferay.portal.kernel.util.StringBundler;
038 import com.liferay.portal.kernel.util.StringPool;
039 import com.liferay.portal.kernel.util.StringUtil;
040 import com.liferay.portal.kernel.util.Time;
041 import com.liferay.portal.kernel.util.UnicodeProperties;
042 import com.liferay.portal.kernel.util.Validator;
043 import com.liferay.portal.kernel.xml.Document;
044 import com.liferay.portal.kernel.xml.Element;
045 import com.liferay.portal.kernel.xml.Node;
046 import com.liferay.portal.kernel.xml.SAXReaderUtil;
047 import com.liferay.portal.kernel.zip.ZipWriter;
048 import com.liferay.portal.kernel.zip.ZipWriterFactoryUtil;
049 import com.liferay.portal.model.Group;
050 import com.liferay.portal.model.Layout;
051 import com.liferay.portal.model.LayoutConstants;
052 import com.liferay.portal.model.LayoutTypePortlet;
053 import com.liferay.portal.model.Lock;
054 import com.liferay.portal.model.Portlet;
055 import com.liferay.portal.model.PortletConstants;
056 import com.liferay.portal.model.PortletItem;
057 import com.liferay.portal.model.PortletPreferences;
058 import com.liferay.portal.model.User;
059 import com.liferay.portal.service.GroupLocalServiceUtil;
060 import com.liferay.portal.service.LayoutLocalServiceUtil;
061 import com.liferay.portal.service.PortletItemLocalServiceUtil;
062 import com.liferay.portal.service.PortletLocalServiceUtil;
063 import com.liferay.portal.service.PortletPreferencesLocalServiceUtil;
064 import com.liferay.portal.service.ServiceContext;
065 import com.liferay.portal.service.ServiceContextThreadLocal;
066 import com.liferay.portal.service.UserLocalServiceUtil;
067 import com.liferay.portal.util.PortalUtil;
068 import com.liferay.portal.util.PortletKeys;
069 import com.liferay.portlet.PortletPreferencesFactoryUtil;
070 import com.liferay.portlet.asset.model.AssetCategory;
071 import com.liferay.portlet.asset.model.AssetCategoryConstants;
072 import com.liferay.portlet.asset.model.AssetCategoryProperty;
073 import com.liferay.portlet.asset.model.AssetEntry;
074 import com.liferay.portlet.asset.model.AssetLink;
075 import com.liferay.portlet.asset.model.AssetTag;
076 import com.liferay.portlet.asset.model.AssetTagProperty;
077 import com.liferay.portlet.asset.model.AssetVocabulary;
078 import com.liferay.portlet.asset.service.AssetCategoryLocalServiceUtil;
079 import com.liferay.portlet.asset.service.AssetCategoryPropertyLocalServiceUtil;
080 import com.liferay.portlet.asset.service.AssetEntryLocalServiceUtil;
081 import com.liferay.portlet.asset.service.AssetTagLocalServiceUtil;
082 import com.liferay.portlet.asset.service.AssetTagPropertyLocalServiceUtil;
083 import com.liferay.portlet.asset.service.persistence.AssetCategoryUtil;
084 import com.liferay.portlet.asset.service.persistence.AssetVocabularyUtil;
085 import com.liferay.portlet.expando.model.ExpandoColumn;
086 import com.liferay.portlet.messageboards.model.MBDiscussion;
087 import com.liferay.portlet.messageboards.model.MBMessage;
088 import com.liferay.portlet.messageboards.service.MBDiscussionLocalServiceUtil;
089 import com.liferay.portlet.ratings.model.RatingsEntry;
090 import com.liferay.util.xml.DocUtil;
091
092 import java.io.File;
093 import java.io.IOException;
094
095 import java.util.Date;
096 import java.util.List;
097 import java.util.Map;
098 import java.util.Map.Entry;
099
100 import org.apache.commons.lang.time.StopWatch;
101
102
113 public class PortletExporter {
114
115 public void exportPortletData(
116 PortletDataContext portletDataContext, Portlet portlet,
117 Layout layout,
118 javax.portlet.PortletPreferences jxPortletPreferences,
119 Element parentElement)
120 throws Exception {
121
122 if (portlet == null) {
123 return;
124 }
125
126 PortletDataHandler portletDataHandler =
127 portlet.getPortletDataHandlerInstance();
128
129 if (portletDataHandler == null) {
130 return;
131 }
132
133 String portletId = portlet.getPortletId();
134
135 Group liveGroup = layout.getGroup();
136
137 if (liveGroup.isStagingGroup()) {
138 liveGroup = liveGroup.getLiveGroup();
139 }
140
141 boolean staged = liveGroup.isStagedPortlet(portlet.getRootPortletId());
142
143 if (!staged && ExportImportThreadLocal.isLayoutExportInProcess()) {
144 if (_log.isDebugEnabled()) {
145 _log.debug(
146 "Not exporting data for " + portletId +
147 " because it is configured not to be staged");
148 }
149
150 return;
151 }
152
153 if (_log.isDebugEnabled()) {
154 _log.debug("Exporting data for " + portletId);
155 }
156
157 StringBundler sb = new StringBundler(4);
158
159 sb.append(
160 ExportImportPathUtil.getPortletPath(portletDataContext, portletId));
161 sb.append(StringPool.SLASH);
162
163 if (portlet.isPreferencesUniquePerLayout()) {
164 sb.append(layout.getPlid());
165 }
166 else {
167 sb.append(portletDataContext.getScopeGroupId());
168 }
169
170 sb.append("/portlet-data.xml");
171
172 String path = sb.toString();
173
174 if (portletDataContext.isPathProcessed(path)) {
175 return;
176 }
177
178 long lastPublishDate = GetterUtil.getLong(
179 jxPortletPreferences.getValue(
180 "last-publish-date", StringPool.BLANK));
181
182 Date startDate = portletDataContext.getStartDate();
183
184 if ((lastPublishDate > 0) && (startDate != null) &&
185 (lastPublishDate < startDate.getTime())) {
186
187 portletDataContext.setStartDate(new Date(lastPublishDate));
188 }
189
190 String data = null;
191
192 long groupId = portletDataContext.getGroupId();
193
194 portletDataContext.setGroupId(portletDataContext.getScopeGroupId());
195
196 portletDataContext.clearScopedPrimaryKeys();
197
198 try {
199 data = portletDataHandler.exportData(
200 portletDataContext, portletId, jxPortletPreferences);
201 }
202 catch (Exception e) {
203 throw new SystemException(e);
204 }
205 finally {
206 portletDataContext.setGroupId(groupId);
207 portletDataContext.setStartDate(startDate);
208 }
209
210 if (Validator.isNull(data)) {
211 if (_log.isDebugEnabled()) {
212 _log.debug(
213 "Not exporting data for " + portletId +
214 " because null data was returned");
215 }
216
217 return;
218 }
219
220 Element portletDataElement = parentElement.addElement("portlet-data");
221
222 portletDataElement.addAttribute("path", path);
223
224 portletDataContext.addZipEntry(path, data);
225
226 Date endDate = portletDataContext.getEndDate();
227
228 if (endDate != null) {
229 StagingUtil.updateLastPublishDate(
230 portletId, jxPortletPreferences, endDate);
231 }
232 }
233
234 @Deprecated
235 public byte[] exportPortletInfo(
236 long plid, long groupId, String portletId,
237 Map<String, String[]> parameterMap, Date startDate, Date endDate)
238 throws Exception {
239
240 File file = exportPortletInfoAsFile(
241 plid, groupId, portletId, parameterMap, startDate, endDate);
242
243 try {
244 return FileUtil.getBytes(file);
245 }
246 catch (IOException ioe) {
247 throw new SystemException(ioe);
248 }
249 finally {
250 file.delete();
251 }
252 }
253
254 public File exportPortletInfoAsFile(
255 long plid, long groupId, String portletId,
256 Map<String, String[]> parameterMap, Date startDate, Date endDate)
257 throws Exception {
258
259 try {
260 ExportImportThreadLocal.setPortletExportInProcess(true);
261
262 return doExportPortletInfoAsFile(
263 plid, groupId, portletId, parameterMap, startDate, endDate);
264 }
265 finally {
266 ExportImportThreadLocal.setPortletExportInProcess(false);
267 }
268 }
269
270 protected File doExportPortletInfoAsFile(
271 long plid, long groupId, String portletId,
272 Map<String, String[]> parameterMap, Date startDate, Date endDate)
273 throws Exception {
274
275 boolean exportPermissions = MapUtil.getBoolean(
276 parameterMap, PortletDataHandlerKeys.PERMISSIONS);
277 boolean exportPortletConfiguration = MapUtil.getBoolean(
278 parameterMap, PortletDataHandlerKeys.PORTLET_CONFIGURATION);
279 boolean exportPortletConfigurationAll = MapUtil.getBoolean(
280 parameterMap, PortletDataHandlerKeys.PORTLET_CONFIGURATION_ALL);
281 boolean exportPortletData = MapUtil.getBoolean(
282 parameterMap, PortletDataHandlerKeys.PORTLET_DATA);
283 boolean exportPortletDataAll = MapUtil.getBoolean(
284 parameterMap, PortletDataHandlerKeys.PORTLET_DATA_ALL);
285
286 String rootPortletId = PortletConstants.getRootPortletId(portletId);
287
288 if (exportPortletDataAll) {
289 exportPortletData = true;
290 }
291 else if (parameterMap.containsKey(
292 PortletDataHandlerKeys.PORTLET_DATA + StringPool.UNDERLINE +
293 rootPortletId)) {
294
295 exportPortletData = MapUtil.getBoolean(
296 parameterMap,
297 PortletDataHandlerKeys.PORTLET_DATA + StringPool.UNDERLINE +
298 rootPortletId);
299 }
300
301 boolean exportPortletArchivedSetups = exportPortletConfiguration;
302 boolean exportPortletSetup = exportPortletConfiguration;
303 boolean exportPortletUserPreferences = exportPortletConfiguration;
304
305 if (exportPortletConfigurationAll) {
306 exportPortletArchivedSetups =
307 MapUtil.getBoolean(
308 parameterMap,
309 PortletDataHandlerKeys.PORTLET_ARCHIVED_SETUPS_ALL);
310 exportPortletSetup =
311 MapUtil.getBoolean(
312 parameterMap, PortletDataHandlerKeys.PORTLET_SETUP_ALL);
313 exportPortletUserPreferences =
314 MapUtil.getBoolean(
315 parameterMap,
316 PortletDataHandlerKeys.PORTLET_USER_PREFERENCES_ALL);
317 }
318 else if (parameterMap.containsKey(
319 PortletDataHandlerKeys.PORTLET_CONFIGURATION + "_" +
320 rootPortletId)) {
321
322 exportPortletConfiguration =
323 exportPortletConfiguration &&
324 MapUtil.getBoolean(
325 parameterMap,
326 PortletDataHandlerKeys.PORTLET_CONFIGURATION +
327 StringPool.UNDERLINE + rootPortletId);
328
329 exportPortletArchivedSetups =
330 exportPortletConfiguration &&
331 MapUtil.getBoolean(
332 parameterMap,
333 PortletDataHandlerKeys.PORTLET_ARCHIVED_SETUPS +
334 StringPool.UNDERLINE + rootPortletId);
335 exportPortletSetup =
336 exportPortletConfiguration &&
337 MapUtil.getBoolean(
338 parameterMap,
339 PortletDataHandlerKeys.PORTLET_SETUP +
340 StringPool.UNDERLINE + rootPortletId);
341 exportPortletUserPreferences =
342 exportPortletConfiguration &&
343 MapUtil.getBoolean(
344 parameterMap,
345 PortletDataHandlerKeys.PORTLET_USER_PREFERENCES +
346 StringPool.UNDERLINE + rootPortletId);
347 }
348
349 if (_log.isDebugEnabled()) {
350 _log.debug("Export permissions " + exportPermissions);
351 _log.debug(
352 "Export portlet archived setups " +
353 exportPortletArchivedSetups);
354 _log.debug("Export portlet data " + exportPortletData);
355 _log.debug("Export all portlet data " + exportPortletDataAll);
356 _log.debug(
357 "Export portlet configuration " + exportPortletConfiguration);
358 _log.debug(
359 "Export portlet user preferences " +
360 exportPortletUserPreferences);
361 }
362
363 StopWatch stopWatch = null;
364
365 if (_log.isInfoEnabled()) {
366 stopWatch = new StopWatch();
367
368 stopWatch.start();
369 }
370
371 LayoutCache layoutCache = new LayoutCache();
372
373 Layout layout = LayoutLocalServiceUtil.getLayout(plid);
374
375 if (!layout.isTypeControlPanel() && !layout.isTypePanel() &&
376 !layout.isTypePortlet()) {
377
378 throw new LayoutImportException(
379 "Layout type " + layout.getType() + " is not valid");
380 }
381
382 ServiceContext serviceContext =
383 ServiceContextThreadLocal.getServiceContext();
384
385 if (serviceContext == null) {
386 serviceContext = new ServiceContext();
387
388 serviceContext.setCompanyId(layout.getCompanyId());
389 serviceContext.setSignedIn(false);
390
391 long defaultUserId = UserLocalServiceUtil.getDefaultUserId(
392 layout.getCompanyId());
393
394 serviceContext.setUserId(defaultUserId);
395
396 ServiceContextThreadLocal.pushServiceContext(serviceContext);
397 }
398
399 long layoutSetBranchId = MapUtil.getLong(
400 parameterMap, "layoutSetBranchId");
401
402 serviceContext.setAttribute("layoutSetBranchId", layoutSetBranchId);
403
404 ZipWriter zipWriter = ZipWriterFactoryUtil.getZipWriter();
405
406 long scopeGroupId = groupId;
407
408 javax.portlet.PortletPreferences jxPortletPreferences =
409 PortletPreferencesFactoryUtil.getLayoutPortletSetup(
410 layout, portletId);
411
412 String scopeType = GetterUtil.getString(
413 jxPortletPreferences.getValue("lfrScopeType", null));
414 String scopeLayoutUuid = GetterUtil.getString(
415 jxPortletPreferences.getValue("lfrScopeLayoutUuid", null));
416
417 if (Validator.isNotNull(scopeType)) {
418 Group scopeGroup = null;
419
420 if (scopeType.equals("company")) {
421 scopeGroup = GroupLocalServiceUtil.getCompanyGroup(
422 layout.getCompanyId());
423 }
424 else if (Validator.isNotNull(scopeLayoutUuid)) {
425 scopeGroup = layout.getScopeGroup();
426 }
427
428 if (scopeGroup != null) {
429 scopeGroupId = scopeGroup.getGroupId();
430 }
431 }
432
433 PortletDataContext portletDataContext =
434 PortletDataContextFactoryUtil.createExportPortletDataContext(
435 layout.getCompanyId(), scopeGroupId, parameterMap, startDate,
436 endDate, zipWriter);
437
438 portletDataContext.setPortetDataContextListener(
439 new PortletDataContextListenerImpl(portletDataContext));
440
441 portletDataContext.setPlid(plid);
442 portletDataContext.setOldPlid(plid);
443 portletDataContext.setScopeType(scopeType);
444 portletDataContext.setScopeLayoutUuid(scopeLayoutUuid);
445
446 Document document = SAXReaderUtil.createDocument();
447
448 Element rootElement = document.addElement("root");
449
450 Element headerElement = rootElement.addElement("header");
451
452 headerElement.addAttribute(
453 "available-locales",
454 StringUtil.merge(
455 LanguageUtil.getAvailableLocales(
456 PortalUtil.getSiteGroupId(
457 portletDataContext.getScopeGroupId()))));
458 headerElement.addAttribute(
459 "build-number", String.valueOf(ReleaseInfo.getBuildNumber()));
460 headerElement.addAttribute("export-date", Time.getRFC822());
461
462 if (portletDataContext.hasDateRange()) {
463 headerElement.addAttribute(
464 "start-date",
465 String.valueOf(portletDataContext.getStartDate()));
466 headerElement.addAttribute(
467 "end-date", String.valueOf(portletDataContext.getEndDate()));
468 }
469
470 headerElement.addAttribute("type", "portlet");
471 headerElement.addAttribute(
472 "company-id", String.valueOf(portletDataContext.getCompanyId()));
473 headerElement.addAttribute(
474 "company-group-id",
475 String.valueOf(portletDataContext.getCompanyGroupId()));
476 headerElement.addAttribute("group-id", String.valueOf(scopeGroupId));
477 headerElement.addAttribute(
478 "user-personal-site-group-id",
479 String.valueOf(portletDataContext.getUserPersonalSiteGroupId()));
480 headerElement.addAttribute(
481 "private-layout", String.valueOf(layout.isPrivateLayout()));
482 headerElement.addAttribute(
483 "root-portlet-id", PortletConstants.getRootPortletId(portletId));
484
485 Element missingReferencesElement = rootElement.addElement(
486 "missing-references");
487
488 portletDataContext.setMissingReferencesElement(
489 missingReferencesElement);
490
491 exportPortlet(
492 portletDataContext, layoutCache, portletId, layout, rootElement,
493 exportPermissions, exportPortletArchivedSetups, exportPortletData,
494 exportPortletSetup, exportPortletUserPreferences);
495
496 exportAssetCategories(portletDataContext);
497 exportAssetLinks(portletDataContext);
498 exportAssetTags(portletDataContext);
499 exportComments(portletDataContext);
500 exportExpandoTables(portletDataContext);
501 exportLocks(portletDataContext);
502
503 _deletionSystemEventExporter.exportDeletionSystemEvents(
504 portletDataContext);
505
506 if (exportPermissions) {
507 _permissionExporter.exportPortletDataPermissions(
508 portletDataContext);
509 }
510
511 exportRatingsEntries(portletDataContext, rootElement);
512
513 ExportImportHelperUtil.writeManifestSummary(
514 document, portletDataContext.getManifestSummary());
515
516 if (_log.isInfoEnabled()) {
517 _log.info("Exporting portlet took " + stopWatch.getTime() + " ms");
518 }
519
520 try {
521 portletDataContext.addZipEntry(
522 "/manifest.xml", document.formattedString());
523 }
524 catch (IOException ioe) {
525 throw new SystemException(ioe);
526 }
527
528 return zipWriter.getFile();
529 }
530
531 protected void exportAssetCategories(PortletDataContext portletDataContext)
532 throws Exception {
533
534 Document document = SAXReaderUtil.createDocument();
535
536 Element rootElement = document.addElement("categories-hierarchy");
537
538 exportAssetCategories(portletDataContext, rootElement);
539
540 portletDataContext.addZipEntry(
541 ExportImportPathUtil.getRootPath(portletDataContext) +
542 "/categories-hierarchy.xml",
543 document.formattedString());
544 }
545
546 protected void exportAssetCategories(
547 PortletDataContext portletDataContext, Element rootElement)
548 throws Exception {
549
550 Element assetsElement = rootElement.element("assets");
551
552 if (assetsElement == null) {
553 assetsElement = rootElement.addElement("assets");
554 }
555
556 Element assetCategoriesElement = rootElement.element("categories");
557
558 if (assetCategoriesElement == null) {
559 assetCategoriesElement = rootElement.addElement("categories");
560 }
561
562 Element assetVocabulariesElement = rootElement.element("vocabularies");
563
564 if (assetVocabulariesElement == null) {
565 assetVocabulariesElement = rootElement.addElement("vocabularies");
566 }
567
568 Map<String, String[]> assetCategoryUuidsMap =
569 portletDataContext.getAssetCategoryUuidsMap();
570
571 for (Map.Entry<String, String[]> entry :
572 assetCategoryUuidsMap.entrySet()) {
573
574 String[] assetCategoryEntryParts = StringUtil.split(
575 entry.getKey(), CharPool.POUND);
576
577 String className = assetCategoryEntryParts[0];
578 String classPK = assetCategoryEntryParts[1];
579
580 Element assetElement = assetsElement.addElement("asset");
581
582 assetElement.addAttribute("class-name", className);
583 assetElement.addAttribute("class-pk", classPK);
584 assetElement.addAttribute(
585 "category-uuids", StringUtil.merge(entry.getValue()));
586
587 List<AssetCategory> assetCategories =
588 AssetCategoryLocalServiceUtil.getCategories(
589 className, GetterUtil.getLong(classPK));
590
591 for (AssetCategory assestCategory : assetCategories) {
592 exportAssetCategory(
593 portletDataContext, assetVocabulariesElement,
594 assetCategoriesElement, assestCategory);
595 }
596 }
597 }
598
599 protected void exportAssetCategory(
600 PortletDataContext portletDataContext,
601 Element assetVocabulariesElement, Element assetCategoriesElement,
602 AssetCategory assetCategory)
603 throws Exception {
604
605 exportAssetVocabulary(
606 portletDataContext, assetVocabulariesElement,
607 assetCategory.getVocabularyId());
608
609 if (assetCategory.getParentCategoryId() !=
610 AssetCategoryConstants.DEFAULT_PARENT_CATEGORY_ID) {
611
612 exportAssetCategory(
613 portletDataContext, assetVocabulariesElement,
614 assetCategoriesElement, assetCategory.getParentCategoryId());
615 }
616
617 String path = getAssetCategoryPath(
618 portletDataContext, assetCategory.getCategoryId());
619
620 if (!portletDataContext.isPathNotProcessed(path)) {
621 return;
622 }
623
624 Element assetCategoryElement = assetCategoriesElement.addElement(
625 "category");
626
627 assetCategoryElement.addAttribute("path", path);
628
629 assetCategory.setUserUuid(assetCategory.getUserUuid());
630
631 portletDataContext.addZipEntry(path, assetCategory);
632
633 List<AssetCategoryProperty> assetCategoryProperties =
634 AssetCategoryPropertyLocalServiceUtil.getCategoryProperties(
635 assetCategory.getCategoryId());
636
637 for (AssetCategoryProperty assetCategoryProperty :
638 assetCategoryProperties) {
639
640 Element propertyElement = assetCategoryElement.addElement(
641 "property");
642
643 propertyElement.addAttribute(
644 "userUuid", assetCategoryProperty.getUserUuid());
645 propertyElement.addAttribute("key", assetCategoryProperty.getKey());
646 propertyElement.addAttribute(
647 "value", assetCategoryProperty.getValue());
648 }
649
650 portletDataContext.addPermissions(
651 AssetCategory.class, assetCategory.getCategoryId());
652 }
653
654 protected void exportAssetCategory(
655 PortletDataContext portletDataContext,
656 Element assetVocabulariesElement, Element assetCategoriesElement,
657 long assetCategoryId)
658 throws Exception {
659
660 AssetCategory assetCategory = AssetCategoryUtil.fetchByPrimaryKey(
661 assetCategoryId);
662
663 if (assetCategory != null) {
664 exportAssetCategory(
665 portletDataContext, assetVocabulariesElement,
666 assetCategoriesElement, assetCategory);
667 }
668 }
669
670 protected void exportAssetLinks(PortletDataContext portletDataContext)
671 throws Exception {
672
673 Document document = SAXReaderUtil.createDocument();
674
675 Element rootElement = document.addElement("links");
676
677 Map<String, List<AssetLink>> assetLinksMap =
678 portletDataContext.getAssetLinksMap();
679
680 for (Entry<String, List<AssetLink>> entry : assetLinksMap.entrySet()) {
681 String[] assetLinkNameParts = StringUtil.split(
682 entry.getKey(), CharPool.POUND);
683
684 List<AssetLink> assetLinks = entry.getValue();
685
686 String sourceAssetEntryUuid = assetLinkNameParts[0];
687
688 Element assetElement = rootElement.addElement("asset-link-group");
689
690 assetElement.addAttribute("source-uuid", sourceAssetEntryUuid);
691
692 for (AssetLink assetLink : assetLinks) {
693 String path = getAssetLinkPath(
694 portletDataContext, assetLink.getLinkId());
695
696 if (!portletDataContext.isPathNotProcessed(path)) {
697 return;
698 }
699
700 Element assetLinkElement = assetElement.addElement(
701 "asset-link");
702
703 assetLinkElement.addAttribute("path", path);
704
705 AssetEntry targetAssetEntry =
706 AssetEntryLocalServiceUtil.fetchAssetEntry(
707 assetLink.getEntryId2());
708
709 assetLinkElement.addAttribute(
710 "target-uuid", targetAssetEntry.getClassUuid());
711
712 portletDataContext.addZipEntry(path, assetLink);
713 }
714 }
715
716 portletDataContext.addZipEntry(
717 ExportImportPathUtil.getRootPath(portletDataContext) + "/links.xml",
718 document.formattedString());
719 }
720
721 protected void exportAssetTag(
722 PortletDataContext portletDataContext, AssetTag assetTag,
723 Element assetTagsElement)
724 throws PortalException, SystemException {
725
726 String path = getAssetTagPath(portletDataContext, assetTag.getTagId());
727
728 if (!portletDataContext.isPathNotProcessed(path)) {
729 return;
730 }
731
732 Element assetTagElement = assetTagsElement.addElement("tag");
733
734 assetTagElement.addAttribute("path", path);
735
736 assetTag.setUserUuid(assetTag.getUserUuid());
737
738 portletDataContext.addZipEntry(path, assetTag);
739
740 List<AssetTagProperty> assetTagProperties =
741 AssetTagPropertyLocalServiceUtil.getTagProperties(
742 assetTag.getTagId());
743
744 for (AssetTagProperty assetTagProperty : assetTagProperties) {
745 Element propertyElement = assetTagElement.addElement("property");
746
747 propertyElement.addAttribute("key", assetTagProperty.getKey());
748 propertyElement.addAttribute("value", assetTagProperty.getValue());
749 }
750
751 portletDataContext.addPermissions(AssetTag.class, assetTag.getTagId());
752 }
753
754 protected void exportAssetTags(PortletDataContext portletDataContext)
755 throws Exception {
756
757 Document document = SAXReaderUtil.createDocument();
758
759 Element rootElement = document.addElement("tags");
760
761 Map<String, String[]> assetTagNamesMap =
762 portletDataContext.getAssetTagNamesMap();
763
764 if (assetTagNamesMap.isEmpty()) {
765 return;
766 }
767
768 for (Map.Entry<String, String[]> entry : assetTagNamesMap.entrySet()) {
769 String[] assetTagNameParts = StringUtil.split(
770 entry.getKey(), CharPool.POUND);
771
772 String className = assetTagNameParts[0];
773 String classPK = assetTagNameParts[1];
774
775 Element assetElement = rootElement.addElement("asset");
776
777 assetElement.addAttribute("class-name", className);
778 assetElement.addAttribute("class-pk", classPK);
779 assetElement.addAttribute(
780 "tags", StringUtil.merge(entry.getValue()));
781
782 List<AssetTag> assetTags = AssetTagLocalServiceUtil.getTags(
783 className, GetterUtil.getLong(classPK));
784
785 for (AssetTag assetTag : assetTags) {
786 exportAssetTag(portletDataContext, assetTag, rootElement);
787 }
788 }
789
790 portletDataContext.addZipEntry(
791 ExportImportPathUtil.getRootPath(portletDataContext) + "/tags.xml",
792 document.formattedString());
793 }
794
795 protected void exportAssetVocabulary(
796 PortletDataContext portletDataContext,
797 Element assetVocabulariesElement, AssetVocabulary assetVocabulary)
798 throws Exception {
799
800 String path = getAssetVocabulariesPath(
801 portletDataContext, assetVocabulary.getVocabularyId());
802
803 if (!portletDataContext.isPathNotProcessed(path)) {
804 return;
805 }
806
807 Element assetVocabularyElement = assetVocabulariesElement.addElement(
808 "vocabulary");
809
810 assetVocabularyElement.addAttribute("path", path);
811
812 assetVocabulary.setUserUuid(assetVocabulary.getUserUuid());
813
814 portletDataContext.addZipEntry(path, assetVocabulary);
815
816 portletDataContext.addPermissions(
817 AssetVocabulary.class, assetVocabulary.getVocabularyId());
818 }
819
820 protected void exportAssetVocabulary(
821 PortletDataContext portletDataContext,
822 Element assetVocabulariesElement, long assetVocabularyId)
823 throws Exception {
824
825 AssetVocabulary assetVocabulary = AssetVocabularyUtil.findByPrimaryKey(
826 assetVocabularyId);
827
828 exportAssetVocabulary(
829 portletDataContext, assetVocabulariesElement, assetVocabulary);
830 }
831
832 protected void exportComments(PortletDataContext portletDataContext)
833 throws Exception {
834
835 Document document = SAXReaderUtil.createDocument();
836
837 Element rootElement = document.addElement("comments");
838
839 Map<String, List<MBMessage>> commentsMap =
840 portletDataContext.getComments();
841
842 for (Map.Entry<String, List<MBMessage>> entry :
843 commentsMap.entrySet()) {
844
845 String[] commentParts = StringUtil.split(
846 entry.getKey(), CharPool.POUND);
847
848 String className = commentParts[0];
849 String classPK = commentParts[1];
850
851 String commentsPath = getCommentsPath(
852 portletDataContext, className, classPK);
853
854 Element assetElement = rootElement.addElement("asset");
855
856 assetElement.addAttribute("path", commentsPath);
857 assetElement.addAttribute("class-name", className);
858 assetElement.addAttribute("class-pk", classPK);
859
860 List<MBMessage> mbMessages = entry.getValue();
861
862 for (MBMessage mbMessage : mbMessages) {
863 String commentPath = getCommentPath(
864 portletDataContext, className, classPK, mbMessage);
865
866 if (portletDataContext.isPathNotProcessed(commentPath)) {
867 User user = UserLocalServiceUtil.fetchUser(
868 mbMessage.getUserId());
869
870 if (user == null) {
871 continue;
872 }
873
874 portletDataContext.addZipEntry(commentPath, mbMessage);
875
876 MBDiscussion mbDiscussion =
877 MBDiscussionLocalServiceUtil.getDiscussion(
878 className, GetterUtil.getLong(classPK));
879
880 portletDataContext.addReferenceElement(
881 mbDiscussion, assetElement, user,
882 PortletDataContext.REFERENCE_TYPE_WEAK, true);
883 }
884 }
885 }
886
887 portletDataContext.addZipEntry(
888 ExportImportPathUtil.getRootPath(portletDataContext) +
889 "/comments.xml",
890 document.formattedString());
891 }
892
893 protected void exportExpandoTables(PortletDataContext portletDataContext)
894 throws Exception {
895
896 Document document = SAXReaderUtil.createDocument();
897
898 Element rootElement = document.addElement("expando-tables");
899
900 Map<String, List<ExpandoColumn>> expandoColumnsMap =
901 portletDataContext.getExpandoColumns();
902
903 for (Map.Entry<String, List<ExpandoColumn>> entry :
904 expandoColumnsMap.entrySet()) {
905
906 String className = entry.getKey();
907
908 Element expandoTableElement = rootElement.addElement(
909 "expando-table");
910
911 expandoTableElement.addAttribute("class-name", className);
912
913 List<ExpandoColumn> expandoColumns = entry.getValue();
914
915 for (ExpandoColumn expandoColumn : expandoColumns) {
916 Element expandoColumnElement = expandoTableElement.addElement(
917 "expando-column");
918
919 expandoColumnElement.addAttribute(
920 "column-id", String.valueOf(expandoColumn.getColumnId()));
921 expandoColumnElement.addAttribute(
922 "name", expandoColumn.getName());
923 expandoColumnElement.addAttribute(
924 "type", String.valueOf(expandoColumn.getType()));
925
926 DocUtil.add(
927 expandoColumnElement, "default-data",
928 expandoColumn.getDefaultData());
929
930 Element typeSettingsElement = expandoColumnElement.addElement(
931 "type-settings");
932
933 UnicodeProperties typeSettingsProperties =
934 expandoColumn.getTypeSettingsProperties();
935
936 typeSettingsElement.addCDATA(typeSettingsProperties.toString());
937 }
938 }
939
940 portletDataContext.addZipEntry(
941 ExportImportPathUtil.getRootPath(portletDataContext) +
942 "/expando-tables.xml",
943 document.formattedString());
944 }
945
946 protected void exportLocks(PortletDataContext portletDataContext)
947 throws Exception {
948
949 Document document = SAXReaderUtil.createDocument();
950
951 Element rootElement = document.addElement("locks");
952
953 Map<String, Lock> locksMap = portletDataContext.getLocks();
954
955 for (Map.Entry<String, Lock> entry : locksMap.entrySet()) {
956 Lock lock = entry.getValue();
957
958 String entryKey = entry.getKey();
959
960 int pos = entryKey.indexOf(CharPool.POUND);
961
962 String className = entryKey.substring(0, pos);
963 String key = entryKey.substring(pos + 1);
964
965 String path = getLockPath(portletDataContext, className, key, lock);
966
967 Element assetElement = rootElement.addElement("asset");
968
969 assetElement.addAttribute("path", path);
970 assetElement.addAttribute("class-name", className);
971 assetElement.addAttribute("key", key);
972
973 if (portletDataContext.isPathNotProcessed(path)) {
974 portletDataContext.addZipEntry(path, lock);
975 }
976 }
977
978 portletDataContext.addZipEntry(
979 ExportImportPathUtil.getRootPath(portletDataContext) + "/locks.xml",
980 document.formattedString());
981 }
982
983 protected void exportPortlet(
984 PortletDataContext portletDataContext, LayoutCache layoutCache,
985 String portletId, Layout layout, Element parentElement,
986 boolean exportPermissions, boolean exportPortletArchivedSetups,
987 boolean exportPortletData, boolean exportPortletSetup,
988 boolean exportPortletUserPreferences)
989 throws Exception {
990
991 long plid = PortletKeys.PREFS_OWNER_ID_DEFAULT;
992 long layoutId = LayoutConstants.DEFAULT_PARENT_LAYOUT_ID;
993
994 if (layout != null) {
995 plid = layout.getPlid();
996 layoutId = layout.getLayoutId();
997 }
998
999 Portlet portlet = PortletLocalServiceUtil.getPortletById(
1000 portletDataContext.getCompanyId(), portletId);
1001
1002 if (portlet == null) {
1003 if (_log.isDebugEnabled()) {
1004 _log.debug(
1005 "Do not export portlet " + portletId +
1006 " because the portlet does not exist");
1007 }
1008
1009 return;
1010 }
1011
1012 if (!portlet.isInstanceable() &&
1013 !portlet.isPreferencesUniquePerLayout() &&
1014 portletDataContext.hasNotUniquePerLayout(portletId)) {
1015
1016 return;
1017 }
1018
1019 Document document = SAXReaderUtil.createDocument();
1020
1021 Element portletElement = document.addElement("portlet");
1022
1023 portletElement.addAttribute("portlet-id", portletId);
1024 portletElement.addAttribute(
1025 "root-portlet-id", PortletConstants.getRootPortletId(portletId));
1026 portletElement.addAttribute("old-plid", String.valueOf(plid));
1027 portletElement.addAttribute(
1028 "scope-layout-type", portletDataContext.getScopeType());
1029 portletElement.addAttribute(
1030 "scope-layout-uuid", portletDataContext.getScopeLayoutUuid());
1031 portletElement.addAttribute(
1032 "private-layout", String.valueOf(layout.isPrivateLayout()));
1033
1034
1035
1036 if (exportPortletData) {
1037 javax.portlet.PortletPreferences jxPortletPreferences =
1038 PortletPreferencesFactoryUtil.getStrictPortletSetup(
1039 layout, portletId);
1040
1041 if (!portlet.isPreferencesUniquePerLayout()) {
1042 StringBundler sb = new StringBundler(5);
1043
1044 sb.append(portletId);
1045 sb.append(StringPool.AT);
1046 sb.append(portletDataContext.getScopeType());
1047 sb.append(StringPool.AT);
1048 sb.append(portletDataContext.getScopeLayoutUuid());
1049
1050 String dataKey = sb.toString();
1051
1052 if (!portletDataContext.hasNotUniquePerLayout(dataKey)) {
1053 portletDataContext.putNotUniquePerLayout(dataKey);
1054
1055 exportPortletData(
1056 portletDataContext, portlet, layout,
1057 jxPortletPreferences, portletElement);
1058 }
1059 }
1060 else {
1061 exportPortletData(
1062 portletDataContext, portlet, layout, jxPortletPreferences,
1063 portletElement);
1064 }
1065 }
1066
1067
1068
1069 if (exportPortletSetup) {
1070
1071
1072
1073 exportPortletPreferences(
1074 portletDataContext, portletDataContext.getCompanyId(),
1075 PortletKeys.PREFS_OWNER_TYPE_COMPANY, false, layout, plid,
1076 portlet.getRootPortletId(), portletElement);
1077
1078
1079
1080 exportPortletPreferences(
1081 portletDataContext, portletDataContext.getScopeGroupId(),
1082 PortletKeys.PREFS_OWNER_TYPE_GROUP, false, layout,
1083 PortletKeys.PREFS_PLID_SHARED, portlet.getRootPortletId(),
1084 portletElement);
1085
1086
1087
1088 exportPortletPreferences(
1089 portletDataContext, PortletKeys.PREFS_OWNER_ID_DEFAULT,
1090 PortletKeys.PREFS_OWNER_TYPE_LAYOUT, false, layout, plid,
1091 portletId, portletElement);
1092 }
1093
1094
1095
1096 if (exportPortletUserPreferences) {
1097 List<PortletPreferences> portletPreferencesList =
1098 PortletPreferencesLocalServiceUtil.getPortletPreferences(
1099 PortletKeys.PREFS_OWNER_TYPE_USER, plid, portletId);
1100
1101 for (PortletPreferences portletPreferences :
1102 portletPreferencesList) {
1103
1104 boolean defaultUser = false;
1105
1106 if (portletPreferences.getOwnerId() ==
1107 PortletKeys.PREFS_OWNER_ID_DEFAULT) {
1108
1109 defaultUser = true;
1110 }
1111
1112 exportPortletPreferences(
1113 portletDataContext, portletPreferences.getOwnerId(),
1114 PortletKeys.PREFS_OWNER_TYPE_USER, defaultUser, layout,
1115 plid, portletId, portletElement);
1116 }
1117
1118 try {
1119 PortletPreferences groupPortletPreferences =
1120 PortletPreferencesLocalServiceUtil.getPortletPreferences(
1121 portletDataContext.getScopeGroupId(),
1122 PortletKeys.PREFS_OWNER_TYPE_GROUP,
1123 PortletKeys.PREFS_PLID_SHARED,
1124 portlet.getRootPortletId());
1125
1126 exportPortletPreference(
1127 portletDataContext, portletDataContext.getScopeGroupId(),
1128 PortletKeys.PREFS_OWNER_TYPE_GROUP, false,
1129 groupPortletPreferences, portlet.getRootPortletId(),
1130 PortletKeys.PREFS_PLID_SHARED, portletElement);
1131 }
1132 catch (NoSuchPortletPreferencesException nsppe) {
1133 }
1134 }
1135
1136
1137
1138 if (exportPortletArchivedSetups) {
1139 String rootPortletId = PortletConstants.getRootPortletId(portletId);
1140
1141 List<PortletItem> portletItems =
1142 PortletItemLocalServiceUtil.getPortletItems(
1143 portletDataContext.getGroupId(), rootPortletId,
1144 PortletPreferences.class.getName());
1145
1146 for (PortletItem portletItem : portletItems) {
1147 exportPortletPreferences(
1148 portletDataContext, portletItem.getPortletItemId(),
1149 PortletKeys.PREFS_OWNER_TYPE_ARCHIVED, false, null, plid,
1150 portletItem.getPortletId(), portletElement);
1151 }
1152 }
1153
1154
1155
1156 if (exportPermissions) {
1157 _permissionExporter.exportPortletPermissions(
1158 portletDataContext, layoutCache, portletId, layout,
1159 portletElement);
1160 }
1161
1162
1163
1164 StringBundler pathSB = new StringBundler(4);
1165
1166 pathSB.append(
1167 ExportImportPathUtil.getPortletPath(portletDataContext, portletId));
1168 pathSB.append(StringPool.SLASH);
1169 pathSB.append(plid);
1170 pathSB.append("/portlet.xml");
1171
1172 String path = pathSB.toString();
1173
1174 Element element = parentElement.addElement("portlet");
1175
1176 element.addAttribute("portlet-id", portletId);
1177 element.addAttribute("layout-id", String.valueOf(layoutId));
1178 element.addAttribute("path", path);
1179 element.addAttribute("portlet-data", String.valueOf(exportPortletData));
1180
1181 StringBundler configurationOptionsSB = new StringBundler(6);
1182
1183 if (exportPortletSetup) {
1184 configurationOptionsSB.append("setup");
1185 configurationOptionsSB.append(StringPool.COMMA);
1186 }
1187
1188 if (exportPortletArchivedSetups) {
1189 configurationOptionsSB.append("archived-setups");
1190 configurationOptionsSB.append(StringPool.COMMA);
1191 }
1192
1193 if (exportPortletUserPreferences) {
1194 configurationOptionsSB.append("user-preferences");
1195 configurationOptionsSB.append(StringPool.COMMA);
1196 }
1197
1198 if (configurationOptionsSB.index() > 0) {
1199 configurationOptionsSB.setIndex(configurationOptionsSB.index() -1);
1200 }
1201
1202 element.addAttribute(
1203 "portlet-configuration", configurationOptionsSB.toString());
1204
1205 if (portletDataContext.isPathNotProcessed(path)) {
1206 try {
1207 portletDataContext.addZipEntry(
1208 path, document.formattedString());
1209 }
1210 catch (IOException ioe) {
1211 if (_log.isWarnEnabled()) {
1212 _log.warn(ioe.getMessage());
1213 }
1214 }
1215
1216 portletDataContext.addPrimaryKey(String.class, path);
1217 }
1218 }
1219
1220 protected void exportPortletPreference(
1221 PortletDataContext portletDataContext, long ownerId, int ownerType,
1222 boolean defaultUser, PortletPreferences portletPreferences,
1223 String portletId, long plid, Element parentElement)
1224 throws Exception {
1225
1226 String preferencesXML = portletPreferences.getPreferences();
1227
1228 if (Validator.isNull(preferencesXML)) {
1229 preferencesXML = PortletConstants.DEFAULT_PREFERENCES;
1230 }
1231
1232 javax.portlet.PortletPreferences jxPortletPreferences =
1233 PortletPreferencesFactoryUtil.fromDefaultXML(preferencesXML);
1234
1235 Portlet portlet = PortletLocalServiceUtil.getPortletById(
1236 portletDataContext.getCompanyId(), portletId);
1237
1238 Element portletPreferencesElement = parentElement.addElement(
1239 "portlet-preferences");
1240
1241 if (portlet != null) {
1242 Element exportDataRootElement =
1243 portletDataContext.getExportDataRootElement();
1244
1245 try {
1246 portletDataContext.clearScopedPrimaryKeys();
1247
1248 Element preferenceDataElement =
1249 portletPreferencesElement.addElement("preference-data");
1250
1251 portletDataContext.setExportDataRootElement(
1252 preferenceDataElement);
1253
1254 PortletDataHandler portletDataHandler =
1255 portlet.getPortletDataHandlerInstance();
1256
1257 jxPortletPreferences =
1258 portletDataHandler.processExportPortletPreferences(
1259 portletDataContext, portletId, jxPortletPreferences,
1260 parentElement);
1261 }
1262 finally {
1263 portletDataContext.setExportDataRootElement(
1264 exportDataRootElement);
1265 }
1266 }
1267
1268 Document document = SAXReaderUtil.read(
1269 PortletPreferencesFactoryUtil.toXML(jxPortletPreferences));
1270
1271 Element rootElement = document.getRootElement();
1272
1273 rootElement.addAttribute("owner-id", String.valueOf(ownerId));
1274 rootElement.addAttribute("owner-type", String.valueOf(ownerType));
1275 rootElement.addAttribute("default-user", String.valueOf(defaultUser));
1276 rootElement.addAttribute("plid", String.valueOf(plid));
1277 rootElement.addAttribute("portlet-id", portletId);
1278
1279 if (ownerType == PortletKeys.PREFS_OWNER_TYPE_ARCHIVED) {
1280 PortletItem portletItem =
1281 PortletItemLocalServiceUtil.getPortletItem(ownerId);
1282
1283 rootElement.addAttribute(
1284 "archive-user-uuid", portletItem.getUserUuid());
1285 rootElement.addAttribute("archive-name", portletItem.getName());
1286 }
1287 else if (ownerType == PortletKeys.PREFS_OWNER_TYPE_USER) {
1288 User user = UserLocalServiceUtil.fetchUserById(ownerId);
1289
1290 if (user == null) {
1291 return;
1292 }
1293
1294 rootElement.addAttribute("user-uuid", user.getUserUuid());
1295 }
1296
1297 List<Node> nodes = document.selectNodes(
1298 "/portlet-preferences/preference[name/text() = " +
1299 "'last-publish-date']");
1300
1301 for (Node node : nodes) {
1302 document.remove(node);
1303 }
1304
1305 String path = getPortletPreferencesPath(
1306 portletDataContext, portletId, ownerId, ownerType, plid);
1307
1308 portletPreferencesElement.addAttribute("path", path);
1309
1310 if (portletDataContext.isPathNotProcessed(path)) {
1311 portletDataContext.addZipEntry(
1312 path, document.formattedString(StringPool.TAB, false, false));
1313 }
1314 }
1315
1316 protected void exportPortletPreferences(
1317 PortletDataContext portletDataContext, long ownerId, int ownerType,
1318 boolean defaultUser, Layout layout, long plid, String portletId,
1319 Element parentElement)
1320 throws Exception {
1321
1322 PortletPreferences portletPreferences = null;
1323
1324 try {
1325 if ((ownerType == PortletKeys.PREFS_OWNER_TYPE_COMPANY) ||
1326 (ownerType == PortletKeys.PREFS_OWNER_TYPE_GROUP) ||
1327 (ownerType == PortletKeys.PREFS_OWNER_TYPE_ARCHIVED)) {
1328
1329 portletPreferences =
1330 PortletPreferencesLocalServiceUtil.getPortletPreferences(
1331 ownerId, ownerType, LayoutConstants.DEFAULT_PLID,
1332 portletId);
1333 }
1334 else {
1335 portletPreferences =
1336 PortletPreferencesLocalServiceUtil.getPortletPreferences(
1337 ownerId, ownerType, plid, portletId);
1338 }
1339 }
1340 catch (NoSuchPortletPreferencesException nsppe) {
1341 return;
1342 }
1343
1344 LayoutTypePortlet layoutTypePortlet = null;
1345
1346 if (layout != null) {
1347 layoutTypePortlet = (LayoutTypePortlet)layout.getLayoutType();
1348 }
1349
1350 if ((layoutTypePortlet == null) ||
1351 layoutTypePortlet.hasPortletId(portletId)) {
1352
1353 exportPortletPreference(
1354 portletDataContext, ownerId, ownerType, defaultUser,
1355 portletPreferences, portletId, plid, parentElement);
1356 }
1357 }
1358
1359 protected void exportRatingsEntries(
1360 PortletDataContext portletDataContext, Element parentElement)
1361 throws Exception {
1362
1363 Document document = SAXReaderUtil.createDocument();
1364
1365 Element rootElement = document.addElement("ratings");
1366
1367 Map<String, List<RatingsEntry>> ratingsEntriesMap =
1368 portletDataContext.getRatingsEntries();
1369
1370 for (Map.Entry<String, List<RatingsEntry>> entry :
1371 ratingsEntriesMap.entrySet()) {
1372
1373 String[] ratingsEntryParts = StringUtil.split(
1374 entry.getKey(), CharPool.POUND);
1375
1376 String className = ratingsEntryParts[0];
1377 String classPK = ratingsEntryParts[1];
1378
1379 String ratingsEntriesPath = getRatingsEntriesPath(
1380 portletDataContext, className, classPK);
1381
1382 Element assetElement = rootElement.addElement("asset");
1383
1384 assetElement.addAttribute("path", ratingsEntriesPath);
1385 assetElement.addAttribute("class-name", className);
1386 assetElement.addAttribute("class-pk", classPK);
1387
1388 List<RatingsEntry> ratingsEntries = entry.getValue();
1389
1390 for (RatingsEntry ratingsEntry : ratingsEntries) {
1391 String ratingsEntryPath = getRatingsEntryPath(
1392 portletDataContext, className, classPK, ratingsEntry);
1393
1394 User user = UserLocalServiceUtil.fetchUser(
1395 ratingsEntry.getUserId());
1396
1397 if (user == null) {
1398 continue;
1399 }
1400
1401 portletDataContext.addZipEntry(ratingsEntryPath, ratingsEntry);
1402
1403 portletDataContext.addReferenceElement(
1404 ratingsEntry, assetElement, user, User.class,
1405 PortletDataContext.REFERENCE_TYPE_WEAK, true);
1406 }
1407 }
1408
1409 portletDataContext.addZipEntry(
1410 ExportImportPathUtil.getRootPath(portletDataContext) +
1411 "/ratings.xml",
1412 document.formattedString());
1413 }
1414
1415 protected String getAssetCategoryPath(
1416 PortletDataContext portletDataContext, long assetCategoryId) {
1417
1418 StringBundler sb = new StringBundler(4);
1419
1420 sb.append(ExportImportPathUtil.getRootPath(portletDataContext));
1421 sb.append("/categories/");
1422 sb.append(assetCategoryId);
1423 sb.append(".xml");
1424
1425 return sb.toString();
1426 }
1427
1428 protected String getAssetLinkPath(
1429 PortletDataContext portletDataContext, long assetLinkId) {
1430
1431 StringBundler sb = new StringBundler(4);
1432
1433 sb.append(ExportImportPathUtil.getRootPath(portletDataContext));
1434 sb.append("/links/");
1435 sb.append(assetLinkId);
1436 sb.append(".xml");
1437
1438 return sb.toString();
1439 }
1440
1441 protected String getAssetTagPath(
1442 PortletDataContext portletDataContext, long assetCategoryId) {
1443
1444 StringBundler sb = new StringBundler(4);
1445
1446 sb.append(ExportImportPathUtil.getRootPath(portletDataContext));
1447 sb.append("/tags/");
1448 sb.append(assetCategoryId);
1449 sb.append(".xml");
1450
1451 return sb.toString();
1452 }
1453
1454 protected String getAssetVocabulariesPath(
1455 PortletDataContext portletDataContext, long assetVocabularyId) {
1456
1457 StringBundler sb = new StringBundler(4);
1458
1459 sb.append(ExportImportPathUtil.getRootPath(portletDataContext));
1460 sb.append("/vocabularies/");
1461 sb.append(assetVocabularyId);
1462 sb.append(".xml");
1463
1464 return sb.toString();
1465 }
1466
1467 protected String getCommentPath(
1468 PortletDataContext portletDataContext, String className, String classPK,
1469 MBMessage mbMessage) {
1470
1471 StringBundler sb = new StringBundler(8);
1472
1473 sb.append(ExportImportPathUtil.getRootPath(portletDataContext));
1474 sb.append("/comments/");
1475 sb.append(PortalUtil.getClassNameId(className));
1476 sb.append(CharPool.FORWARD_SLASH);
1477 sb.append(classPK);
1478 sb.append(CharPool.FORWARD_SLASH);
1479 sb.append(mbMessage.getMessageId());
1480 sb.append(".xml");
1481
1482 return sb.toString();
1483 }
1484
1485 protected String getCommentsPath(
1486 PortletDataContext portletDataContext, String className,
1487 String classPK) {
1488
1489 StringBundler sb = new StringBundler(6);
1490
1491 sb.append(ExportImportPathUtil.getRootPath(portletDataContext));
1492 sb.append("/comments/");
1493 sb.append(PortalUtil.getClassNameId(className));
1494 sb.append(CharPool.FORWARD_SLASH);
1495 sb.append(classPK);
1496 sb.append(CharPool.FORWARD_SLASH);
1497
1498 return sb.toString();
1499 }
1500
1501 protected String getLockPath(
1502 PortletDataContext portletDataContext, String className, String key,
1503 Lock lock) {
1504
1505 StringBundler sb = new StringBundler(8);
1506
1507 sb.append(ExportImportPathUtil.getRootPath(portletDataContext));
1508 sb.append("/locks/");
1509 sb.append(PortalUtil.getClassNameId(className));
1510 sb.append(CharPool.FORWARD_SLASH);
1511 sb.append(key);
1512 sb.append(CharPool.FORWARD_SLASH);
1513 sb.append(lock.getLockId());
1514 sb.append(".xml");
1515
1516 return sb.toString();
1517 }
1518
1519 protected String getPortletPreferencesPath(
1520 PortletDataContext portletDataContext, String portletId, long ownerId,
1521 int ownerType, long plid) {
1522
1523 StringBundler sb = new StringBundler(8);
1524
1525 sb.append(
1526 ExportImportPathUtil.getPortletPath(portletDataContext, portletId));
1527 sb.append("/preferences/");
1528
1529 if (ownerType == PortletKeys.PREFS_OWNER_TYPE_COMPANY) {
1530 sb.append("company/");
1531 }
1532 else if (ownerType == PortletKeys.PREFS_OWNER_TYPE_GROUP) {
1533 sb.append("group/");
1534 }
1535 else if (ownerType == PortletKeys.PREFS_OWNER_TYPE_LAYOUT) {
1536 sb.append("layout/");
1537 }
1538 else if (ownerType == PortletKeys.PREFS_OWNER_TYPE_USER) {
1539 sb.append("user/");
1540 }
1541 else if (ownerType == PortletKeys.PREFS_OWNER_TYPE_ARCHIVED) {
1542 sb.append("archived/");
1543 }
1544
1545 sb.append(ownerId);
1546 sb.append(CharPool.FORWARD_SLASH);
1547 sb.append(plid);
1548 sb.append(CharPool.FORWARD_SLASH);
1549 sb.append("portlet-preferences.xml");
1550
1551 return sb.toString();
1552 }
1553
1554 protected String getRatingsEntriesPath(
1555 PortletDataContext portletDataContext, String className,
1556 String classPK) {
1557
1558 StringBundler sb = new StringBundler(6);
1559
1560 sb.append(ExportImportPathUtil.getRootPath(portletDataContext));
1561 sb.append("/ratings/");
1562 sb.append(PortalUtil.getClassNameId(className));
1563 sb.append(CharPool.FORWARD_SLASH);
1564 sb.append(classPK);
1565 sb.append(CharPool.FORWARD_SLASH);
1566
1567 return sb.toString();
1568 }
1569
1570 protected String getRatingsEntryPath(
1571 PortletDataContext portletDataContext, String className, String classPK,
1572 RatingsEntry ratingsEntry) {
1573
1574 StringBundler sb = new StringBundler(8);
1575
1576 sb.append(ExportImportPathUtil.getRootPath(portletDataContext));
1577 sb.append("/ratings/");
1578 sb.append(PortalUtil.getClassNameId(className));
1579 sb.append(CharPool.FORWARD_SLASH);
1580 sb.append(classPK);
1581 sb.append(CharPool.FORWARD_SLASH);
1582 sb.append(ratingsEntry.getEntryId());
1583 sb.append(".xml");
1584
1585 return sb.toString();
1586 }
1587
1588 private static Log _log = LogFactoryUtil.getLog(PortletExporter.class);
1589
1590 private DeletionSystemEventExporter _deletionSystemEventExporter =
1591 new DeletionSystemEventExporter();
1592 private PermissionExporter _permissionExporter = new PermissionExporter();
1593
1594 }