@Indexable(type = IndexableType.REINDEX)
  public DLFolder moveFolder(
      long userId, long folderId, long parentFolderId, ServiceContext serviceContext)
      throws PortalException, SystemException {

    boolean hasLock = hasFolderLock(userId, folderId);

    Lock lock = null;

    if (!hasLock) {

      // Lock

      lock = lockFolder(userId, folderId);
    }

    try {
      DLFolder dlFolder = dlFolderPersistence.findByPrimaryKey(folderId);

      parentFolderId = getParentFolderId(dlFolder, parentFolderId);

      validateFolder(
          dlFolder.getFolderId(), dlFolder.getGroupId(), parentFolderId, dlFolder.getName());

      dlFolder.setModifiedDate(serviceContext.getModifiedDate(null));
      dlFolder.setParentFolderId(parentFolderId);
      dlFolder.setExpandoBridgeAttributes(serviceContext);

      dlFolderPersistence.update(dlFolder);

      dlAppHelperLocalService.moveFolder(new LiferayFolder(dlFolder));

      return dlFolder;
    } finally {
      if (!hasLock) {

        // Unlock

        unlockFolder(folderId, lock.getUuid());
      }
    }
  }
  public DLFolder updateFolderAndFileEntryTypes(
      long userId,
      long folderId,
      long parentFolderId,
      String name,
      String description,
      long defaultFileEntryTypeId,
      List<Long> fileEntryTypeIds,
      boolean overrideFileEntryTypes,
      ServiceContext serviceContext)
      throws PortalException, SystemException {

    boolean hasLock = hasFolderLock(userId, folderId);

    Lock lock = null;

    if (!hasLock) {

      // Lock

      lock = lockFolder(userId, folderId, null, false, DLFolderImpl.LOCK_EXPIRATION_TIME);
    }

    try {

      // Folder

      if (!overrideFileEntryTypes) {
        fileEntryTypeIds = Collections.emptyList();
      }

      DLFolder dlFolder = dlFolderPersistence.findByPrimaryKey(folderId);

      parentFolderId = getParentFolderId(dlFolder, parentFolderId);

      validateFolder(folderId, dlFolder.getGroupId(), parentFolderId, name);

      dlFolder.setModifiedDate(serviceContext.getModifiedDate(null));
      dlFolder.setParentFolderId(parentFolderId);
      dlFolder.setName(name);
      dlFolder.setDescription(description);
      dlFolder.setExpandoBridgeAttributes(serviceContext);
      dlFolder.setOverrideFileEntryTypes(overrideFileEntryTypes);
      dlFolder.setDefaultFileEntryTypeId(defaultFileEntryTypeId);

      dlFolderPersistence.update(dlFolder);

      // File entry types

      if (fileEntryTypeIds != null) {
        dlFileEntryTypeLocalService.updateFolderFileEntryTypes(
            dlFolder, fileEntryTypeIds, defaultFileEntryTypeId, serviceContext);
      }

      // App helper

      dlAppHelperLocalService.updateFolder(userId, new LiferayFolder(dlFolder), serviceContext);

      return dlFolder;
    } finally {
      if (!hasLock) {

        // Unlock

        unlockFolder(folderId, lock.getUuid());
      }
    }
  }
  public DLFolder addFolder(
      long userId,
      long groupId,
      long repositoryId,
      boolean mountPoint,
      long parentFolderId,
      String name,
      String description,
      boolean hidden,
      ServiceContext serviceContext)
      throws PortalException, SystemException {

    // Folder

    User user = userPersistence.findByPrimaryKey(userId);
    parentFolderId = getParentFolderId(groupId, parentFolderId);
    Date now = new Date();

    validateFolder(groupId, parentFolderId, name);

    long folderId = counterLocalService.increment();

    DLFolder dlFolder = dlFolderPersistence.create(folderId);

    dlFolder.setUuid(serviceContext.getUuid());
    dlFolder.setGroupId(groupId);
    dlFolder.setCompanyId(user.getCompanyId());
    dlFolder.setUserId(user.getUserId());
    dlFolder.setCreateDate(serviceContext.getCreateDate(now));
    dlFolder.setModifiedDate(serviceContext.getModifiedDate(now));
    dlFolder.setRepositoryId(repositoryId);
    dlFolder.setMountPoint(mountPoint);
    dlFolder.setParentFolderId(parentFolderId);
    dlFolder.setName(name);
    dlFolder.setDescription(description);
    dlFolder.setHidden(hidden);
    dlFolder.setOverrideFileEntryTypes(false);
    dlFolder.setExpandoBridgeAttributes(serviceContext);

    dlFolderPersistence.update(dlFolder);

    // Resources

    if (serviceContext.isAddGroupPermissions() || serviceContext.isAddGuestPermissions()) {

      addFolderResources(
          dlFolder, serviceContext.isAddGroupPermissions(), serviceContext.isAddGuestPermissions());
    } else {
      if (serviceContext.isDeriveDefaultPermissions()) {
        serviceContext.deriveDefaultPermissions(repositoryId, DLFolderConstants.getClassName());
      }

      addFolderResources(
          dlFolder, serviceContext.getGroupPermissions(), serviceContext.getGuestPermissions());
    }

    // Parent folder

    if (parentFolderId != DLFolderConstants.DEFAULT_PARENT_FOLDER_ID) {
      DLFolder parentDLFolder = dlFolderPersistence.findByPrimaryKey(parentFolderId);

      parentDLFolder.setLastPostDate(now);

      dlFolderPersistence.update(parentDLFolder);
    }

    // App helper

    dlAppHelperLocalService.addFolder(userId, new LiferayFolder(dlFolder), serviceContext);

    return dlFolder;
  }