1   /**
2    * Copyright (c) 2000-2010 Liferay, Inc. All rights reserved.
3    *
4    * The contents of this file are subject to the terms of the Liferay Enterprise
5    * Subscription License ("License"). You may not use this file except in
6    * compliance with the License. You can obtain a copy of the License by
7    * contacting Liferay, Inc. See the License for the specific language governing
8    * permissions and limitations under the License, including but not limited to
9    * distribution rights of the Software.
10   *
11   *
12   * 
13   */
14  
15  package com.liferay.portlet.documentlibrary.lar;
16  
17  import com.liferay.documentlibrary.service.DLLocalServiceUtil;
18  import com.liferay.portal.PortalException;
19  import com.liferay.portal.SystemException;
20  import com.liferay.portal.kernel.log.Log;
21  import com.liferay.portal.kernel.log.LogFactoryUtil;
22  import com.liferay.portal.kernel.util.MapUtil;
23  import com.liferay.portal.kernel.util.StringBundler;
24  import com.liferay.portal.kernel.util.StringPool;
25  import com.liferay.portal.kernel.xml.Document;
26  import com.liferay.portal.kernel.xml.Element;
27  import com.liferay.portal.kernel.xml.SAXReaderUtil;
28  import com.liferay.portal.lar.PortletDataContext;
29  import com.liferay.portal.lar.PortletDataException;
30  import com.liferay.portal.lar.PortletDataHandler;
31  import com.liferay.portal.lar.PortletDataHandlerBoolean;
32  import com.liferay.portal.lar.PortletDataHandlerControl;
33  import com.liferay.portal.lar.PortletDataHandlerKeys;
34  import com.liferay.portal.util.PortletKeys;
35  import com.liferay.portlet.documentlibrary.NoSuchFileEntryException;
36  import com.liferay.portlet.documentlibrary.NoSuchFileShortcutException;
37  import com.liferay.portlet.documentlibrary.NoSuchFolderException;
38  import com.liferay.portlet.documentlibrary.model.DLFileEntry;
39  import com.liferay.portlet.documentlibrary.model.DLFileRank;
40  import com.liferay.portlet.documentlibrary.model.DLFileShortcut;
41  import com.liferay.portlet.documentlibrary.model.DLFolder;
42  import com.liferay.portlet.documentlibrary.model.DLFolderConstants;
43  import com.liferay.portlet.documentlibrary.service.DLFileEntryLocalServiceUtil;
44  import com.liferay.portlet.documentlibrary.service.DLFileRankLocalServiceUtil;
45  import com.liferay.portlet.documentlibrary.service.DLFileShortcutLocalServiceUtil;
46  import com.liferay.portlet.documentlibrary.service.DLFolderLocalServiceUtil;
47  import com.liferay.portlet.documentlibrary.service.persistence.DLFileEntryUtil;
48  import com.liferay.portlet.documentlibrary.service.persistence.DLFileRankUtil;
49  import com.liferay.portlet.documentlibrary.service.persistence.DLFileShortcutUtil;
50  import com.liferay.portlet.documentlibrary.service.persistence.DLFolderUtil;
51  
52  import java.io.IOException;
53  import java.io.InputStream;
54  
55  import java.util.List;
56  import java.util.Map;
57  import java.util.regex.Pattern;
58  
59  import javax.portlet.PortletPreferences;
60  
61  /**
62   * <a href="DLPortletDataHandlerImpl.java.html"><b><i>View Source</i></b></a>
63   *
64   * @author Bruno Farache
65   * @author Raymond Augé
66   */
67  public class DLPortletDataHandlerImpl implements PortletDataHandler {
68  
69      public static void exportFileEntry(
70              PortletDataContext context, Element foldersEl,
71              Element fileEntriesEl, Element fileRanksEl, DLFileEntry fileEntry)
72          throws PortalException, SystemException {
73  
74          if (!context.isWithinDateRange(fileEntry.getModifiedDate())) {
75              return;
76          }
77  
78          exportParentFolder(context, foldersEl, fileEntry.getFolderId());
79  
80          String path = getFileEntryPath(context, fileEntry);
81  
82          if (context.isPathNotProcessed(path)) {
83              Element fileEntryEl = fileEntriesEl.addElement("file-entry");
84  
85              fileEntryEl.addAttribute("path", path);
86  
87              String binPath = getFileEntryBinPath(context, fileEntry);
88  
89              fileEntryEl.addAttribute("bin-path", binPath);
90  
91              fileEntry.setUserUuid(fileEntry.getUserUuid());
92  
93              if (context.getBooleanParameter(_NAMESPACE, "comments")) {
94                  context.addComments(
95                      DLFileEntry.class, fileEntry.getFileEntryId());
96              }
97  
98              if (context.getBooleanParameter(_NAMESPACE, "ratings")) {
99                  context.addRatingsEntries(
100                     DLFileEntry.class, fileEntry.getFileEntryId());
101             }
102 
103             if (context.getBooleanParameter(_NAMESPACE, "tags")) {
104                 context.addTagsEntries(
105                     DLFileEntry.class, fileEntry.getFileEntryId());
106             }
107 
108             InputStream is = DLLocalServiceUtil.getFileAsStream(
109                 fileEntry.getCompanyId(), fileEntry.getFolderId(),
110                 fileEntry.getName(), fileEntry.getVersion());
111 
112             if (is == null) {
113                 if (_log.isWarnEnabled()) {
114                     _log.warn(
115                         "No file found for file entry " +
116                             fileEntry.getFileEntryId());
117                 }
118 
119                 fileEntryEl.detach();
120 
121                 return;
122             }
123 
124             try {
125                 context.addZipEntry(
126                     getFileEntryBinPath(context, fileEntry), is);
127             }
128             finally {
129                 try {
130                     is.close();
131                 }
132                 catch (IOException ioe) {
133                     _log.error(ioe, ioe);
134                 }
135             }
136 
137             context.addZipEntry(path, fileEntry);
138 
139             if (context.getBooleanParameter(_NAMESPACE, "ranks")) {
140                 List<DLFileRank> fileRanks = DLFileRankUtil.findByF_N(
141                     fileEntry.getFolderId(), fileEntry.getName());
142 
143                 for (DLFileRank fileRank : fileRanks) {
144                     exportFileRank(context, fileRanksEl, fileRank);
145                 }
146             }
147         }
148     }
149 
150     public static void exportFolder(
151             PortletDataContext context, Element foldersEl,
152             Element fileEntriesEl, Element fileShortcutsEl, Element fileRanksEl,
153             DLFolder folder)
154         throws PortalException, SystemException {
155 
156         if (context.isWithinDateRange(folder.getModifiedDate())) {
157             exportParentFolder(context, foldersEl, folder.getParentFolderId());
158 
159             String path = getFolderPath(context, folder);
160 
161             if (context.isPathNotProcessed(path)) {
162                 Element folderEl = foldersEl.addElement("folder");
163 
164                 folderEl.addAttribute("path", path);
165 
166                 folder.setUserUuid(folder.getUserUuid());
167 
168                 context.addZipEntry(path, folder);
169             }
170         }
171 
172         List<DLFileEntry> fileEntries = DLFileEntryUtil.findByFolderId(
173         folder.getFolderId());
174 
175         for (DLFileEntry fileEntry : fileEntries) {
176             exportFileEntry(
177                 context, foldersEl, fileEntriesEl, fileRanksEl, fileEntry);
178         }
179 
180         if (context.getBooleanParameter(_NAMESPACE, "shortcuts")) {
181             List<DLFileShortcut> fileShortcuts =
182                 DLFileShortcutUtil.findByFolderId(folder.getFolderId());
183 
184             for (DLFileShortcut fileShortcut : fileShortcuts) {
185                 exportFileShortcut(
186                     context, foldersEl, fileShortcutsEl, fileShortcut);
187             }
188         }
189     }
190 
191     public static void importFileEntry(
192             PortletDataContext context, Map<Long, Long> folderPKs,
193             Map<String, String> fileEntryNames, DLFileEntry fileEntry,
194             String binPath)
195         throws Exception {
196 
197         long userId = context.getUserId(fileEntry.getUserUuid());
198         long folderId = MapUtil.getLong(
199             folderPKs, fileEntry.getFolderId(), fileEntry.getFolderId());
200 
201         String[] tagsEntries = null;
202 
203         if (context.getBooleanParameter(_NAMESPACE, "tags")) {
204             tagsEntries = context.getTagsEntries(
205                 DLFileEntry.class, fileEntry.getFileEntryId());
206         }
207 
208         boolean addCommunityPermissions = true;
209         boolean addGuestPermissions = true;
210 
211         InputStream is = context.getZipEntryAsInputStream(binPath);
212 
213         if ((folderId != DLFolderConstants.DEFAULT_PARENT_FOLDER_ID) &&
214             (folderId == fileEntry.getFolderId())) {
215 
216             String path = getImportFolderPath(context, folderId);
217 
218             DLFolder folder = (DLFolder)context.getZipEntryAsObject(path);
219 
220             importFolder(context, folderPKs, folder);
221 
222             folderId = MapUtil.getLong(
223                 folderPKs, fileEntry.getFolderId(), fileEntry.getFolderId());
224         }
225 
226         DLFileEntry existingFileEntry = null;
227 
228         try {
229             DLFolderUtil.findByPrimaryKey(folderId);
230 
231             if (context.getDataStrategy().equals(
232                     PortletDataHandlerKeys.DATA_STRATEGY_MIRROR)) {
233 
234                 try {
235                     existingFileEntry = DLFileEntryUtil.findByUUID_G(
236                         fileEntry.getUuid(), context.getGroupId());
237 
238                     if (!isDuplicateFileEntry(fileEntry, existingFileEntry)) {
239                         existingFileEntry =
240                             DLFileEntryLocalServiceUtil.updateFileEntry(
241                                 userId, existingFileEntry.getFolderId(),
242                                 folderId, existingFileEntry.getName(),
243                                 fileEntry.getName(), fileEntry.getTitle(),
244                                 fileEntry.getDescription(), tagsEntries,
245                                 fileEntry.getExtraSettings(), is,
246                                 fileEntry.getSize());
247                     }
248                 }
249                 catch (NoSuchFileEntryException nsfee) {
250                     existingFileEntry =
251                         DLFileEntryLocalServiceUtil.addFileEntry(
252                             fileEntry.getUuid(), userId, folderId,
253                             fileEntry.getName(), fileEntry.getTitle(),
254                             fileEntry.getDescription(), tagsEntries,
255                             fileEntry.getExtraSettings(), is,
256                             fileEntry.getSize(), addCommunityPermissions,
257                             addGuestPermissions);
258                 }
259             }
260             else {
261                 existingFileEntry = DLFileEntryLocalServiceUtil.addFileEntry(
262                     userId, folderId, fileEntry.getName(), fileEntry.getTitle(),
263                     fileEntry.getDescription(), tagsEntries,
264                     fileEntry.getExtraSettings(), is,
265                     fileEntry.getSize(), addCommunityPermissions,
266                     addGuestPermissions);
267             }
268 
269             fileEntryNames.put(
270                 fileEntry.getName(), existingFileEntry.getName());
271 
272             if (context.getBooleanParameter(_NAMESPACE, "comments")) {
273                 context.importComments(
274                     DLFileEntry.class, fileEntry.getFileEntryId(),
275                     existingFileEntry.getFileEntryId(), context.getGroupId());
276             }
277 
278             if (context.getBooleanParameter(_NAMESPACE, "ratings")) {
279                 context.importRatingsEntries(
280                     DLFileEntry.class, fileEntry.getFileEntryId(),
281                     existingFileEntry.getFileEntryId());
282             }
283         }
284         catch (NoSuchFolderException nsfe) {
285             _log.error(
286                 "Could not find the parent folder for entry " +
287                     fileEntry.getFileEntryId());
288         }
289     }
290 
291     public static void importFileRank(
292             PortletDataContext context, Map<Long, Long> folderPKs,
293             Map<String, String> fileEntryNames, DLFileRank rank)
294         throws Exception {
295 
296         long userId = context.getUserId(rank.getUserUuid());
297         long folderId = MapUtil.getLong(
298             folderPKs, rank.getFolderId(), rank.getFolderId());
299 
300         String name = fileEntryNames.get(rank.getName());
301 
302         if (name == null) {
303             name = rank.getName();
304         }
305 
306         if ((folderId != DLFolderConstants.DEFAULT_PARENT_FOLDER_ID) &&
307             (folderId == rank.getFolderId())) {
308 
309             String path = getImportFolderPath(context, folderId);
310 
311             DLFolder folder = (DLFolder)context.getZipEntryAsObject(path);
312 
313             importFolder(context, folderPKs, folder);
314 
315             folderId = MapUtil.getLong(
316                 folderPKs, rank.getFolderId(), rank.getFolderId());
317         }
318 
319         try {
320             DLFolderUtil.findByPrimaryKey(folderId);
321 
322             DLFileRankLocalServiceUtil.updateFileRank(
323                 context.getGroupId(), context.getCompanyId(), userId, folderId,
324                 name);
325         }
326         catch (NoSuchFolderException nsfe) {
327             _log.error(
328                 "Could not find the folder for rank " + rank.getFileRankId());
329         }
330     }
331 
332     public static void importFolder(
333             PortletDataContext context, Map<Long, Long> folderPKs,
334             DLFolder folder)
335         throws Exception {
336 
337         long userId = context.getUserId(folder.getUserUuid());
338         long plid = context.getPlid();
339         long parentFolderId = MapUtil.getLong(
340             folderPKs, folder.getParentFolderId(), folder.getParentFolderId());
341 
342         boolean addCommunityPermissions = true;
343         boolean addGuestPermissions = true;
344 
345         if ((parentFolderId != DLFolderConstants.DEFAULT_PARENT_FOLDER_ID) &&
346             (parentFolderId == folder.getParentFolderId())) {
347 
348             String path = getImportFolderPath(context, parentFolderId);
349 
350             DLFolder parentFolder = (DLFolder)context.getZipEntryAsObject(path);
351 
352             importFolder(context, folderPKs, parentFolder);
353 
354             parentFolderId = MapUtil.getLong(
355                 folderPKs, folder.getParentFolderId(),
356                 folder.getParentFolderId());
357         }
358 
359         DLFolder existingFolder = null;
360 
361         try {
362             if (parentFolderId != DLFolderConstants.DEFAULT_PARENT_FOLDER_ID) {
363                 DLFolderUtil.findByPrimaryKey(parentFolderId);
364             }
365 
366             if (context.getDataStrategy().equals(
367                     PortletDataHandlerKeys.DATA_STRATEGY_MIRROR)) {
368 
369                 existingFolder = DLFolderUtil.fetchByUUID_G(
370                     folder.getUuid(), context.getGroupId());
371 
372                 if (existingFolder == null) {
373                     String name = getFolderName(
374                         context.getCompanyId(), context.getGroupId(),
375                         parentFolderId, folder.getName(), 2);
376 
377                     existingFolder = DLFolderLocalServiceUtil.addFolder(
378                         folder.getUuid(), userId, plid, parentFolderId,
379                         name, folder.getDescription(), addCommunityPermissions,
380                         addGuestPermissions);
381                 }
382                 else {
383                     existingFolder = DLFolderLocalServiceUtil.updateFolder(
384                         existingFolder.getFolderId(), parentFolderId,
385                         folder.getName(), folder.getDescription());
386                 }
387             }
388             else {
389                 String name = getFolderName(
390                     context.getCompanyId(), context.getGroupId(),
391                     parentFolderId, folder.getName(), 2);
392 
393                 existingFolder = DLFolderLocalServiceUtil.addFolder(
394                     userId, plid, parentFolderId, name, folder.getDescription(),
395                     addCommunityPermissions, addGuestPermissions);
396             }
397 
398             folderPKs.put(folder.getFolderId(), existingFolder.getFolderId());
399         }
400         catch (NoSuchFolderException nsfe) {
401             _log.error(
402                 "Could not find the parent folder for folder " +
403                     folder.getFolderId());
404         }
405     }
406 
407     public PortletPreferences deleteData(
408             PortletDataContext context, String portletId,
409             PortletPreferences prefs)
410         throws PortletDataException {
411 
412         try {
413             if (!context.addPrimaryKey(
414                     DLPortletDataHandlerImpl.class, "deleteData")) {
415 
416                 DLFolderLocalServiceUtil.deleteFolders(context.getGroupId());
417             }
418 
419             return null;
420         }
421         catch (Exception e) {
422             throw new PortletDataException(e);
423         }
424     }
425 
426     public String exportData(
427             PortletDataContext context, String portletId,
428             PortletPreferences prefs)
429         throws PortletDataException {
430 
431         try {
432             Document doc = SAXReaderUtil.createDocument();
433 
434             Element root = doc.addElement("documentlibrary-data");
435 
436             root.addAttribute("group-id", String.valueOf(context.getGroupId()));
437 
438             Element foldersEl = root.addElement("folders");
439             Element fileEntriesEl = root.addElement("file-entries");
440             Element fileShortcutsEl = root.addElement("file-shortcuts");
441             Element fileRanksEl = root.addElement("file-ranks");
442 
443             List<DLFolder> folders = DLFolderUtil.findByGroupId(
444                 context.getGroupId());
445 
446             for (DLFolder folder : folders) {
447                 exportFolder(
448                     context, foldersEl, fileEntriesEl, fileShortcutsEl,
449                     fileRanksEl, folder);
450             }
451 
452             return doc.formattedString();
453         }
454         catch (Exception e) {
455             throw new PortletDataException(e);
456         }
457     }
458 
459     public PortletDataHandlerControl[] getExportControls() {
460         return new PortletDataHandlerControl[] {
461             _foldersAndDocuments, _shortcuts, _ranks, _comments, _ratings, _tags
462         };
463     }
464 
465     public PortletDataHandlerControl[] getImportControls() {
466         return new PortletDataHandlerControl[] {
467             _foldersAndDocuments, _shortcuts, _ranks, _comments, _ratings, _tags
468         };
469     }
470 
471     public PortletPreferences importData(
472             PortletDataContext context, String portletId,
473             PortletPreferences prefs, String data)
474         throws PortletDataException {
475 
476         try {
477             Document doc = SAXReaderUtil.read(data);
478 
479             Element root = doc.getRootElement();
480 
481             List<Element> folderEls = root.element("folders").elements(
482                 "folder");
483 
484             Map<Long, Long> folderPKs =
485                 (Map<Long, Long>)context.getNewPrimaryKeysMap(DLFolder.class);
486 
487             for (Element folderEl : folderEls) {
488                 String path = folderEl.attributeValue("path");
489 
490                 if (!context.isPathNotProcessed(path)) {
491                     continue;
492                 }
493 
494                 DLFolder folder = (DLFolder)context.getZipEntryAsObject(path);
495 
496                 importFolder(context, folderPKs, folder);
497             }
498 
499             List<Element> fileEntryEls = root.element("file-entries").elements(
500                 "file-entry");
501 
502             Map<String, String> fileEntryNames =
503                 (Map<String, String>)context.getNewPrimaryKeysMap(
504                     DLFileEntry.class);
505 
506             for (Element fileEntryEl : fileEntryEls) {
507                 String path = fileEntryEl.attributeValue("path");
508 
509                 if (!context.isPathNotProcessed(path)) {
510                     continue;
511                 }
512 
513                 DLFileEntry fileEntry =
514                     (DLFileEntry)context.getZipEntryAsObject(path);
515 
516                 String binPath = fileEntryEl.attributeValue("bin-path");
517 
518                 importFileEntry(
519                     context, folderPKs, fileEntryNames, fileEntry, binPath);
520             }
521 
522             if (context.getBooleanParameter(_NAMESPACE, "shortcuts")) {
523                 List<Element> fileShortcutEls = root.element(
524                     "file-shortcuts").elements("file-shortcut");
525 
526                 for (Element fileShortcutEl : fileShortcutEls) {
527                     String path = fileShortcutEl.attributeValue("path");
528 
529                     if (!context.isPathNotProcessed(path)) {
530                         continue;
531                     }
532 
533                     DLFileShortcut fileShortcut =
534                         (DLFileShortcut)context.getZipEntryAsObject(path);
535 
536                     importFileShortcut(
537                         context, folderPKs, fileEntryNames, fileShortcut);
538                 }
539             }
540 
541             if (context.getBooleanParameter(_NAMESPACE, "ranks")) {
542                 List<Element> fileRankEls = root.element("file-ranks").elements(
543                     "file-rank");
544 
545                 for (Element fileRankEl : fileRankEls) {
546                     String path = fileRankEl.attributeValue("path");
547 
548                     if (!context.isPathNotProcessed(path)) {
549                         continue;
550                     }
551 
552                     DLFileRank fileRank =
553                         (DLFileRank)context.getZipEntryAsObject(path);
554 
555                     importFileRank(
556                         context, folderPKs, fileEntryNames, fileRank);
557                 }
558             }
559 
560             return null;
561         }
562         catch (Exception e) {
563             throw new PortletDataException(e);
564         }
565     }
566 
567     public boolean isPublishToLiveByDefault() {
568         return false;
569     }
570 
571     protected static void exportFileRank(
572             PortletDataContext context, Element fileRanksEl,
573             DLFileRank fileRank)
574         throws SystemException {
575 
576         String path = getFileRankPath(context, fileRank);
577 
578         if (!context.isPathNotProcessed(path)) {
579             return;
580         }
581 
582         Element fileRankEl = fileRanksEl.addElement("file-rank");
583 
584         fileRankEl.addAttribute("path", path);
585 
586         fileRank.setUserUuid(fileRank.getUserUuid());
587 
588         context.addZipEntry(path, fileRank);
589     }
590 
591     protected static void exportFileShortcut(
592             PortletDataContext context, Element foldersEl,
593             Element fileShortcutsEl, DLFileShortcut fileShortcut)
594         throws PortalException, SystemException {
595 
596         exportParentFolder(context, foldersEl, fileShortcut.getFolderId());
597 
598         String path = getFileShortcutPath(context, fileShortcut);
599 
600         if (context.isPathNotProcessed(path)) {
601             Element fileShortcutEl = fileShortcutsEl.addElement(
602                 "file-shortcut");
603 
604             fileShortcutEl.addAttribute("path", path);
605 
606             fileShortcut.setUserUuid(fileShortcut.getUserUuid());
607 
608             context.addZipEntry(path, fileShortcut);
609         }
610     }
611 
612     protected static void exportParentFolder(
613             PortletDataContext context, Element foldersEl, long folderId)
614         throws PortalException, SystemException {
615 
616         if (folderId == DLFolderConstants.DEFAULT_PARENT_FOLDER_ID) {
617             return;
618         }
619 
620         DLFolder folder = DLFolderUtil.findByPrimaryKey(folderId);
621 
622         exportParentFolder(context, foldersEl, folder.getParentFolderId());
623 
624         String path = getFolderPath(context, folder);
625 
626         if (context.isPathNotProcessed(path)) {
627             Element folderEl = foldersEl.addElement("folder");
628 
629             folderEl.addAttribute("path", path);
630 
631             folder.setUserUuid(folder.getUserUuid());
632 
633             context.addZipEntry(path, folder);
634         }
635     }
636 
637     protected static String getFileEntryBinPath(
638         PortletDataContext context, DLFileEntry fileEntry) {
639 
640         StringBundler sb = new StringBundler(7);
641 
642         sb.append(context.getPortletPath(PortletKeys.DOCUMENT_LIBRARY));
643         sb.append("/bin/");
644         sb.append(fileEntry.getFileEntryId());
645         sb.append(StringPool.SLASH);
646         sb.append(fileEntry.getVersion());
647         sb.append(StringPool.SLASH);
648         sb.append(fileEntry.getTitleWithExtension());
649 
650         return sb.toString();
651     }
652 
653     protected static String getFileEntryPath(
654         PortletDataContext context, DLFileEntry fileEntry) {
655 
656         StringBundler sb = new StringBundler(6);
657 
658         sb.append(context.getPortletPath(PortletKeys.DOCUMENT_LIBRARY));
659         sb.append("/file-entries/");
660         sb.append(fileEntry.getFileEntryId());
661         sb.append(StringPool.SLASH);
662         sb.append(fileEntry.getVersion());
663         sb.append(".xml");
664 
665         return sb.toString();
666     }
667 
668     protected static String getFolderName(
669             long companyId, long groupId, long parentFolderId, String name,
670             int count)
671         throws SystemException {
672 
673         DLFolder folder = DLFolderUtil.fetchByG_P_N(
674             groupId, parentFolderId, name);
675 
676         if (folder == null) {
677             return name;
678         }
679 
680         if (Pattern.matches(".* \\(\\d+\\)", name)) {
681             int pos = name.lastIndexOf(" (");
682 
683             name = name.substring(0, pos);
684         }
685 
686         StringBundler sb = new StringBundler(5);
687 
688         sb.append(name);
689         sb.append(StringPool.SPACE);
690         sb.append(StringPool.OPEN_PARENTHESIS);
691         sb.append(count);
692         sb.append(StringPool.CLOSE_PARENTHESIS);
693 
694         name = sb.toString();
695 
696         return getFolderName(companyId, groupId, parentFolderId, name, ++count);
697     }
698 
699     protected static String getFolderPath(
700         PortletDataContext context, DLFolder folder) {
701 
702         StringBundler sb = new StringBundler(4);
703 
704         sb.append(context.getPortletPath(PortletKeys.DOCUMENT_LIBRARY));
705         sb.append("/folders/");
706         sb.append(folder.getFolderId());
707         sb.append(".xml");
708 
709         return sb.toString();
710     }
711 
712     protected static String getFileRankPath(
713         PortletDataContext context, DLFileRank fileRank) {
714 
715         StringBundler sb = new StringBundler(4);
716 
717         sb.append(context.getPortletPath(PortletKeys.DOCUMENT_LIBRARY));
718         sb.append("/ranks/");
719         sb.append(fileRank.getFileRankId());
720         sb.append(".xml");
721 
722         return sb.toString();
723     }
724 
725     protected static String getFileShortcutPath(
726         PortletDataContext context, DLFileShortcut fileShortcut) {
727 
728         StringBundler sb = new StringBundler(4);
729 
730         sb.append(context.getPortletPath(PortletKeys.DOCUMENT_LIBRARY));
731         sb.append("/shortcuts/");
732         sb.append(fileShortcut.getFileShortcutId());
733         sb.append(".xml");
734 
735         return sb.toString();
736     }
737 
738     protected static String getImportFolderPath(
739         PortletDataContext context, long folderId) {
740 
741         StringBundler sb = new StringBundler(4);
742 
743         sb.append(context.getImportPortletPath(PortletKeys.DOCUMENT_LIBRARY));
744         sb.append("/folders/");
745         sb.append(folderId);
746         sb.append(".xml");
747 
748         return sb.toString();
749     }
750 
751     protected static void importFileShortcut(
752             PortletDataContext context, Map<Long, Long> folderPKs,
753             Map<String, String> fileEntryNames, DLFileShortcut fileShortcut)
754         throws Exception {
755 
756         long userId = context.getUserId(fileShortcut.getUserUuid());
757         long folderId = MapUtil.getLong(
758             folderPKs, fileShortcut.getFolderId(), fileShortcut.getFolderId());
759         long toFolderId = MapUtil.getLong(
760             folderPKs, fileShortcut.getToFolderId(),
761             fileShortcut.getToFolderId());
762         String toName = MapUtil.getString(
763             fileEntryNames, fileShortcut.getToName(), fileShortcut.getToName());
764 
765         boolean addCommunityPermissions = true;
766         boolean addGuestPermissions = true;
767 
768         try {
769             DLFolderUtil.findByPrimaryKey(folderId);
770             DLFolderUtil.findByPrimaryKey(toFolderId);
771 
772             if (context.getDataStrategy().equals(
773                     PortletDataHandlerKeys.DATA_STRATEGY_MIRROR)) {
774 
775                 try {
776                     DLFileShortcut existingFileShortcut =
777                         DLFileShortcutUtil.findByUUID_G(
778                             fileShortcut.getUuid(), context.getGroupId());
779 
780                     DLFileShortcutLocalServiceUtil.updateFileShortcut(
781                         userId, existingFileShortcut.getFileShortcutId(),
782                         folderId, toFolderId, toName);
783                 }
784                 catch (NoSuchFileShortcutException nsfse) {
785                     DLFileShortcutLocalServiceUtil.addFileShortcut(
786                         fileShortcut.getUuid(), userId, folderId, toFolderId,
787                         toName, addCommunityPermissions, addGuestPermissions);
788                 }
789             }
790             else {
791                 DLFileShortcutLocalServiceUtil.addFileShortcut(
792                     userId, folderId, toFolderId, toName,
793                     addCommunityPermissions, addGuestPermissions);
794             }
795         }
796         catch (NoSuchFolderException nsfe) {
797             _log.error(
798                 "Could not find the folder for shortcut " +
799                     fileShortcut.getFileShortcutId());
800         }
801     }
802 
803     protected static boolean isDuplicateFileEntry(
804         DLFileEntry fileEntry1, DLFileEntry fileEntry2) {
805 
806         try {
807             DLFolder folder1 = fileEntry1.getFolder();
808             DLFolder folder2 = fileEntry2.getFolder();
809 
810             if ((folder1.getUuid().equals(folder2.getUuid())) &&
811                 (fileEntry1.getSize() == fileEntry2.getSize()) &&
812                 (fileEntry1.getVersion() == fileEntry2.getVersion()) &&
813                 (fileEntry1.getVersionUserUuid().equals(
814                     fileEntry2.getVersionUserUuid()))) {
815 
816                 return true;
817             }
818             else {
819                 return false;
820             }
821         }
822         catch (SystemException se) {
823             return false;
824         }
825     }
826 
827     private static final String _NAMESPACE = "document_library";
828 
829     private static final PortletDataHandlerBoolean _foldersAndDocuments =
830         new PortletDataHandlerBoolean(
831             _NAMESPACE, "folders-and-documents", true, true);
832 
833     private static final PortletDataHandlerBoolean _ranks =
834         new PortletDataHandlerBoolean(_NAMESPACE, "ranks");
835 
836     private static final PortletDataHandlerBoolean _shortcuts=
837         new PortletDataHandlerBoolean(_NAMESPACE, "shortcuts");
838 
839     private static final PortletDataHandlerBoolean _comments =
840         new PortletDataHandlerBoolean(_NAMESPACE, "comments");
841 
842     private static final PortletDataHandlerBoolean _ratings =
843         new PortletDataHandlerBoolean(_NAMESPACE, "ratings");
844 
845     private static final PortletDataHandlerBoolean _tags =
846         new PortletDataHandlerBoolean(_NAMESPACE, "tags");
847 
848     private static Log _log = LogFactoryUtil.getLog(
849         DLPortletDataHandlerImpl.class);
850 
851 }