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