001
014
015 package com.liferay.portal.lar;
016
017 import com.liferay.portal.LARFileException;
018 import com.liferay.portal.kernel.dao.orm.ActionableDynamicQuery;
019 import com.liferay.portal.kernel.dao.orm.Disjunction;
020 import com.liferay.portal.kernel.dao.orm.DynamicQuery;
021 import com.liferay.portal.kernel.dao.orm.Property;
022 import com.liferay.portal.kernel.dao.orm.PropertyFactoryUtil;
023 import com.liferay.portal.kernel.dao.orm.RestrictionsFactoryUtil;
024 import com.liferay.portal.kernel.exception.PortalException;
025 import com.liferay.portal.kernel.exception.SystemException;
026 import com.liferay.portal.kernel.json.JSONArray;
027 import com.liferay.portal.kernel.json.JSONFactoryUtil;
028 import com.liferay.portal.kernel.json.JSONObject;
029 import com.liferay.portal.kernel.lar.DefaultConfigurationPortletDataHandler;
030 import com.liferay.portal.kernel.lar.ExportImportHelper;
031 import com.liferay.portal.kernel.lar.ExportImportHelperUtil;
032 import com.liferay.portal.kernel.lar.ExportImportPathUtil;
033 import com.liferay.portal.kernel.lar.ExportImportThreadLocal;
034 import com.liferay.portal.kernel.lar.ManifestSummary;
035 import com.liferay.portal.kernel.lar.MissingReference;
036 import com.liferay.portal.kernel.lar.MissingReferences;
037 import com.liferay.portal.kernel.lar.PortletDataContext;
038 import com.liferay.portal.kernel.lar.PortletDataContextFactoryUtil;
039 import com.liferay.portal.kernel.lar.PortletDataException;
040 import com.liferay.portal.kernel.lar.PortletDataHandler;
041 import com.liferay.portal.kernel.lar.PortletDataHandlerControl;
042 import com.liferay.portal.kernel.lar.PortletDataHandlerKeys;
043 import com.liferay.portal.kernel.lar.StagedModelDataHandler;
044 import com.liferay.portal.kernel.lar.StagedModelDataHandlerRegistryUtil;
045 import com.liferay.portal.kernel.lar.StagedModelDataHandlerUtil;
046 import com.liferay.portal.kernel.lar.StagedModelType;
047 import com.liferay.portal.kernel.lar.StagingIndexingDeletionThreadLocal;
048 import com.liferay.portal.kernel.lar.UserIdStrategy;
049 import com.liferay.portal.kernel.log.Log;
050 import com.liferay.portal.kernel.log.LogFactoryUtil;
051 import com.liferay.portal.kernel.repository.model.FileEntry;
052 import com.liferay.portal.kernel.staging.StagingUtil;
053 import com.liferay.portal.kernel.util.ArrayUtil;
054 import com.liferay.portal.kernel.util.CalendarFactoryUtil;
055 import com.liferay.portal.kernel.util.CharPool;
056 import com.liferay.portal.kernel.util.DateFormatFactoryUtil;
057 import com.liferay.portal.kernel.util.DateRange;
058 import com.liferay.portal.kernel.util.Digester;
059 import com.liferay.portal.kernel.util.DigesterUtil;
060 import com.liferay.portal.kernel.util.FileUtil;
061 import com.liferay.portal.kernel.util.GetterUtil;
062 import com.liferay.portal.kernel.util.HttpUtil;
063 import com.liferay.portal.kernel.util.LocaleUtil;
064 import com.liferay.portal.kernel.util.MapUtil;
065 import com.liferay.portal.kernel.util.ParamUtil;
066 import com.liferay.portal.kernel.util.PredicateFilter;
067 import com.liferay.portal.kernel.util.StreamUtil;
068 import com.liferay.portal.kernel.util.StringBundler;
069 import com.liferay.portal.kernel.util.StringPool;
070 import com.liferay.portal.kernel.util.StringUtil;
071 import com.liferay.portal.kernel.util.SystemProperties;
072 import com.liferay.portal.kernel.util.TempFileUtil;
073 import com.liferay.portal.kernel.util.Time;
074 import com.liferay.portal.kernel.util.TimeZoneUtil;
075 import com.liferay.portal.kernel.util.Validator;
076 import com.liferay.portal.kernel.xml.Document;
077 import com.liferay.portal.kernel.xml.Element;
078 import com.liferay.portal.kernel.xml.ElementHandler;
079 import com.liferay.portal.kernel.xml.ElementProcessor;
080 import com.liferay.portal.kernel.zip.ZipReader;
081 import com.liferay.portal.kernel.zip.ZipReaderFactoryUtil;
082 import com.liferay.portal.kernel.zip.ZipWriter;
083 import com.liferay.portal.kernel.zip.ZipWriterFactoryUtil;
084 import com.liferay.portal.lar.backgroundtask.StagingIndexingBackgroundTaskExecutor;
085 import com.liferay.portal.model.Company;
086 import com.liferay.portal.model.Group;
087 import com.liferay.portal.model.Layout;
088 import com.liferay.portal.model.LayoutConstants;
089 import com.liferay.portal.model.LayoutFriendlyURL;
090 import com.liferay.portal.model.LayoutSet;
091 import com.liferay.portal.model.Organization;
092 import com.liferay.portal.model.Portlet;
093 import com.liferay.portal.model.PortletConstants;
094 import com.liferay.portal.model.StagedModel;
095 import com.liferay.portal.model.SystemEventConstants;
096 import com.liferay.portal.model.User;
097 import com.liferay.portal.model.impl.LayoutImpl;
098 import com.liferay.portal.security.xml.SecureXMLFactoryProviderUtil;
099 import com.liferay.portal.service.BackgroundTaskLocalServiceUtil;
100 import com.liferay.portal.service.CompanyLocalServiceUtil;
101 import com.liferay.portal.service.GroupLocalServiceUtil;
102 import com.liferay.portal.service.LayoutFriendlyURLLocalServiceUtil;
103 import com.liferay.portal.service.LayoutLocalServiceUtil;
104 import com.liferay.portal.service.LayoutServiceUtil;
105 import com.liferay.portal.service.LayoutSetLocalServiceUtil;
106 import com.liferay.portal.service.OrganizationLocalServiceUtil;
107 import com.liferay.portal.service.PortletLocalServiceUtil;
108 import com.liferay.portal.service.ServiceContext;
109 import com.liferay.portal.service.UserLocalServiceUtil;
110 import com.liferay.portal.service.persistence.OrganizationUtil;
111 import com.liferay.portal.service.persistence.SystemEventActionableDynamicQuery;
112 import com.liferay.portal.theme.ThemeDisplay;
113 import com.liferay.portal.util.PortalUtil;
114 import com.liferay.portal.util.PortletKeys;
115 import com.liferay.portal.util.PropsValues;
116 import com.liferay.portal.util.WebKeys;
117 import com.liferay.portlet.PortletPreferencesFactoryUtil;
118 import com.liferay.portlet.asset.model.AssetCategory;
119 import com.liferay.portlet.asset.model.AssetVocabulary;
120 import com.liferay.portlet.asset.service.AssetCategoryLocalServiceUtil;
121 import com.liferay.portlet.asset.service.AssetVocabularyLocalServiceUtil;
122 import com.liferay.portlet.asset.service.persistence.AssetCategoryUtil;
123 import com.liferay.portlet.asset.service.persistence.AssetVocabularyUtil;
124 import com.liferay.portlet.documentlibrary.model.DLFileEntry;
125 import com.liferay.portlet.documentlibrary.model.DLFileEntryType;
126 import com.liferay.portlet.documentlibrary.service.DLAppLocalServiceUtil;
127 import com.liferay.portlet.documentlibrary.service.DLFileEntryLocalServiceUtil;
128 import com.liferay.portlet.documentlibrary.service.DLFileEntryTypeLocalServiceUtil;
129 import com.liferay.portlet.documentlibrary.service.persistence.DLFileEntryTypeUtil;
130 import com.liferay.portlet.documentlibrary.util.DLUtil;
131 import com.liferay.portlet.dynamicdatamapping.model.DDMStructure;
132 import com.liferay.portlet.dynamicdatamapping.model.DDMTemplate;
133 import com.liferay.portlet.dynamicdatamapping.service.DDMStructureLocalServiceUtil;
134 import com.liferay.portlet.dynamicdatamapping.service.persistence.DDMStructureUtil;
135 import com.liferay.portlet.journal.model.JournalArticle;
136
137 import java.io.File;
138 import java.io.InputStream;
139 import java.io.Serializable;
140 import java.io.StringReader;
141
142 import java.util.ArrayList;
143 import java.util.Calendar;
144 import java.util.Date;
145 import java.util.HashMap;
146 import java.util.LinkedHashMap;
147 import java.util.List;
148 import java.util.Locale;
149 import java.util.Map;
150 import java.util.TimeZone;
151 import java.util.regex.Matcher;
152 import java.util.regex.Pattern;
153
154 import javax.portlet.PortletPreferences;
155 import javax.portlet.PortletRequest;
156
157 import org.xml.sax.InputSource;
158 import org.xml.sax.XMLReader;
159
160
165 public class ExportImportHelperImpl implements ExportImportHelper {
166
167 @Override
168 public void reindex(PortletDataContext portletDataContext, long userId)
169 throws PortalException, SystemException {
170
171 Map<String, Serializable> taskContextMap =
172 new HashMap<String, Serializable>();
173
174 PortletDataContext clonedPortletDataContext =
175 PortletDataContextFactoryUtil.clonePortletDataContext(
176 portletDataContext);
177
178 clonedPortletDataContext.setDeletionKeysMap(
179 StagingIndexingDeletionThreadLocal.getDeletionKeysMap());
180
181 Map<String, Map<?, ?>> newPrimaryKeysMaps =
182 clonedPortletDataContext.getNewPrimaryKeysMaps();
183
184 for (String key : _EXTRANEOUS_REINDEX_PRIMARY_KEYS_MAPS_KEYS) {
185 newPrimaryKeysMaps.remove(key);
186 }
187
188 Map<Long, Long> structureIds = (Map<Long, Long>)newPrimaryKeysMaps.get(
189 DDMStructure.class.getName());
190 Map<Long, Long> structureIdsUnmodified =
191 (Map<Long, Long>)newPrimaryKeysMaps.get(
192 DDMStructure.class + ".unmodified");
193
194 if ((structureIdsUnmodified != null) && (structureIds != null)) {
195 for (Long structureIdUnmodified : structureIdsUnmodified.keySet()) {
196 structureIds.remove(structureIdUnmodified);
197 }
198
199 newPrimaryKeysMaps.remove(DDMStructure.class + ".unmodified");
200 }
201
202 taskContextMap.put("portletDataContext", clonedPortletDataContext);
203 taskContextMap.put("userId", userId);
204
205 BackgroundTaskLocalServiceUtil.addBackgroundTask(
206 userId, clonedPortletDataContext.getGroupId(), StringPool.BLANK,
207 null, StagingIndexingBackgroundTaskExecutor.class, taskContextMap,
208 new ServiceContext());
209 }
210
211 @Override
212 public Calendar getCalendar(
213 PortletRequest portletRequest, String paramPrefix,
214 boolean timeZoneSensitive) {
215
216 ThemeDisplay themeDisplay = (ThemeDisplay)portletRequest.getAttribute(
217 WebKeys.THEME_DISPLAY);
218
219 int dateMonth = ParamUtil.getInteger(
220 portletRequest, paramPrefix + "Month");
221 int dateDay = ParamUtil.getInteger(portletRequest, paramPrefix + "Day");
222 int dateYear = ParamUtil.getInteger(
223 portletRequest, paramPrefix + "Year");
224 int dateHour = ParamUtil.getInteger(
225 portletRequest, paramPrefix + "Hour");
226 int dateMinute = ParamUtil.getInteger(
227 portletRequest, paramPrefix + "Minute");
228 int dateAmPm = ParamUtil.getInteger(
229 portletRequest, paramPrefix + "AmPm");
230
231 if (dateAmPm == Calendar.PM) {
232 dateHour += 12;
233 }
234
235 Locale locale = null;
236 TimeZone timeZone = null;
237
238 if (timeZoneSensitive) {
239 locale = themeDisplay.getLocale();
240 timeZone = themeDisplay.getTimeZone();
241 }
242 else {
243 locale = LocaleUtil.getDefault();
244 timeZone = TimeZoneUtil.getTimeZone(StringPool.UTC);
245 }
246
247 Calendar calendar = CalendarFactoryUtil.getCalendar(timeZone, locale);
248
249 calendar.set(Calendar.MONTH, dateMonth);
250 calendar.set(Calendar.DATE, dateDay);
251 calendar.set(Calendar.YEAR, dateYear);
252 calendar.set(Calendar.HOUR_OF_DAY, dateHour);
253 calendar.set(Calendar.MINUTE, dateMinute);
254 calendar.set(Calendar.SECOND, 0);
255 calendar.set(Calendar.MILLISECOND, 0);
256
257 return calendar;
258 }
259
260 @Override
261 public DateRange getDateRange(
262 PortletRequest portletRequest, long groupId, boolean privateLayout,
263 long plid, String portletId, String defaultRange)
264 throws Exception {
265
266 Date startDate = null;
267 Date endDate = null;
268
269 String range = ParamUtil.getString(
270 portletRequest, "range", defaultRange);
271
272 if (range.equals("dateRange")) {
273 Calendar startCalendar = getCalendar(
274 portletRequest, "startDate", true);
275
276 startDate = startCalendar.getTime();
277
278 Calendar endCalendar = getCalendar(portletRequest, "endDate", true);
279
280 endDate = endCalendar.getTime();
281 }
282 else if (range.equals("fromLastPublishDate")) {
283 Date lastPublishDate = null;
284
285 Group group = GroupLocalServiceUtil.getGroup(groupId);
286
287 if (!group.isStagedRemotely() && Validator.isNotNull(portletId)) {
288 Layout layout = LayoutLocalServiceUtil.fetchLayout(plid);
289
290 if (layout == null) {
291 layout = new LayoutImpl();
292
293 layout.setGroupId(group.getGroupId());
294 layout.setCompanyId(group.getCompanyId());
295 }
296
297 PortletPreferences jxPortletPreferences =
298 PortletPreferencesFactoryUtil.getStrictPortletSetup(
299 layout, portletId);
300
301 lastPublishDate = StagingUtil.getLastPublishDate(
302 jxPortletPreferences);
303 }
304 else {
305 LayoutSet layoutSet = LayoutSetLocalServiceUtil.getLayoutSet(
306 groupId, privateLayout);
307
308 lastPublishDate = StagingUtil.getLastPublishDate(layoutSet);
309 }
310
311 if (lastPublishDate != null) {
312 endDate = new Date();
313
314 startDate = lastPublishDate;
315 }
316 }
317 else if (range.equals("last")) {
318 int rangeLast = ParamUtil.getInteger(portletRequest, "last");
319
320 Date now = new Date();
321
322 startDate = new Date(now.getTime() - (rangeLast * Time.HOUR));
323
324 endDate = now;
325 }
326
327 return new DateRange(startDate, endDate);
328 }
329
330 @Override
331 public Layout getExportableLayout(ThemeDisplay themeDisplay)
332 throws PortalException, SystemException {
333
334 Layout layout = themeDisplay.getLayout();
335
336 if (!layout.isTypeControlPanel()) {
337 return layout;
338 }
339
340 Group scopeGroup = themeDisplay.getScopeGroup();
341
342 if (scopeGroup.isLayout()) {
343 layout = LayoutLocalServiceUtil.getLayout(scopeGroup.getClassPK());
344 }
345 else if (!scopeGroup.isCompany()) {
346 long defaultPlid = LayoutLocalServiceUtil.getDefaultPlid(
347 themeDisplay.getSiteGroupId());
348
349 if (defaultPlid > 0) {
350 layout = LayoutLocalServiceUtil.getLayout(defaultPlid);
351 }
352 }
353
354 return layout;
355 }
356
357 @Override
358 public String getExportableRootPortletId(long companyId, String portletId)
359 throws Exception {
360
361 Portlet portlet = PortletLocalServiceUtil.getPortletById(
362 companyId, portletId);
363
364 if ((portlet == null) || portlet.isUndeployedPortlet()) {
365 return null;
366 }
367
368 return PortletConstants.getRootPortletId(portletId);
369 }
370
371 @Override
372 public Map<Long, Boolean> getLayoutIdMap(PortletRequest portletRequest)
373 throws Exception {
374
375 Map<Long, Boolean> layoutIdMap = new LinkedHashMap<Long, Boolean>();
376
377 String layoutIdsJSON = ParamUtil.getString(portletRequest, "layoutIds");
378
379 if (Validator.isNull(layoutIdsJSON)) {
380 return layoutIdMap;
381 }
382
383 JSONArray jsonArray = JSONFactoryUtil.createJSONArray(layoutIdsJSON);
384
385 for (int i = 0; i < jsonArray.length(); ++i) {
386 JSONObject jsonObject = jsonArray.getJSONObject(i);
387
388 long plid = jsonObject.getLong("plid");
389 boolean includeChildren = jsonObject.getBoolean("includeChildren");
390
391 layoutIdMap.put(plid, includeChildren);
392 }
393
394 return layoutIdMap;
395 }
396
397 @Override
398 public long[] getLayoutIds(List<Layout> layouts) {
399 long[] layoutIds = new long[layouts.size()];
400
401 for (int i = 0; i < layouts.size(); i++) {
402 Layout layout = layouts.get(i);
403
404 layoutIds[i] = layout.getLayoutId();
405 }
406
407 return layoutIds;
408 }
409
410 @Override
411 public ZipWriter getLayoutSetZipWriter(long groupId) {
412 StringBundler sb = new StringBundler(4);
413
414 sb.append(groupId);
415 sb.append(StringPool.DASH);
416 sb.append(Time.getShortTimestamp());
417 sb.append(".lar");
418
419 return getZipWriter(sb.toString());
420 }
421
422 @Override
423 public ManifestSummary getManifestSummary(
424 long userId, long groupId, Map<String, String[]> parameterMap,
425 File file)
426 throws Exception {
427
428 final Group group = GroupLocalServiceUtil.getGroup(groupId);
429 String userIdStrategy = MapUtil.getString(
430 parameterMap, PortletDataHandlerKeys.USER_ID_STRATEGY);
431 ZipReader zipReader = ZipReaderFactoryUtil.getZipReader(file);
432
433 PortletDataContext portletDataContext =
434 PortletDataContextFactoryUtil.createImportPortletDataContext(
435 group.getCompanyId(), groupId, parameterMap,
436 getUserIdStrategy(userId, userIdStrategy), zipReader);
437
438 try {
439 final ManifestSummary manifestSummary = new ManifestSummary();
440
441 XMLReader xmlReader = SecureXMLFactoryProviderUtil.newXMLReader();
442
443 ElementHandler elementHandler = new ElementHandler(
444 new ManifestSummaryElementProcessor(group, manifestSummary),
445 new String[] {"header", "portlet", "staged-model"});
446
447 xmlReader.setContentHandler(elementHandler);
448
449 InputStream is = portletDataContext.getZipEntryAsInputStream(
450 "/manifest.xml");
451
452 if (is == null) {
453 throw new LARFileException("manifest.xml is not in the LAR");
454 }
455
456 String manifestXMLContent = StringUtil.read(is);
457
458 xmlReader.parse(
459 new InputSource(new StringReader(manifestXMLContent)));
460
461 return manifestSummary;
462 }
463 finally {
464 zipReader.close();
465 }
466 }
467
468 @Override
469 public ManifestSummary getManifestSummary(
470 long userId, long groupId, Map<String, String[]> parameterMap,
471 FileEntry fileEntry)
472 throws Exception {
473
474 File file = FileUtil.createTempFile("lar");
475 InputStream inputStream = DLFileEntryLocalServiceUtil.getFileAsStream(
476 fileEntry.getFileEntryId(), fileEntry.getVersion(), false);
477
478 ManifestSummary manifestSummary = null;
479
480 try {
481 FileUtil.write(file, inputStream);
482
483 manifestSummary = getManifestSummary(
484 userId, groupId, parameterMap, file);
485 }
486 finally {
487 StreamUtil.cleanUp(inputStream);
488
489 FileUtil.delete(file);
490 }
491
492 return manifestSummary;
493 }
494
495 @Override
496 public long getModelDeletionCount(
497 final PortletDataContext portletDataContext,
498 final StagedModelType stagedModelType)
499 throws PortalException, SystemException {
500
501 ActionableDynamicQuery actionableDynamicQuery =
502 new SystemEventActionableDynamicQuery() {
503
504 protected void addCreateDateProperty(DynamicQuery dynamicQuery) {
505 if (!portletDataContext.hasDateRange()) {
506 return;
507 }
508
509 Property createDateProperty = PropertyFactoryUtil.forName(
510 "createDate");
511
512 Date startDate = portletDataContext.getStartDate();
513
514 dynamicQuery.add(createDateProperty.ge(startDate));
515
516 Date endDate = portletDataContext.getEndDate();
517
518 dynamicQuery.add(createDateProperty.le(endDate));
519 }
520
521 @Override
522 protected void addCriteria(DynamicQuery dynamicQuery) {
523 Disjunction disjunction = RestrictionsFactoryUtil.disjunction();
524
525 Property groupIdProperty = PropertyFactoryUtil.forName(
526 "groupId");
527
528 disjunction.add(groupIdProperty.eq(0L));
529 disjunction.add(
530 groupIdProperty.eq(portletDataContext.getScopeGroupId()));
531
532 dynamicQuery.add(disjunction);
533
534 Property classNameIdProperty = PropertyFactoryUtil.forName(
535 "classNameId");
536
537 dynamicQuery.add(
538 classNameIdProperty.eq(stagedModelType.getClassNameId()));
539
540 if (stagedModelType.getReferrerClassNameId() >= 0) {
541 Property referrerClassNameIdProperty =
542 PropertyFactoryUtil.forName("referrerClassNameId");
543
544 dynamicQuery.add(
545 referrerClassNameIdProperty.eq(
546 stagedModelType.getReferrerClassNameId()));
547 }
548
549 Property typeProperty = PropertyFactoryUtil.forName("type");
550
551 dynamicQuery.add(
552 typeProperty.eq(SystemEventConstants.TYPE_DELETE));
553
554 addCreateDateProperty(dynamicQuery);
555 }
556
557 @Override
558 protected void performAction(Object object) {
559 }
560
561 };
562
563 actionableDynamicQuery.setCompanyId(portletDataContext.getCompanyId());
564
565 return actionableDynamicQuery.performCount();
566 }
567
568 @Override
569 public ZipWriter getPortletZipWriter(String portletId) {
570 StringBundler sb = new StringBundler(4);
571
572 sb.append(portletId);
573 sb.append(StringPool.DASH);
574 sb.append(Time.getShortTimestamp());
575 sb.append(".lar");
576
577 return getZipWriter(sb.toString());
578 }
579
580 @Override
581 public String getSelectedLayoutsJSON(
582 long groupId, boolean privateLayout, String selectedNodes)
583 throws SystemException {
584
585 JSONArray jsonArray = JSONFactoryUtil.createJSONArray();
586
587 List<Layout> layouts = LayoutLocalServiceUtil.getLayouts(
588 groupId, privateLayout, LayoutConstants.DEFAULT_PARENT_LAYOUT_ID);
589
590 for (Layout layout : layouts) {
591 populateLayoutsJSON(
592 jsonArray, layout, StringUtil.split(selectedNodes, 0L));
593 }
594
595 return jsonArray.toString();
596 }
597
598 @Override
599 public FileEntry getTempFileEntry(
600 long groupId, long userId, String folderName)
601 throws PortalException, SystemException {
602
603 String[] tempFileEntryNames = LayoutServiceUtil.getTempFileEntryNames(
604 groupId, folderName);
605
606 if (tempFileEntryNames.length == 0) {
607 return null;
608 }
609
610 return TempFileUtil.getTempFile(
611 groupId, userId, tempFileEntryNames[0],
612 DigesterUtil.digestHex(Digester.SHA_256, folderName));
613 }
614
615 @Override
616 public String replaceExportContentReferences(
617 PortletDataContext portletDataContext,
618 StagedModel entityStagedModel, Element entityElement,
619 String content, boolean exportReferencedContent)
620 throws Exception {
621
622 content = ExportImportHelperUtil.replaceExportDLReferences(
623 portletDataContext, entityStagedModel, entityElement, content,
624 exportReferencedContent);
625
626 content = ExportImportHelperUtil.replaceExportLayoutReferences(
627 portletDataContext, content, exportReferencedContent);
628 content = ExportImportHelperUtil.replaceExportLinksToLayouts(
629 portletDataContext, entityStagedModel, entityElement, content,
630 exportReferencedContent);
631
632 Element groupElement = entityElement.getParent();
633
634 String groupElementName = groupElement.getName();
635
636 if (!groupElementName.equals(DDMTemplate.class.getSimpleName()) &&
637 !groupElementName.equals(JournalArticle.class.getSimpleName())) {
638
639 content = StringUtil.replace(
640 content, StringPool.AMPERSAND_ENCODED, StringPool.AMPERSAND);
641 }
642
643 return content;
644 }
645
646 @Override
647 public String replaceExportDLReferences(
648 PortletDataContext portletDataContext,
649 StagedModel entityStagedModel, Element entityElement,
650 String content, boolean exportReferencedContent)
651 throws Exception {
652
653 Group group = GroupLocalServiceUtil.getGroup(
654 portletDataContext.getGroupId());
655
656 if (group.isStagingGroup()) {
657 group = group.getLiveGroup();
658 }
659
660 if (group.isStaged() && !group.isStagedRemotely() &&
661 !group.isStagedPortlet(PortletKeys.DOCUMENT_LIBRARY)) {
662
663 return content;
664 }
665
666 StringBuilder sb = new StringBuilder(content);
667
668 String contextPath = PortalUtil.getPathContext();
669
670 String[] patterns = {
671 contextPath.concat("/c/document_library/get_file?"),
672 contextPath.concat("/documents/"),
673 contextPath.concat("/image/image_gallery?")
674 };
675
676 int beginPos = -1;
677 int endPos = content.length();
678
679 while (true) {
680 beginPos = StringUtil.lastIndexOfAny(content, patterns, endPos);
681
682 if (beginPos == -1) {
683 break;
684 }
685
686 FileEntry fileEntry = null;
687
688 Map<String, String[]> dlReferenceParameters = null;
689
690 try {
691 dlReferenceParameters = getDLReferenceParameters(
692 portletDataContext, content,
693 beginPos + contextPath.length(), endPos);
694
695 fileEntry = getFileEntry(dlReferenceParameters);
696 }
697 catch (Exception e) {
698 if (_log.isDebugEnabled()) {
699 _log.debug(e, e);
700 }
701 else if (_log.isWarnEnabled()) {
702 _log.warn(e.getMessage());
703 }
704 }
705
706 if (fileEntry == null) {
707 endPos = beginPos - 1;
708
709 continue;
710 }
711
712 endPos = MapUtil.getInteger(dlReferenceParameters, "endPos");
713
714 try {
715 String rootPortletId = portletDataContext.getRootPortletId();
716
717 if ((rootPortletId != null) &&
718 rootPortletId.equals(PortletKeys.JOURNAL_CONTENT)) {
719
720 Map<String, String[]> parameterMap =
721 portletDataContext.getParameterMap();
722
723 String[] referencedContentBehaviorArray = parameterMap.get(
724 PortletDataHandlerControl.getNamespacedControlName(
725 "journal-content", "referenced-content-behavior"));
726
727 String referencedContentBehavior = "include-always";
728
729 if (!ArrayUtil.isEmpty(referencedContentBehaviorArray)) {
730 referencedContentBehavior =
731 referencedContentBehaviorArray[0];
732 }
733
734 if (referencedContentBehavior.equals("include-always") ||
735 (referencedContentBehavior.equals(
736 "include-if-modified") &&
737 portletDataContext.isWithinDateRange(
738 fileEntry.getModifiedDate()))) {
739
740 StagedModelDataHandlerUtil.exportReferenceStagedModel(
741 portletDataContext, entityStagedModel, fileEntry,
742 PortletDataContext.REFERENCE_TYPE_DEPENDENCY);
743 }
744 else {
745 validateReferencedFileEntryGroup(
746 portletDataContext, fileEntry);
747
748 portletDataContext.addReferenceElement(
749 entityStagedModel, entityElement, fileEntry,
750 PortletDataContext.REFERENCE_TYPE_DEPENDENCY, true);
751 }
752 }
753 else {
754 if (exportReferencedContent) {
755 StagedModelDataHandlerUtil.exportReferenceStagedModel(
756 portletDataContext, entityStagedModel, fileEntry,
757 PortletDataContext.REFERENCE_TYPE_DEPENDENCY);
758 }
759 else {
760 portletDataContext.addReferenceElement(
761 entityStagedModel, entityElement, fileEntry,
762 PortletDataContext.REFERENCE_TYPE_DEPENDENCY, true);
763 }
764 }
765
766 String path = ExportImportPathUtil.getModelPath(fileEntry);
767
768 sb.replace(beginPos, endPos, "[$dl-reference=" + path + "$]");
769
770 deleteTimestampParameters(sb, beginPos);
771 }
772 catch (Exception e) {
773 if (e instanceof PortletDataException) {
774 PortletDataException pde = (PortletDataException)e;
775
776 if (pde.getType() == PortletDataException.INVALID_GROUP) {
777 Group fileEntryGroup = GroupLocalServiceUtil.getGroup(
778 fileEntry.getGroupId());
779
780 if (fileEntryGroup.isStaged()) {
781 long fileEntryLiveGroupId =
782 fileEntryGroup.getLiveGroupId();
783
784 if (Validator.isNull(fileEntryLiveGroupId)) {
785 fileEntryLiveGroupId = GetterUtil.getLong(
786 fileEntryGroup.getTypeSettingsProperty(
787 "remoteGroupId"));
788 }
789
790 String url = sb.substring(beginPos, endPos);
791
792 url = StringUtil.replace(
793 url,
794 String.valueOf(fileEntryGroup.getGroupId()),
795 String.valueOf(fileEntryLiveGroupId));
796
797 sb.replace(beginPos, endPos, url);
798
799 endPos = beginPos - 1;
800
801 continue;
802 }
803 }
804 }
805
806 if (_log.isDebugEnabled()) {
807 _log.debug(e, e);
808 }
809 else if (_log.isWarnEnabled()) {
810 StringBundler exceptionSB = new StringBundler(6);
811
812 exceptionSB.append("Unable to process file entry ");
813 exceptionSB.append(fileEntry.getFileEntryId());
814 exceptionSB.append(" for ");
815 exceptionSB.append(entityStagedModel.getModelClassName());
816 exceptionSB.append(" with primary key ");
817 exceptionSB.append(entityStagedModel.getPrimaryKeyObj());
818
819 _log.warn(exceptionSB.toString());
820 }
821 }
822
823 endPos = beginPos - 1;
824 }
825
826 return sb.toString();
827 }
828
829 @Override
830 public String replaceExportLayoutReferences(
831 PortletDataContext portletDataContext, String content,
832 boolean exportReferencedContent)
833 throws Exception {
834
835 Group group = GroupLocalServiceUtil.getGroup(
836 portletDataContext.getScopeGroupId());
837
838 StringBuilder sb = new StringBuilder(content);
839
840 String[] patterns = {"href=", "[["};
841
842 int beginPos = -1;
843 int endPos = content.length();
844 int offset = 0;
845
846 while (true) {
847 if (beginPos > -1) {
848 endPos = beginPos - 1;
849 }
850
851 beginPos = StringUtil.lastIndexOfAny(content, patterns, endPos);
852
853 if (beginPos == -1) {
854 break;
855 }
856
857 if (content.startsWith("href=", beginPos)) {
858 offset = 5;
859
860 char c = content.charAt(beginPos + offset);
861
862 if ((c == CharPool.APOSTROPHE) || (c == CharPool.QUOTE)) {
863 offset++;
864 }
865 }
866 else if (content.charAt(beginPos) == CharPool.OPEN_BRACKET) {
867 offset = 2;
868 }
869
870 endPos = StringUtil.indexOfAny(
871 content, _LAYOUT_REFERENCE_STOP_CHARS, beginPos + offset,
872 endPos);
873
874 if (endPos == -1) {
875 continue;
876 }
877
878 String url = content.substring(beginPos + offset, endPos);
879
880 StringBundler urlSB = new StringBundler(5);
881
882 try {
883 url = replaceExportHostname(portletDataContext, url, urlSB);
884
885 if (!url.startsWith(StringPool.SLASH)) {
886 continue;
887 }
888
889 String pathContext = PortalUtil.getPathContext();
890
891 if (pathContext.length() > 1) {
892 if (!url.startsWith(pathContext)) {
893 continue;
894 }
895
896 urlSB.append(DATA_HANDLER_PATH_CONTEXT);
897
898 url = url.substring(pathContext.length());
899 }
900
901 if (!url.startsWith(StringPool.SLASH)) {
902 continue;
903 }
904
905 int pos = url.indexOf(StringPool.SLASH, 1);
906
907 String localePath = StringPool.BLANK;
908
909 Locale locale = null;
910
911 if (pos != -1) {
912 localePath = url.substring(0, pos);
913
914 locale = LocaleUtil.fromLanguageId(
915 localePath.substring(1), true, false);
916 }
917
918 if (locale != null) {
919 String urlWithoutLocale = url.substring(
920 localePath.length());
921
922 if (urlWithoutLocale.startsWith(
923 _PRIVATE_GROUP_SERVLET_MAPPING) ||
924 urlWithoutLocale.startsWith(
925 _PRIVATE_USER_SERVLET_MAPPING) ||
926 urlWithoutLocale.startsWith(
927 _PUBLIC_GROUP_SERVLET_MAPPING)) {
928
929 urlSB.append(localePath);
930
931 url = urlWithoutLocale;
932 }
933 }
934
935 if (url.startsWith(_PRIVATE_GROUP_SERVLET_MAPPING)) {
936 urlSB.append(DATA_HANDLER_PRIVATE_GROUP_SERVLET_MAPPING);
937
938 url = url.substring(
939 _PRIVATE_GROUP_SERVLET_MAPPING.length() - 1);
940 }
941 else if (url.startsWith(_PRIVATE_USER_SERVLET_MAPPING)) {
942 urlSB.append(DATA_HANDLER_PRIVATE_USER_SERVLET_MAPPING);
943
944 url = url.substring(
945 _PRIVATE_USER_SERVLET_MAPPING.length() - 1);
946 }
947 else if (url.startsWith(_PUBLIC_GROUP_SERVLET_MAPPING)) {
948 urlSB.append(DATA_HANDLER_PUBLIC_SERVLET_MAPPING);
949
950 url = url.substring(
951 _PUBLIC_GROUP_SERVLET_MAPPING.length() - 1);
952 }
953 else {
954 String urlSBString = urlSB.toString();
955
956 LayoutSet layoutSet = null;
957
958 if (urlSBString.contains(
959 DATA_HANDLER_PUBLIC_LAYOUT_SET_SECURE_URL) ||
960 urlSBString.contains(
961 DATA_HANDLER_PUBLIC_LAYOUT_SET_URL)) {
962
963 layoutSet = group.getPublicLayoutSet();
964 }
965 else if (urlSBString.contains(
966 DATA_HANDLER_PRIVATE_LAYOUT_SET_SECURE_URL) ||
967 urlSBString.contains(
968 DATA_HANDLER_PRIVATE_LAYOUT_SET_URL)) {
969
970 layoutSet = group.getPrivateLayoutSet();
971 }
972
973 if (layoutSet == null) {
974 continue;
975 }
976
977 boolean privateLayout = layoutSet.isPrivateLayout();
978
979 LayoutFriendlyURL layoutFriendlyUrl =
980 LayoutFriendlyURLLocalServiceUtil.
981 fetchFirstLayoutFriendlyURL(
982 group.getGroupId(), privateLayout, url);
983
984 if (layoutFriendlyUrl == null) {
985 continue;
986 }
987
988 if (privateLayout) {
989 if (group.isUser()) {
990 urlSB.append(
991 DATA_HANDLER_PRIVATE_USER_SERVLET_MAPPING);
992 }
993 else {
994 urlSB.append(
995 DATA_HANDLER_PRIVATE_GROUP_SERVLET_MAPPING);
996 }
997 }
998 else {
999 urlSB.append(DATA_HANDLER_PUBLIC_SERVLET_MAPPING);
1000 }
1001
1002 urlSB.append(DATA_HANDLER_GROUP_FRIENDLY_URL);
1003
1004 continue;
1005 }
1006
1007 String groupFriendlyURL = group.getFriendlyURL();
1008
1009 if (url.equals(groupFriendlyURL) ||
1010 url.startsWith(groupFriendlyURL + StringPool.SLASH)) {
1011
1012 urlSB.append(DATA_HANDLER_GROUP_FRIENDLY_URL);
1013
1014 url = url.substring(groupFriendlyURL.length());
1015 }
1016 }
1017 finally {
1018 if (urlSB.length() > 0) {
1019 urlSB.append(url);
1020
1021 url = urlSB.toString();
1022 }
1023
1024 sb.replace(beginPos + offset, endPos, url);
1025 }
1026 }
1027
1028 return sb.toString();
1029 }
1030
1031 @Override
1032 public String replaceExportLinksToLayouts(
1033 PortletDataContext portletDataContext,
1034 StagedModel entityStagedModel, Element entityElement,
1035 String content, boolean exportReferencedContent)
1036 throws Exception {
1037
1038 List<String> oldLinksToLayout = new ArrayList<String>();
1039 List<String> newLinksToLayout = new ArrayList<String>();
1040
1041 Matcher matcher = _exportLinksToLayoutPattern.matcher(content);
1042
1043 while (matcher.find()) {
1044 long layoutId = GetterUtil.getLong(matcher.group(1));
1045
1046 String type = matcher.group(2);
1047
1048 boolean privateLayout = type.startsWith("private");
1049
1050 try {
1051 Layout layout = LayoutLocalServiceUtil.getLayout(
1052 portletDataContext.getScopeGroupId(), privateLayout,
1053 layoutId);
1054
1055 String oldLinkToLayout = matcher.group(0);
1056
1057 StringBundler sb = new StringBundler(5);
1058
1059 sb.append(type);
1060 sb.append(StringPool.AT);
1061 sb.append(layout.getUuid());
1062 sb.append(StringPool.AT);
1063 sb.append(layout.getFriendlyURL());
1064
1065 String newLinkToLayout = StringUtil.replace(
1066 oldLinkToLayout, type, sb.toString());
1067
1068 oldLinksToLayout.add(oldLinkToLayout);
1069 newLinksToLayout.add(newLinkToLayout);
1070
1071 if (exportReferencedContent) {
1072 StagedModelDataHandlerUtil.exportReferenceStagedModel(
1073 portletDataContext, entityStagedModel, layout,
1074 PortletDataContext.REFERENCE_TYPE_DEPENDENCY);
1075 }
1076 else {
1077 portletDataContext.addReferenceElement(
1078 entityStagedModel, entityElement, layout,
1079 PortletDataContext.REFERENCE_TYPE_DEPENDENCY, true);
1080 }
1081 }
1082 catch (Exception e) {
1083 if (_log.isDebugEnabled() || _log.isWarnEnabled()) {
1084 String message =
1085 "Unable to get layout with ID " + layoutId +
1086 " in group " + portletDataContext.getScopeGroupId();
1087
1088 if (_log.isWarnEnabled()) {
1089 _log.warn(message);
1090 }
1091 else {
1092 _log.debug(message, e);
1093 }
1094 }
1095 }
1096 }
1097
1098 content = StringUtil.replace(
1099 content, ArrayUtil.toStringArray(oldLinksToLayout.toArray()),
1100 ArrayUtil.toStringArray(newLinksToLayout.toArray()));
1101
1102 return content;
1103 }
1104
1105 @Override
1106 public String replaceImportContentReferences(
1107 PortletDataContext portletDataContext, Element entityElement,
1108 String content, boolean importReferencedContent)
1109 throws Exception {
1110
1111 content = ExportImportHelperUtil.replaceImportDLReferences(
1112 portletDataContext, entityElement, content,
1113 importReferencedContent);
1114
1115 content = ExportImportHelperUtil.replaceImportLayoutReferences(
1116 portletDataContext, content, importReferencedContent);
1117 content = ExportImportHelperUtil.replaceImportLinksToLayouts(
1118 portletDataContext, content, importReferencedContent);
1119
1120 return content;
1121 }
1122
1123 @Override
1124 public String replaceImportDLReferences(
1125 PortletDataContext portletDataContext, Element entityElement,
1126 String content, boolean importReferencedContent)
1127 throws Exception {
1128
1129 String elementPath = entityElement.attributeValue("path");
1130
1131 StagedModel entityStagedModel =
1132 (StagedModel)portletDataContext.getZipEntryAsObject(
1133 entityElement, elementPath);
1134
1135 List<Element> referenceElements =
1136 portletDataContext.getReferenceElements(
1137 entityStagedModel, DLFileEntry.class);
1138
1139 for (Element referenceElement : referenceElements) {
1140 long classPK = GetterUtil.getLong(
1141 referenceElement.attributeValue("class-pk"));
1142
1143 Element referenceDataElement =
1144 portletDataContext.getReferenceDataElement(
1145 entityStagedModel, DLFileEntry.class, classPK);
1146
1147 String path = null;
1148
1149 if (referenceDataElement != null) {
1150 path = referenceDataElement.attributeValue("path");
1151 }
1152
1153 long groupId = GetterUtil.getLong(
1154 referenceElement.attributeValue("group-id"));
1155
1156 if (Validator.isNull(path)) {
1157 String className = referenceElement.attributeValue(
1158 "class-name");
1159
1160 path = ExportImportPathUtil.getModelPath(
1161 groupId, className, classPK);
1162 }
1163
1164 if (!content.contains("[$dl-reference=" + path + "$]")) {
1165 continue;
1166 }
1167
1168 try {
1169 StagedModelDataHandlerUtil.importReferenceStagedModel(
1170 portletDataContext, entityStagedModel, DLFileEntry.class,
1171 classPK);
1172 }
1173 catch (Exception e) {
1174 if (_log.isDebugEnabled()) {
1175 _log.debug(e, e);
1176 }
1177 else if (_log.isWarnEnabled()) {
1178 StringBundler sb = new StringBundler(6);
1179
1180 sb.append("Unable to process file entry ");
1181 sb.append(classPK);
1182 sb.append(" for ");
1183 sb.append(entityStagedModel.getModelClassName());
1184 sb.append(" with primary key ");
1185 sb.append(entityStagedModel.getPrimaryKeyObj());
1186
1187 _log.warn(sb.toString());
1188 }
1189 }
1190
1191 Map<Long, Long> dlFileEntryIds =
1192 (Map<Long, Long>)portletDataContext.getNewPrimaryKeysMap(
1193 DLFileEntry.class);
1194
1195 long fileEntryId = MapUtil.getLong(
1196 dlFileEntryIds, classPK, classPK);
1197
1198 FileEntry importedFileEntry = null;
1199
1200 try {
1201 importedFileEntry = DLAppLocalServiceUtil.getFileEntry(
1202 fileEntryId);
1203 }
1204 catch (PortalException pe) {
1205 if (_log.isDebugEnabled()) {
1206 _log.debug(pe, pe);
1207 }
1208 else if (_log.isWarnEnabled()) {
1209 _log.warn(pe.getMessage());
1210 }
1211
1212 continue;
1213 }
1214
1215 String url = DLUtil.getPreviewURL(
1216 importedFileEntry, importedFileEntry.getFileVersion(), null,
1217 StringPool.BLANK, false, false);
1218
1219 if (url.contains(StringPool.QUESTION)) {
1220 content = StringUtil.replace(content, "$]?", "$]&");
1221 }
1222
1223 content = StringUtil.replace(
1224 content, "[$dl-reference=" + path + "$]", url);
1225 }
1226
1227 return content;
1228 }
1229
1230 @Override
1231 public String replaceImportLayoutReferences(
1232 PortletDataContext portletDataContext, String content,
1233 boolean importReferencedContent)
1234 throws Exception {
1235
1236 String companyPortalURL = StringPool.BLANK;
1237 String privateLayoutSetPortalURL = StringPool.BLANK;
1238 String publicLayoutSetPortalURL = StringPool.BLANK;
1239
1240 Group group = GroupLocalServiceUtil.getGroup(
1241 portletDataContext.getScopeGroupId());
1242
1243 Company company = CompanyLocalServiceUtil.getCompany(
1244 group.getCompanyId());
1245
1246 LayoutSet privateLayoutSet = group.getPrivateLayoutSet();
1247 LayoutSet publicLayoutSet = group.getPublicLayoutSet();
1248
1249 int portalPort = PortalUtil.getPortalPort(false);
1250
1251 if (portalPort != -1) {
1252 if (Validator.isNotNull(company.getVirtualHostname())) {
1253 companyPortalURL = PortalUtil.getPortalURL(
1254 company.getVirtualHostname(), portalPort, false);
1255 }
1256
1257 if (Validator.isNotNull(privateLayoutSet.getVirtualHostname())) {
1258 privateLayoutSetPortalURL = PortalUtil.getPortalURL(
1259 privateLayoutSet.getVirtualHostname(), portalPort, false);
1260 }
1261
1262 if (Validator.isNotNull(publicLayoutSet.getVirtualHostname())) {
1263 publicLayoutSetPortalURL = PortalUtil.getPortalURL(
1264 publicLayoutSet.getVirtualHostname(), portalPort, false);
1265 }
1266 }
1267
1268 int securePortalPort = PortalUtil.getPortalPort(true);
1269
1270 String companySecurePortalURL = StringPool.BLANK;
1271 String privateLayoutSetSecurePortalURL = StringPool.BLANK;
1272 String publicLayoutSetSecurePortalURL = StringPool.BLANK;
1273
1274 if (securePortalPort != -1) {
1275 if (Validator.isNotNull(company.getVirtualHostname())) {
1276 companySecurePortalURL = PortalUtil.getPortalURL(
1277 company.getVirtualHostname(), securePortalPort, true);
1278 }
1279
1280 if (Validator.isNotNull(privateLayoutSet.getVirtualHostname())) {
1281 privateLayoutSetSecurePortalURL = PortalUtil.getPortalURL(
1282 privateLayoutSet.getVirtualHostname(), securePortalPort,
1283 true);
1284 }
1285
1286 if (Validator.isNotNull(publicLayoutSet.getVirtualHostname())) {
1287 publicLayoutSetSecurePortalURL = PortalUtil.getPortalURL(
1288 publicLayoutSet.getVirtualHostname(), securePortalPort,
1289 true);
1290 }
1291 }
1292
1293 content = StringUtil.replace(
1294 content, DATA_HANDLER_COMPANY_SECURE_URL, companySecurePortalURL);
1295 content = StringUtil.replace(
1296 content, DATA_HANDLER_COMPANY_URL, companyPortalURL);
1297 content = StringUtil.replace(
1298 content, DATA_HANDLER_GROUP_FRIENDLY_URL, group.getFriendlyURL());
1299 content = StringUtil.replace(
1300 content, DATA_HANDLER_PATH_CONTEXT, PortalUtil.getPathContext());
1301 content = StringUtil.replace(
1302 content, DATA_HANDLER_PRIVATE_GROUP_SERVLET_MAPPING,
1303 PropsValues.LAYOUT_FRIENDLY_URL_PRIVATE_GROUP_SERVLET_MAPPING);
1304 content = StringUtil.replace(
1305 content, DATA_HANDLER_PRIVATE_LAYOUT_SET_SECURE_URL,
1306 privateLayoutSetSecurePortalURL);
1307 content = StringUtil.replace(
1308 content, DATA_HANDLER_PRIVATE_LAYOUT_SET_URL,
1309 privateLayoutSetPortalURL);
1310 content = StringUtil.replace(
1311 content, DATA_HANDLER_PRIVATE_USER_SERVLET_MAPPING,
1312 PropsValues.LAYOUT_FRIENDLY_URL_PRIVATE_USER_SERVLET_MAPPING);
1313 content = StringUtil.replace(
1314 content, DATA_HANDLER_PUBLIC_LAYOUT_SET_SECURE_URL,
1315 publicLayoutSetSecurePortalURL);
1316 content = StringUtil.replace(
1317 content, DATA_HANDLER_PUBLIC_LAYOUT_SET_URL,
1318 publicLayoutSetPortalURL);
1319 content = StringUtil.replace(
1320 content, DATA_HANDLER_PUBLIC_SERVLET_MAPPING,
1321 PropsValues.LAYOUT_FRIENDLY_URL_PUBLIC_SERVLET_MAPPING);
1322
1323 return content;
1324 }
1325
1326 @Override
1327 public String replaceImportLinksToLayouts(
1328 PortletDataContext portletDataContext, String content,
1329 boolean importReferencedContent)
1330 throws Exception {
1331
1332 List<String> oldLinksToLayout = new ArrayList<String>();
1333 List<String> newLinksToLayout = new ArrayList<String>();
1334
1335 Matcher matcher = _importLinksToLayoutPattern.matcher(content);
1336
1337 String layoutsImportMode = MapUtil.getString(
1338 portletDataContext.getParameterMap(),
1339 PortletDataHandlerKeys.LAYOUTS_IMPORT_MODE,
1340 PortletDataHandlerKeys.LAYOUTS_IMPORT_MODE_MERGE_BY_LAYOUT_UUID);
1341
1342 while (matcher.find()) {
1343 long oldGroupId = GetterUtil.getLong(matcher.group(7));
1344
1345 long newGroupId = oldGroupId;
1346
1347 long oldLayoutId = GetterUtil.getLong(matcher.group(1));
1348
1349 long newLayoutId = oldLayoutId;
1350
1351 String type = matcher.group(2);
1352
1353 boolean privateLayout = type.startsWith("private");
1354
1355 String layoutUuid = matcher.group(4);
1356 String friendlyURL = matcher.group(5);
1357
1358 Layout layout = null;
1359
1360 try {
1361 layout =
1362 LayoutLocalServiceUtil.fetchLayoutByUuidAndGroupId(
1363 layoutUuid, portletDataContext.getScopeGroupId(),
1364 privateLayout);
1365
1366 if (layout == null) {
1367 layout = LayoutLocalServiceUtil.fetchLayoutByFriendlyURL(
1368 portletDataContext.getScopeGroupId(), privateLayout,
1369 friendlyURL);
1370 }
1371
1372 if ((layout == null) && privateLayout &&
1373 layoutsImportMode.equals(
1374 PortletDataHandlerKeys.
1375 LAYOUTS_IMPORT_MODE_CREATED_FROM_PROTOTYPE)) {
1376
1377 layout = LayoutLocalServiceUtil.fetchLayoutByUuidAndGroupId(
1378 layoutUuid, portletDataContext.getScopeGroupId(),
1379 false);
1380 }
1381
1382 if (layout == null) {
1383 if (_log.isWarnEnabled()) {
1384 StringBundler sb = new StringBundler(9);
1385
1386 sb.append("Unable to get layout with UUID ");
1387 sb.append(layoutUuid);
1388 sb.append(", friendly URL ");
1389 sb.append(friendlyURL);
1390 sb.append(", or ");
1391 sb.append("layout ID ");
1392 sb.append(oldLayoutId);
1393 sb.append(" in group ");
1394 sb.append(portletDataContext.getScopeGroupId());
1395
1396 _log.warn(sb.toString());
1397 }
1398 }
1399 else {
1400 newGroupId = layout.getGroupId();
1401
1402 newLayoutId = layout.getLayoutId();
1403 }
1404 }
1405 catch (SystemException se) {
1406 if (_log.isDebugEnabled() || _log.isWarnEnabled()) {
1407 String message =
1408 "Unable to get layout in group " +
1409 portletDataContext.getScopeGroupId();
1410
1411 if (_log.isWarnEnabled()) {
1412 _log.warn(message);
1413 }
1414 else {
1415 _log.debug(message, se);
1416 }
1417 }
1418 }
1419
1420 String oldLinkToLayout = matcher.group(0);
1421
1422 StringBundler sb = new StringBundler(4);
1423
1424 sb.append(StringPool.AT);
1425 sb.append(layoutUuid);
1426 sb.append(StringPool.AT);
1427 sb.append(friendlyURL);
1428
1429 String newLinkToLayout = StringUtil.replaceFirst(
1430 oldLinkToLayout,
1431 new String[] {sb.toString(), String.valueOf(oldLayoutId)},
1432 new String[] {StringPool.BLANK, String.valueOf(newLayoutId)});
1433
1434 if ((layout != null) && layout.isPublicLayout() &&
1435 layoutsImportMode.equals(
1436 PortletDataHandlerKeys.
1437 LAYOUTS_IMPORT_MODE_CREATED_FROM_PROTOTYPE)) {
1438
1439 newLinkToLayout = StringUtil.replace(
1440 newLinkToLayout, "private-group", "public");
1441 }
1442
1443 if ((oldGroupId != 0) && (oldGroupId != newGroupId)) {
1444 newLinkToLayout = StringUtil.replaceLast(
1445 newLinkToLayout, String.valueOf(oldGroupId),
1446 String.valueOf(newGroupId));
1447 }
1448
1449 oldLinksToLayout.add(oldLinkToLayout);
1450 newLinksToLayout.add(newLinkToLayout);
1451 }
1452
1453 content = StringUtil.replace(
1454 content, ArrayUtil.toStringArray(oldLinksToLayout.toArray()),
1455 ArrayUtil.toStringArray(newLinksToLayout.toArray()));
1456
1457 return content;
1458 }
1459
1460 @Override
1461 public void updateExportPortletPreferencesClassPKs(
1462 PortletDataContext portletDataContext, Portlet portlet,
1463 PortletPreferences portletPreferences, String key, String className,
1464 Element rootElement)
1465 throws Exception {
1466
1467 String[] oldValues = portletPreferences.getValues(key, null);
1468
1469 if (oldValues == null) {
1470 return;
1471 }
1472
1473 String[] newValues = new String[oldValues.length];
1474
1475 for (int i = 0; i < oldValues.length; i++) {
1476 String oldValue = oldValues[i];
1477
1478 String newValue = oldValue;
1479
1480 String[] primaryKeys = StringUtil.split(oldValue);
1481
1482 for (String primaryKey : primaryKeys) {
1483 if (!Validator.isNumber(primaryKey)) {
1484 break;
1485 }
1486
1487 long primaryKeyLong = GetterUtil.getLong(primaryKey);
1488
1489 String uuid = getExportPortletPreferencesUuid(
1490 portletDataContext, portlet, className, rootElement,
1491 primaryKeyLong);
1492
1493 if (Validator.isNull(uuid)) {
1494 if (_log.isWarnEnabled()) {
1495 _log.warn(
1496 "Unable to get UUID for class " + className +
1497 " with primary key " + primaryKeyLong);
1498 }
1499
1500 continue;
1501 }
1502
1503 newValue = StringUtil.replace(newValue, primaryKey, uuid);
1504 }
1505
1506 newValues[i] = newValue;
1507 }
1508
1509 portletPreferences.setValues(key, newValues);
1510 }
1511
1512 @Override
1513 public void updateImportPortletPreferencesClassPKs(
1514 PortletDataContext portletDataContext,
1515 PortletPreferences portletPreferences, String key, Class<?> clazz,
1516 long companyGroupId)
1517 throws Exception {
1518
1519 String[] oldValues = portletPreferences.getValues(key, null);
1520
1521 if (oldValues == null) {
1522 return;
1523 }
1524
1525 Map<Long, Long> primaryKeys =
1526 (Map<Long, Long>)portletDataContext.getNewPrimaryKeysMap(clazz);
1527
1528 String[] newValues = new String[oldValues.length];
1529
1530 for (int i = 0; i < oldValues.length; i++) {
1531 String oldValue = oldValues[i];
1532
1533 String newValue = oldValue;
1534
1535 String[] uuids = StringUtil.split(oldValue);
1536
1537 for (String uuid : uuids) {
1538 Long newPrimaryKey = getImportPortletPreferencesNewPrimaryKey(
1539 portletDataContext, clazz, companyGroupId, primaryKeys,
1540 uuid);
1541
1542 if (Validator.isNull(newPrimaryKey)) {
1543 if (_log.isWarnEnabled()) {
1544 StringBundler sb = new StringBundler(8);
1545
1546 sb.append("Unable to get primary key for ");
1547 sb.append(clazz);
1548 sb.append(" with UUID ");
1549 sb.append(uuid);
1550 sb.append(" in company group ");
1551 sb.append(companyGroupId);
1552 sb.append(" or in group ");
1553 sb.append(portletDataContext.getScopeGroupId());
1554
1555 _log.warn(sb.toString());
1556 }
1557 }
1558 else {
1559 newValue = StringUtil.replace(
1560 newValue, uuid, newPrimaryKey.toString());
1561 }
1562 }
1563
1564 newValues[i] = newValue;
1565 }
1566
1567 portletPreferences.setValues(key, newValues);
1568 }
1569
1570 @Override
1571 public MissingReferences validateMissingReferences(
1572 long userId, long groupId, Map<String, String[]> parameterMap,
1573 File file)
1574 throws Exception {
1575
1576 final MissingReferences missingReferences = new MissingReferences();
1577
1578 Group group = GroupLocalServiceUtil.getGroup(groupId);
1579 String userIdStrategy = MapUtil.getString(
1580 parameterMap, PortletDataHandlerKeys.USER_ID_STRATEGY);
1581 ZipReader zipReader = ZipReaderFactoryUtil.getZipReader(file);
1582
1583 final PortletDataContext portletDataContext =
1584 PortletDataContextFactoryUtil.createImportPortletDataContext(
1585 group.getCompanyId(), groupId, parameterMap,
1586 getUserIdStrategy(userId, userIdStrategy), zipReader);
1587
1588 try {
1589 XMLReader xmlReader = SecureXMLFactoryProviderUtil.newXMLReader();
1590
1591 ElementHandler elementHandler = new ElementHandler(
1592 new ElementProcessor() {
1593
1594 @Override
1595 public void processElement(Element element) {
1596 MissingReference missingReference =
1597 validateMissingReference(
1598 portletDataContext, element);
1599
1600 if (missingReference != null) {
1601 missingReferences.add(missingReference);
1602 }
1603 }
1604
1605 },
1606 new String[] {"missing-reference"});
1607
1608 xmlReader.setContentHandler(elementHandler);
1609
1610 xmlReader.parse(
1611 new InputSource(
1612 portletDataContext.getZipEntryAsInputStream(
1613 "/manifest.xml")));
1614
1615 return missingReferences;
1616 }
1617 finally {
1618 zipReader.close();
1619 }
1620 }
1621
1622 @Override
1623 public void validateReferencedFileEntryGroup(
1624 PortletDataContext portletDataContext, FileEntry fileEntry)
1625 throws PortletDataException {
1626
1627 if ((fileEntry.getGroupId() != portletDataContext.getGroupId()) &&
1628 (fileEntry.getGroupId() != portletDataContext.getScopeGroupId())) {
1629
1630 PortletDataException pde = new PortletDataException(
1631 PortletDataException.INVALID_GROUP);
1632
1633 pde.setStagedModel(fileEntry);
1634
1635 throw pde;
1636 }
1637 }
1638
1639 @Override
1640 public void writeManifestSummary(
1641 Document document, ManifestSummary manifestSummary) {
1642
1643 Element rootElement = document.getRootElement();
1644
1645 Element manifestSummaryElement = rootElement.addElement(
1646 "manifest-summary");
1647
1648 for (String manifestSummaryKey :
1649 manifestSummary.getManifestSummaryKeys()) {
1650
1651 Element element = manifestSummaryElement.addElement("staged-model");
1652
1653 element.addAttribute("manifest-summary-key", manifestSummaryKey);
1654
1655 long modelAdditionCount = manifestSummary.getModelAdditionCount(
1656 manifestSummaryKey);
1657
1658 if (modelAdditionCount > 0) {
1659 element.addAttribute(
1660 "addition-count", String.valueOf(modelAdditionCount));
1661 }
1662
1663 long modelDeletionCount = manifestSummary.getModelDeletionCount(
1664 manifestSummaryKey);
1665
1666 if (modelDeletionCount > 0) {
1667 element.addAttribute(
1668 "deletion-count", String.valueOf(modelDeletionCount));
1669 }
1670 }
1671 }
1672
1673 protected void deleteTimestampParameters(StringBuilder sb, int beginPos) {
1674 beginPos = sb.indexOf(StringPool.CLOSE_BRACKET, beginPos);
1675
1676 if ((beginPos == -1) || (beginPos == (sb.length() - 1)) ||
1677 (sb.charAt(beginPos + 1) != CharPool.QUESTION)) {
1678
1679 return;
1680 }
1681
1682 int endPos = StringUtil.indexOfAny(
1683 sb.toString(), _DL_REFERENCE_LEGACY_STOP_CHARS, beginPos + 2);
1684
1685 if (endPos == -1) {
1686 return;
1687 }
1688
1689 String urlParams = sb.substring(beginPos + 1, endPos);
1690
1691 urlParams = HttpUtil.removeParameter(urlParams, "t");
1692
1693 sb.replace(beginPos + 1, endPos, urlParams);
1694 }
1695
1696 protected Map<String, String[]> getDLReferenceParameters(
1697 PortletDataContext portletDataContext, String content, int beginPos,
1698 int endPos) {
1699
1700 boolean legacyURL = true;
1701 char[] stopChars = _DL_REFERENCE_LEGACY_STOP_CHARS;
1702
1703 if (content.startsWith("/documents/", beginPos)) {
1704 legacyURL = false;
1705 stopChars = _DL_REFERENCE_STOP_CHARS;
1706 }
1707
1708 endPos = StringUtil.indexOfAny(content, stopChars, beginPos, endPos);
1709
1710 if (endPos == -1) {
1711 return null;
1712 }
1713
1714 Map<String, String[]> map = new HashMap<String, String[]>();
1715
1716 String dlReference = content.substring(beginPos, endPos);
1717
1718 while (dlReference.contains(StringPool.AMPERSAND_ENCODED)) {
1719 dlReference = dlReference.replace(
1720 StringPool.AMPERSAND_ENCODED, StringPool.AMPERSAND);
1721 }
1722
1723 if (!legacyURL) {
1724 String[] pathArray = dlReference.split(StringPool.SLASH);
1725
1726 if (pathArray.length < 3) {
1727 return map;
1728 }
1729
1730 map.put("groupId", new String[] {pathArray[2]});
1731
1732 if (pathArray.length == 4) {
1733 map.put("uuid", new String[] {pathArray[3]});
1734 }
1735 else if (pathArray.length == 5) {
1736 map.put("folderId", new String[] {pathArray[3]});
1737 map.put(
1738 "title", new String[] {HttpUtil.decodeURL(pathArray[4])});
1739 }
1740 else if (pathArray.length > 5) {
1741 map.put("uuid", new String[] {pathArray[5]});
1742 }
1743 }
1744 else {
1745 dlReference = dlReference.substring(
1746 dlReference.indexOf(CharPool.QUESTION) + 1);
1747
1748 map = HttpUtil.parameterMapFromString(dlReference);
1749
1750 String[] imageIds = null;
1751
1752 if (map.containsKey("img_id")) {
1753 imageIds = map.get("img_id");
1754 }
1755 else if (map.containsKey("i_id")) {
1756 imageIds = map.get("i_id");
1757 }
1758
1759 imageIds = ArrayUtil.filter(
1760 imageIds,
1761 new PredicateFilter<String>() {
1762
1763 @Override
1764 public boolean filter(String imageId) {
1765 if (Validator.isNotNull(imageId)) {
1766 return true;
1767 }
1768
1769 return false;
1770 }
1771 });
1772
1773 if (ArrayUtil.isNotEmpty(imageIds)) {
1774 map.put("image_id", imageIds);
1775 }
1776 }
1777
1778 map.put("endPos", new String[] {String.valueOf(endPos)});
1779
1780 String groupIdString = MapUtil.getString(map, "groupId");
1781
1782 if (groupIdString.equals("@group_id@")) {
1783 groupIdString = String.valueOf(
1784 portletDataContext.getScopeGroupId());
1785
1786 map.put("groupId", new String[] {groupIdString});
1787 }
1788
1789 return map;
1790 }
1791
1792 protected String getExportPortletPreferencesUuid(
1793 PortletDataContext portletDataContext, Portlet portlet,
1794 String className, Element rootElement, long primaryKeyLong)
1795 throws Exception {
1796
1797 String uuid = null;
1798
1799 if (className.equals(AssetCategory.class.getName())) {
1800 AssetCategory assetCategory =
1801 AssetCategoryLocalServiceUtil.fetchCategory(primaryKeyLong);
1802
1803 if (assetCategory != null) {
1804 uuid = assetCategory.getUuid();
1805
1806 portletDataContext.addReferenceElement(
1807 portlet, rootElement, assetCategory, AssetCategory.class,
1808 PortletDataContext.REFERENCE_TYPE_DEPENDENCY, true);
1809 }
1810 }
1811 else if (className.equals(AssetVocabulary.class.getName())) {
1812 AssetVocabulary assetVocabulary =
1813 AssetVocabularyLocalServiceUtil.fetchAssetVocabulary(
1814 primaryKeyLong);
1815
1816 if (assetVocabulary != null) {
1817 uuid = assetVocabulary.getUuid();
1818
1819 portletDataContext.addReferenceElement(
1820 portlet, rootElement, assetVocabulary,
1821 AssetVocabulary.class,
1822 PortletDataContext.REFERENCE_TYPE_DEPENDENCY, true);
1823 }
1824 }
1825 else if (className.equals(DDMStructure.class.getName())) {
1826 DDMStructure ddmStructure =
1827 DDMStructureLocalServiceUtil.fetchStructure(primaryKeyLong);
1828
1829 if (ddmStructure != null) {
1830 uuid = ddmStructure.getUuid();
1831
1832 portletDataContext.addReferenceElement(
1833 portlet, rootElement, ddmStructure, DDMStructure.class,
1834 PortletDataContext.REFERENCE_TYPE_DEPENDENCY, true);
1835 }
1836 }
1837 else if (className.equals(DLFileEntryType.class.getName())) {
1838 DLFileEntryType dlFileEntryType =
1839 DLFileEntryTypeLocalServiceUtil.fetchFileEntryType(
1840 primaryKeyLong);
1841
1842 if (dlFileEntryType != null) {
1843 uuid = dlFileEntryType.getUuid();
1844
1845 portletDataContext.addReferenceElement(
1846 portlet, rootElement, dlFileEntryType,
1847 DLFileEntryType.class,
1848 PortletDataContext.REFERENCE_TYPE_DEPENDENCY, true);
1849 }
1850 }
1851 else if (className.equals(Organization.class.getName())) {
1852 Organization organization =
1853 OrganizationLocalServiceUtil.fetchOrganization(primaryKeyLong);
1854
1855 if (organization != null) {
1856 uuid = organization.getUuid();
1857
1858 portletDataContext.addReferenceElement(
1859 portlet, rootElement, organization, Organization.class,
1860 PortletDataContext.REFERENCE_TYPE_DEPENDENCY, true);
1861 }
1862 }
1863
1864 return uuid;
1865 }
1866
1867 protected FileEntry getFileEntry(Map<String, String[]> map) {
1868 if ((map == null) || map.isEmpty()) {
1869 return null;
1870 }
1871
1872 FileEntry fileEntry = null;
1873
1874 try {
1875 String uuid = MapUtil.getString(map, "uuid");
1876 long groupId = MapUtil.getLong(map, "groupId");
1877
1878 if (Validator.isNotNull(uuid)) {
1879 fileEntry =
1880 DLAppLocalServiceUtil.getFileEntryByUuidAndGroupId(
1881 uuid, groupId);
1882 }
1883 else {
1884 if (map.containsKey("folderId")) {
1885 long folderId = MapUtil.getLong(map, "folderId");
1886 String name = MapUtil.getString(map, "name");
1887 String title = MapUtil.getString(map, "title");
1888
1889 if (Validator.isNotNull(title)) {
1890 fileEntry = DLAppLocalServiceUtil.getFileEntry(
1891 groupId, folderId, title);
1892 }
1893 else {
1894 DLFileEntry dlFileEntry =
1895 DLFileEntryLocalServiceUtil.fetchFileEntryByName(
1896 groupId, folderId, name);
1897
1898 if (dlFileEntry != null) {
1899 fileEntry = DLAppLocalServiceUtil.getFileEntry(
1900 dlFileEntry.getFileEntryId());
1901 }
1902 }
1903 }
1904 else if (map.containsKey("image_id")) {
1905 DLFileEntry dlFileEntry =
1906 DLFileEntryLocalServiceUtil.fetchFileEntryByAnyImageId(
1907 MapUtil.getLong(map, "image_id"));
1908
1909 if (dlFileEntry != null) {
1910 fileEntry = DLAppLocalServiceUtil.getFileEntry(
1911 dlFileEntry.getFileEntryId());
1912 }
1913 }
1914 }
1915 }
1916 catch (Exception e) {
1917 if (_log.isDebugEnabled()) {
1918 _log.debug(e, e);
1919 }
1920 else if (_log.isWarnEnabled()) {
1921 _log.warn(e.getMessage());
1922 }
1923 }
1924
1925 return fileEntry;
1926 }
1927
1928 protected Long getImportPortletPreferencesNewPrimaryKey(
1929 PortletDataContext portletDataContext, Class<?> clazz,
1930 long companyGroupId, Map<Long, Long> primaryKeys, String uuid)
1931 throws Exception {
1932
1933 if (Validator.isNumber(uuid)) {
1934 long oldPrimaryKey = GetterUtil.getLong(uuid);
1935
1936 return MapUtil.getLong(primaryKeys, oldPrimaryKey, oldPrimaryKey);
1937 }
1938
1939 String className = clazz.getName();
1940
1941 if (className.equals(AssetCategory.class.getName())) {
1942 AssetCategory assetCategory = AssetCategoryUtil.fetchByUUID_G(
1943 uuid, portletDataContext.getScopeGroupId());
1944
1945 if (assetCategory == null) {
1946 assetCategory = AssetCategoryUtil.fetchByUUID_G(
1947 uuid, companyGroupId);
1948 }
1949
1950 if (assetCategory != null) {
1951 return assetCategory.getCategoryId();
1952 }
1953 }
1954 else if (className.equals(AssetVocabulary.class.getName())) {
1955 AssetVocabulary assetVocabulary = AssetVocabularyUtil.fetchByUUID_G(
1956 uuid, portletDataContext.getScopeGroupId());
1957
1958 if (assetVocabulary == null) {
1959 assetVocabulary = AssetVocabularyUtil.fetchByUUID_G(
1960 uuid, companyGroupId);
1961 }
1962
1963 if (assetVocabulary != null) {
1964 return assetVocabulary.getVocabularyId();
1965 }
1966 }
1967 else if (className.equals(DDMStructure.class.getName())) {
1968 DDMStructure ddmStructure = DDMStructureUtil.fetchByUUID_G(
1969 uuid, portletDataContext.getScopeGroupId());
1970
1971 if (ddmStructure == null) {
1972 ddmStructure = DDMStructureUtil.fetchByUUID_G(
1973 uuid, companyGroupId);
1974 }
1975
1976 if (ddmStructure != null) {
1977 return ddmStructure.getStructureId();
1978 }
1979 }
1980 else if (className.equals(DLFileEntryType.class.getName())) {
1981 DLFileEntryType dlFileEntryType = DLFileEntryTypeUtil.fetchByUUID_G(
1982 uuid, portletDataContext.getScopeGroupId());
1983
1984 if (dlFileEntryType == null) {
1985 dlFileEntryType = DLFileEntryTypeUtil.fetchByUUID_G(
1986 uuid, companyGroupId);
1987 }
1988
1989 if (dlFileEntryType == null) {
1990 Element rootElement =
1991 portletDataContext.getImportDataRootElement();
1992
1993 Element element = portletDataContext.getReferenceElement(
1994 rootElement, clazz, companyGroupId, uuid,
1995 PortletDataContext.REFERENCE_TYPE_DEPENDENCY);
1996
1997 if (element != null) {
1998 String fileEntryTypeKey = element.attributeValue(
1999 "file-entry-type-key");
2000
2001 boolean preloaded = GetterUtil.getBoolean(
2002 element.attributeValue("preloaded"));
2003
2004 if (preloaded) {
2005 dlFileEntryType =
2006 DLFileEntryTypeLocalServiceUtil.fetchFileEntryType(
2007 companyGroupId, fileEntryTypeKey);
2008 }
2009 }
2010 }
2011
2012 if (dlFileEntryType != null) {
2013 return dlFileEntryType.getFileEntryTypeId();
2014 }
2015 }
2016 else if (className.equals(Organization.class.getName())) {
2017 Organization organization = OrganizationUtil.fetchByUuid_C_First(
2018 uuid, portletDataContext.getCompanyId(), null);
2019
2020 if (organization != null) {
2021 return organization.getOrganizationId();
2022 }
2023 }
2024
2025 return null;
2026 }
2027
2028 protected UserIdStrategy getUserIdStrategy(
2029 long userId, String userIdStrategy)
2030 throws Exception {
2031
2032 User user = UserLocalServiceUtil.getUserById(userId);
2033
2034 if (UserIdStrategy.ALWAYS_CURRENT_USER_ID.equals(userIdStrategy)) {
2035 return new AlwaysCurrentUserIdStrategy(user);
2036 }
2037
2038 return new CurrentUserIdStrategy(user);
2039 }
2040
2041 protected ZipWriter getZipWriter(String fileName) {
2042 if (!ExportImportThreadLocal.isStagingInProcess() ||
2043 (PropsValues.STAGING_DELETE_TEMP_LAR_ON_FAILURE &&
2044 PropsValues.STAGING_DELETE_TEMP_LAR_ON_SUCCESS)) {
2045
2046 return ZipWriterFactoryUtil.getZipWriter();
2047 }
2048
2049 return ZipWriterFactoryUtil.getZipWriter(
2050 new File(
2051 SystemProperties.get(SystemProperties.TMP_DIR) +
2052 StringPool.SLASH + fileName));
2053 }
2054
2055 protected boolean populateLayoutsJSON(
2056 JSONArray layoutsJSONArray, Layout layout, long[] selectedLayoutIds)
2057 throws SystemException {
2058
2059 List<Layout> childLayouts = layout.getChildren();
2060 JSONArray childLayoutsJSONArray = null;
2061 boolean includeChildren = true;
2062
2063 if (!childLayouts.isEmpty()) {
2064 childLayoutsJSONArray = JSONFactoryUtil.createJSONArray();
2065
2066 for (Layout childLayout : childLayouts) {
2067 if (!populateLayoutsJSON(
2068 childLayoutsJSONArray, childLayout,
2069 selectedLayoutIds)) {
2070
2071 includeChildren = false;
2072 }
2073 }
2074 }
2075
2076 boolean checked = ArrayUtil.contains(
2077 selectedLayoutIds, layout.getLayoutId());
2078
2079 if (checked) {
2080 JSONObject layoutJSONObject = JSONFactoryUtil.createJSONObject();
2081
2082 layoutJSONObject.put("includeChildren", includeChildren);
2083 layoutJSONObject.put("plid", layout.getPlid());
2084
2085 layoutsJSONArray.put(layoutJSONObject);
2086 }
2087
2088 if (checked && includeChildren) {
2089 return true;
2090 }
2091
2092 if (childLayoutsJSONArray != null) {
2093
2094
2095
2096 for (int i = 0; i < childLayoutsJSONArray.length(); i++) {
2097 layoutsJSONArray.put(childLayoutsJSONArray.getJSONObject(i));
2098 }
2099 }
2100
2101 return false;
2102 }
2103
2104 protected String replaceExportHostname(
2105 PortletDataContext portletDataContext, String url,
2106 StringBundler urlSB)
2107 throws PortalException, SystemException {
2108
2109 if (!HttpUtil.hasProtocol(url)) {
2110 return url;
2111 }
2112
2113 boolean secure = HttpUtil.isSecure(url);
2114
2115 int portalPort = PortalUtil.getPortalPort(secure);
2116
2117 if (portalPort == -1) {
2118 return url;
2119 }
2120
2121 Group group = GroupLocalServiceUtil.getGroup(
2122 portletDataContext.getScopeGroupId());
2123
2124 LayoutSet publicLayoutSet = group.getPublicLayoutSet();
2125
2126 String publicLayoutSetVirtualHostname =
2127 publicLayoutSet.getVirtualHostname();
2128
2129 String portalUrl = StringPool.BLANK;
2130
2131 if (Validator.isNotNull(publicLayoutSetVirtualHostname)) {
2132 portalUrl = PortalUtil.getPortalURL(
2133 publicLayoutSetVirtualHostname, portalPort, secure);
2134
2135 if (url.startsWith(portalUrl)) {
2136 if (secure) {
2137 urlSB.append(DATA_HANDLER_PUBLIC_LAYOUT_SET_SECURE_URL);
2138 }
2139 else {
2140 urlSB.append(DATA_HANDLER_PUBLIC_LAYOUT_SET_URL);
2141 }
2142
2143 return url.substring(portalUrl.length());
2144 }
2145 }
2146
2147 LayoutSet privateLayoutSet = group.getPrivateLayoutSet();
2148
2149 String privateLayoutSetVirtualHostname =
2150 privateLayoutSet.getVirtualHostname();
2151
2152 if (Validator.isNotNull(privateLayoutSetVirtualHostname)) {
2153 portalUrl = PortalUtil.getPortalURL(
2154 privateLayoutSetVirtualHostname, portalPort, secure);
2155
2156 if (url.startsWith(portalUrl)) {
2157 if (secure) {
2158 urlSB.append(DATA_HANDLER_PRIVATE_LAYOUT_SET_SECURE_URL);
2159 }
2160 else {
2161 urlSB.append(DATA_HANDLER_PRIVATE_LAYOUT_SET_URL);
2162 }
2163
2164 return url.substring(portalUrl.length());
2165 }
2166 }
2167
2168 Company company = CompanyLocalServiceUtil.getCompany(
2169 group.getCompanyId());
2170
2171 String companyVirtualHostname = company.getVirtualHostname();
2172
2173 if (Validator.isNotNull(companyVirtualHostname)) {
2174 portalUrl = PortalUtil.getPortalURL(
2175 companyVirtualHostname, portalPort, secure);
2176
2177 if (url.startsWith(portalUrl)) {
2178 if (secure) {
2179 urlSB.append(DATA_HANDLER_COMPANY_SECURE_URL);
2180 }
2181 else {
2182 urlSB.append(DATA_HANDLER_COMPANY_URL);
2183 }
2184
2185 return url.substring(portalUrl.length());
2186 }
2187 }
2188
2189 portalUrl = PortalUtil.getPortalURL("localhost", portalPort, secure);
2190
2191 if (url.startsWith(portalUrl)) {
2192 return url.substring(portalUrl.length());
2193 }
2194
2195 return url;
2196 }
2197
2198 protected MissingReference validateMissingReference(
2199 PortletDataContext portletDataContext, Element element) {
2200
2201 String className = element.attributeValue("class-name");
2202
2203 StagedModelDataHandler<?> stagedModelDataHandler =
2204 StagedModelDataHandlerRegistryUtil.getStagedModelDataHandler(
2205 className);
2206
2207 if (!stagedModelDataHandler.validateReference(
2208 portletDataContext, element)) {
2209
2210 MissingReference missingReference = new MissingReference(element);
2211
2212 Map<Long, Long> groupIds =
2213 (Map<Long, Long>)portletDataContext.getNewPrimaryKeysMap(
2214 Group.class);
2215
2216 long groupId = MapUtil.getLong(
2217 groupIds,
2218 GetterUtil.getLong(element.attributeValue("group-id")));
2219
2220 missingReference.setGroupId(groupId);
2221
2222 return missingReference;
2223 }
2224
2225 return null;
2226 }
2227
2228 private static final char[] _DL_REFERENCE_LEGACY_STOP_CHARS = {
2229 CharPool.APOSTROPHE, CharPool.CLOSE_BRACKET, CharPool.CLOSE_CURLY_BRACE,
2230 CharPool.CLOSE_PARENTHESIS, CharPool.GREATER_THAN, CharPool.LESS_THAN,
2231 CharPool.PIPE, CharPool.QUOTE, CharPool.SPACE
2232 };
2233
2234 private static final char[] _DL_REFERENCE_STOP_CHARS = {
2235 CharPool.APOSTROPHE, CharPool.CLOSE_BRACKET, CharPool.CLOSE_CURLY_BRACE,
2236 CharPool.CLOSE_PARENTHESIS, CharPool.GREATER_THAN, CharPool.LESS_THAN,
2237 CharPool.PIPE, CharPool.QUESTION, CharPool.QUOTE, CharPool.SPACE
2238 };
2239
2240 private static final String[] _EXTRANEOUS_REINDEX_PRIMARY_KEYS_MAPS_KEYS = {
2241 AssetCategory.class + ".uuid", DDMStructure.class + ".ddmStructureKey",
2242 DDMTemplate.class + ".ddmTemplateKey", Layout.class + ".layout"};
2243
2244 private static final char[] _LAYOUT_REFERENCE_STOP_CHARS = {
2245 CharPool.APOSTROPHE, CharPool.CLOSE_BRACKET, CharPool.CLOSE_CURLY_BRACE,
2246 CharPool.CLOSE_PARENTHESIS, CharPool.GREATER_THAN, CharPool.LESS_THAN,
2247 CharPool.PIPE, CharPool.QUESTION, CharPool.QUOTE, CharPool.SPACE
2248 };
2249
2250 private static final String _PRIVATE_GROUP_SERVLET_MAPPING =
2251 PropsValues.LAYOUT_FRIENDLY_URL_PRIVATE_GROUP_SERVLET_MAPPING +
2252 StringPool.SLASH;
2253
2254 private static final String _PRIVATE_USER_SERVLET_MAPPING =
2255 PropsValues.LAYOUT_FRIENDLY_URL_PRIVATE_USER_SERVLET_MAPPING +
2256 StringPool.SLASH;
2257
2258 private static final String _PUBLIC_GROUP_SERVLET_MAPPING =
2259 PropsValues.LAYOUT_FRIENDLY_URL_PUBLIC_SERVLET_MAPPING +
2260 StringPool.SLASH;
2261
2262 private static Log _log = LogFactoryUtil.getLog(
2263 ExportImportHelperImpl.class);
2264
2265 private Pattern _exportLinksToLayoutPattern = Pattern.compile(
2266 "\\[([\\d]+)@(private(-group|-user)?|public)(@([\\d]+))?\\]");
2267 private Pattern _importLinksToLayoutPattern = Pattern.compile(
2268 "\\[([\\d]+)@(private(-group|-user)?|public)@(\\p{XDigit}{8}\\-" +
2269 "(?:\\p{XDigit}{4}\\-){3}\\p{XDigit}{12})@([a-z0-9./_-]*)" +
2270 "(@([\\d]+))?\\]");
2271
2272 private class ManifestSummaryElementProcessor implements ElementProcessor {
2273
2274 public ManifestSummaryElementProcessor(
2275 Group group, ManifestSummary manifestSummary) {
2276
2277 _group = group;
2278 _manifestSummary = manifestSummary;
2279 }
2280
2281 @Override
2282 public void processElement(Element element) {
2283 String elementName = element.getName();
2284
2285 if (elementName.equals("header")) {
2286 String exportDateString = element.attributeValue("export-date");
2287
2288 Date exportDate = GetterUtil.getDate(
2289 exportDateString,
2290 DateFormatFactoryUtil.getSimpleDateFormat(
2291 Time.RFC822_FORMAT));
2292
2293 _manifestSummary.setExportDate(exportDate);
2294 }
2295 else if (elementName.equals("portlet")) {
2296 String portletId = element.attributeValue("portlet-id");
2297
2298 Portlet portlet = null;
2299
2300 try {
2301 portlet = PortletLocalServiceUtil.getPortletById(
2302 _group.getCompanyId(), portletId);
2303 }
2304 catch (Exception e) {
2305 return;
2306 }
2307
2308 PortletDataHandler portletDataHandler =
2309 portlet.getPortletDataHandlerInstance();
2310
2311 if (portletDataHandler == null) {
2312 return;
2313 }
2314
2315 String[] configurationPortletOptions = StringUtil.split(
2316 element.attributeValue("portlet-configuration"));
2317
2318 PortletDataHandlerControl[] portletDataHandlerControls =
2319 portletDataHandler.getImportConfigurationControls(
2320 configurationPortletOptions);
2321
2322 if (ArrayUtil.isNotEmpty(portletDataHandlerControls)) {
2323 _manifestSummary.addConfigurationPortlet(
2324 portlet, configurationPortletOptions);
2325 }
2326
2327 if (!(portletDataHandler instanceof
2328 DefaultConfigurationPortletDataHandler) &&
2329 portletDataHandler.isDataSiteLevel() &&
2330 GetterUtil.getBoolean(
2331 element.attributeValue("portlet-data"))) {
2332
2333 _manifestSummary.addDataPortlet(portlet);
2334 }
2335 }
2336 else if (elementName.equals("staged-model")) {
2337 String manifestSummaryKey = element.attributeValue(
2338 "manifest-summary-key");
2339
2340 long modelAdditionCount = GetterUtil.getLong(
2341 element.attributeValue("addition-count"));
2342
2343 _manifestSummary.addModelAdditionCount(
2344 manifestSummaryKey, modelAdditionCount);
2345
2346 long modelDeletionCount = GetterUtil.getLong(
2347 element.attributeValue("deletion-count"));
2348
2349 _manifestSummary.addModelDeletionCount(
2350 manifestSummaryKey, modelDeletionCount);
2351 }
2352 }
2353
2354 private Group _group;
2355 private ManifestSummary _manifestSummary;
2356
2357 }
2358
2359 }