@Override
  protected String doExportData(
      PortletDataContext portletDataContext,
      String portletId,
      PortletPreferences portletPreferences)
      throws Exception {

    portletDataContext.addPermissions(
        "com.liferay.portlet.documentlibrary", portletDataContext.getScopeGroupId());

    long rootFolderId = GetterUtil.getLong(portletPreferences.getValue("rootFolderId", null));

    Document document = SAXReaderUtil.createDocument();

    Element rootElement = document.addElement("documentlibrary-display-data");

    Element fileEntryTypesElement = rootElement.addElement("file-entry-types");
    Element foldersElement = rootElement.addElement("folders");
    Element fileEntriesElement = rootElement.addElement("file-entries");
    Element fileShortcutsElement = rootElement.addElement("file-shortcuts");
    Element fileRanksElement = rootElement.addElement("file-ranks");

    if (rootFolderId == DLFolderConstants.DEFAULT_PARENT_FOLDER_ID) {
      List<Folder> folders = FolderUtil.findByRepositoryId(portletDataContext.getScopeGroupId());

      for (Folder folder : folders) {
        DLPortletDataHandlerImpl.exportFolder(
            portletDataContext,
            fileEntryTypesElement,
            foldersElement,
            fileEntriesElement,
            fileShortcutsElement,
            fileRanksElement,
            folder,
            false);
      }
    } else {
      Folder folder = FolderUtil.findByPrimaryKey(rootFolderId);

      rootElement.addAttribute("root-folder-id", String.valueOf(folder.getFolderId()));

      DLPortletDataHandlerImpl.exportFolder(
          portletDataContext,
          fileEntryTypesElement,
          foldersElement,
          fileEntriesElement,
          fileShortcutsElement,
          fileRanksElement,
          folder,
          true);
    }

    return document.formattedString();
  }
  @Override
  protected PortletPreferences doImportData(
      PortletDataContext portletDataContext,
      String portletId,
      PortletPreferences portletPreferences,
      String data)
      throws Exception {

    portletDataContext.importPermissions(
        "com.liferay.portlet.documentlibrary",
        portletDataContext.getSourceGroupId(),
        portletDataContext.getScopeGroupId());

    Document document = SAXReaderUtil.read(data);

    Element rootElement = document.getRootElement();

    Element fileEntryTypesElement = rootElement.element("file-entry-types");

    List<Element> fileEntryTypeElements = fileEntryTypesElement.elements("file-entry-type");

    for (Element fileEntryTypeElement : fileEntryTypeElements) {
      DLPortletDataHandlerImpl.importFileEntryType(portletDataContext, fileEntryTypeElement);
    }

    Element foldersElement = rootElement.element("folders");

    List<Element> folderElements = foldersElement.elements("folder");

    for (Element folderElement : folderElements) {
      DLPortletDataHandlerImpl.importFolder(portletDataContext, folderElement);
    }

    Element fileEntriesElement = rootElement.element("file-entries");

    List<Element> fileEntryElements = fileEntriesElement.elements("file-entry");

    for (Element fileEntryElement : fileEntryElements) {
      DLPortletDataHandlerImpl.importFileEntry(portletDataContext, fileEntryElement);
    }

    if (portletDataContext.getBooleanParameter(_NAMESPACE, "shortcuts")) {
      List<Element> fileShortcutElements =
          rootElement.element("file-shortcuts").elements("file-shortcut");

      for (Element fileShortcutElement : fileShortcutElements) {
        DLPortletDataHandlerImpl.importFileShortcut(portletDataContext, fileShortcutElement);
      }
    }

    if (portletDataContext.getBooleanParameter(_NAMESPACE, "ranks")) {
      Element fileRanksElement = rootElement.element("file-ranks");

      List<Element> fileRankElements = fileRanksElement.elements("file-rank");

      for (Element fileRankElement : fileRankElements) {
        DLPortletDataHandlerImpl.importFileRank(portletDataContext, fileRankElement);
      }
    }

    long rootFolderId = GetterUtil.getLong(rootElement.attributeValue("root-folder-id"));

    if (rootFolderId > 0) {
      Map<Long, Long> folderPKs =
          (Map<Long, Long>) portletDataContext.getNewPrimaryKeysMap(Folder.class);

      rootFolderId = MapUtil.getLong(folderPKs, rootFolderId, rootFolderId);

      portletPreferences.setValue("rootFolderId", String.valueOf(rootFolderId));
    }

    return portletPreferences;
  }