@Override
  protected BaseModel<?> addBaseModel(
      BaseModel<?> parentBaseModel, boolean approved, ServiceContext serviceContext)
      throws Exception {

    DLFolder dlFolder = (DLFolder) parentBaseModel;

    String content = "Content: Enterprise. Open Source. For Life.";

    serviceContext = (ServiceContext) serviceContext.clone();

    serviceContext.setWorkflowAction(WorkflowConstants.ACTION_PUBLISH);

    FileEntry fileEntry =
        DLAppServiceUtil.addFileEntry(
            dlFolder.getGroupId(),
            DLFolderConstants.DEFAULT_PARENT_FOLDER_ID,
            "Text.txt",
            ContentTypes.TEXT_PLAIN,
            getSearchKeywords(),
            StringPool.BLANK,
            StringPool.BLANK,
            content.getBytes(),
            serviceContext);

    return DLAppServiceUtil.addFileShortcut(
        dlFolder.getGroupId(), dlFolder.getFolderId(), fileEntry.getFileEntryId(), serviceContext);
  }
  @Override
  public void cascadeFileEntryTypes(long userId, DLFolder dlFolder) throws PortalException {

    long[] groupIds = PortalUtil.getCurrentAndAncestorSiteGroupIds(dlFolder.getGroupId());

    List<DLFileEntryType> dlFileEntryTypes =
        getFolderFileEntryTypes(groupIds, dlFolder.getFolderId(), true);

    List<Long> fileEntryTypeIds = getFileEntryTypeIds(dlFileEntryTypes);

    long defaultFileEntryTypeId = getDefaultFileEntryTypeId(dlFolder.getFolderId());

    ServiceContext serviceContext = new ServiceContext();

    serviceContext.setCompanyId(dlFolder.getCompanyId());
    serviceContext.setScopeGroupId(dlFolder.getGroupId());
    serviceContext.setUserId(userId);

    cascadeFileEntryTypes(
        userId,
        dlFolder.getGroupId(),
        dlFolder.getFolderId(),
        defaultFileEntryTypeId,
        fileEntryTypeIds,
        serviceContext);
  }
  protected long getParentFolderId(DLFolder dlFolder, long parentFolderId) throws SystemException {

    if (parentFolderId == DLFolderConstants.DEFAULT_PARENT_FOLDER_ID) {
      return parentFolderId;
    }

    if (dlFolder.getFolderId() == parentFolderId) {
      return dlFolder.getParentFolderId();
    } else {
      DLFolder parentDLFolder = dlFolderPersistence.fetchByPrimaryKey(parentFolderId);

      if ((parentDLFolder == null) || (dlFolder.getGroupId() != parentDLFolder.getGroupId())) {

        return dlFolder.getParentFolderId();
      }

      List<Long> subfolderIds = new ArrayList<Long>();

      getSubfolderIds(subfolderIds, dlFolder.getGroupId(), dlFolder.getFolderId());

      if (subfolderIds.contains(parentFolderId)) {
        return dlFolder.getParentFolderId();
      }

      return parentFolderId;
    }
  }
  public void updateFolderFileEntryTypes(
      DLFolder dlFolder,
      List<Long> fileEntryTypeIds,
      long defaultFileEntryTypeId,
      ServiceContext serviceContext)
      throws PortalException, SystemException {

    List<Long> originalFileEntryTypeIds =
        getFileEntryTypeIds(dlFolderPersistence.getDLFileEntryTypes(dlFolder.getFolderId()));

    if (fileEntryTypeIds.equals(originalFileEntryTypeIds)) {
      return;
    }

    for (Long fileEntryTypeId : fileEntryTypeIds) {
      if (!originalFileEntryTypeIds.contains(fileEntryTypeId)) {
        dlFolderPersistence.addDLFileEntryType(dlFolder.getFolderId(), fileEntryTypeId);
      }
    }

    for (Long originalFileEntryTypeId : originalFileEntryTypeIds) {
      if (!fileEntryTypeIds.contains(originalFileEntryTypeId)) {
        dlFolderPersistence.removeDLFileEntryType(dlFolder.getFolderId(), originalFileEntryTypeId);

        workflowDefinitionLinkLocalService.deleteWorkflowDefinitionLink(
            dlFolder.getCompanyId(),
            dlFolder.getGroupId(),
            DLFolder.class.getName(),
            dlFolder.getFolderId(),
            originalFileEntryTypeId);
      }
    }
  }
    public void processAction(ActionEvent actionEvent) throws AbortProcessingException {

      try {
        FolderUserObject folderUserObject = docLibModelBean.getSelectedFolderUserObject();
        DLFolder dlFolder = folderUserObject.getDlFolder();
        long groupId = dlFolder.getGroupId();
        long repositoryId = dlFolder.getRepositoryId();
        boolean mountPoint = dlFolder.getMountPoint();
        long parentFolderId = dlFolder.getFolderId();
        ServiceContext serviceContext = new ServiceContext();

        // Temporary: Make the default setting be that community members can view the file. Need to
        // develop a
        // "Viewable By" permissions Facelet composite component UI similar to
        // portal-web/docroot/html/taglib/ui/input_permissions/page.jsp
        serviceContext.setAddGroupPermissions(true);
        DLFolderServiceUtil.addFolder(
            groupId,
            repositoryId,
            mountPoint,
            parentFolderId,
            folderName,
            folderDescription,
            serviceContext);
        docLibModelBean.forceTreeRequery();
        logger.debug("Added folderName=[{0}] description=[{1}]", folderName, folderDescription);
      } catch (Exception e) {
        logger.error(e.getMessage(), e);
        liferayFacesContext.addGlobalUnexpectedErrorMessage();
      }

      docLibViewBean.setPopupRendered(false);
    }
  @Override
  protected int getBaseModelsNotInTrashCount(BaseModel<?> parentBaseModel) throws Exception {

    DLFolder dlFolder = (DLFolder) parentBaseModel;

    return DLFileShortcutLocalServiceUtil.getFileShortcutsCount(
        dlFolder.getGroupId(), dlFolder.getFolderId(), true, WorkflowConstants.STATUS_APPROVED);
  }
  public void getSubfolderIds(List<Long> folderIds, long groupId, long folderId)
      throws SystemException {

    List<DLFolder> dlFolders = dlFolderPersistence.findByG_P(groupId, folderId);

    for (DLFolder dlFolder : dlFolders) {
      folderIds.add(dlFolder.getFolderId());

      getSubfolderIds(folderIds, dlFolder.getGroupId(), dlFolder.getFolderId());
    }
  }
  protected void addFolderResources(
      DLFolder dlFolder, String[] groupPermissions, String[] guestPermissions)
      throws PortalException, SystemException {

    resourceLocalService.addModelResources(
        dlFolder.getCompanyId(),
        dlFolder.getGroupId(),
        dlFolder.getUserId(),
        DLFolder.class.getName(),
        dlFolder.getFolderId(),
        groupPermissions,
        guestPermissions);
  }
  @Override
  public void deleteRow(Object primaryKey) throws IOException {
    long fileEntryId = (Long) primaryKey;

    try {
      DLFileEntry dlFileEntry = DLFileEntryLocalServiceUtil.getFileEntry(fileEntryId);
      DLFileEntryServiceUtil.deleteFileEntry(
          dlFolder.getGroupId(), dlFolder.getFolderId(), dlFileEntry.getName());
    } catch (Exception e) {
      logger.error(e.getMessage(), e);
      throw new IOException(e.getMessage());
    }
  }
  protected long getParentFolderId(long groupId, long parentFolderId) throws SystemException {

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

      if ((parentDLFolder == null) || (groupId != parentDLFolder.getGroupId())) {

        parentFolderId = DLFolderConstants.DEFAULT_PARENT_FOLDER_ID;
      }
    }

    return parentFolderId;
  }
  @Override
  public DLFileEntry updateFileEntryFileEntryType(
      DLFileEntry dlFileEntry, ServiceContext serviceContext) throws PortalException {

    long groupId = serviceContext.getScopeGroupId();
    long folderId = DLFolderConstants.DEFAULT_PARENT_FOLDER_ID;

    DLFolder dlFolder = dlFolderPersistence.fetchByPrimaryKey(dlFileEntry.getFolderId());

    if (dlFolder != null) {
      groupId = dlFolder.getGroupId();
      folderId = dlFolder.getFolderId();
    }

    List<DLFileEntryType> dlFileEntryTypes =
        getFolderFileEntryTypes(
            PortalUtil.getCurrentAndAncestorSiteGroupIds(groupId), folderId, true);

    List<Long> fileEntryTypeIds = getFileEntryTypeIds(dlFileEntryTypes);

    if (fileEntryTypeIds.contains(dlFileEntry.getFileEntryTypeId())) {
      return dlFileEntry;
    }

    long defaultFileEntryTypeId = getDefaultFileEntryTypeId(folderId);

    DLFileVersion dlFileVersion =
        dlFileVersionLocalService.getLatestFileVersion(dlFileEntry.getFileEntryId(), true);

    if (dlFileVersion.isPending()) {
      workflowInstanceLinkLocalService.deleteWorkflowInstanceLink(
          dlFileVersion.getCompanyId(), dlFileEntry.getGroupId(),
          DLFileEntry.class.getName(), dlFileVersion.getFileVersionId());
    }

    return dlFileEntryLocalService.updateFileEntry(
        serviceContext.getUserId(),
        dlFileEntry.getFileEntryId(),
        null,
        null,
        null,
        null,
        null,
        false,
        defaultFileEntryTypeId,
        null,
        null,
        null,
        0,
        serviceContext);
  }
  public void cascadeFileEntryTypes(long userId, DLFolder dlFolder)
      throws PortalException, SystemException {

    List<DLFileEntryType> dlFileEntryTypes =
        getFolderFileEntryTypes(new long[] {dlFolder.getGroupId()}, dlFolder.getFolderId(), true);

    List<Long> fileEntryTypeIds = getFileEntryTypeIds(dlFileEntryTypes);

    long defaultFileEntryTypeId = getDefaultFileEntryTypeId(dlFolder.getFolderId());

    ServiceContext serviceContext = new ServiceContext();

    serviceContext.setCompanyId(dlFolder.getCompanyId());
    serviceContext.setScopeGroupId(dlFolder.getGroupId());
    serviceContext.setUserId(userId);

    cascadeFileEntryTypes(
        dlFolder.getGroupId(),
        dlFolder.getFolderId(),
        defaultFileEntryTypeId,
        fileEntryTypeIds,
        serviceContext);
  }
  protected void addFolderResources(
      DLFolder dlFolder, boolean addGroupPermissions, boolean addGuestPermissions)
      throws PortalException, SystemException {

    resourceLocalService.addResources(
        dlFolder.getCompanyId(),
        dlFolder.getGroupId(),
        dlFolder.getUserId(),
        DLFolder.class.getName(),
        dlFolder.getFolderId(),
        false,
        addGroupPermissions,
        addGuestPermissions);
  }
  public void addFileShortcutResources(
      DLFolder folder,
      DLFileShortcut fileShortcut,
      String[] communityPermissions,
      String[] guestPermissions)
      throws PortalException, SystemException {

    resourceLocalService.addModelResources(
        fileShortcut.getCompanyId(),
        folder.getGroupId(),
        fileShortcut.getUserId(),
        DLFileShortcut.class.getName(),
        fileShortcut.getFileShortcutId(),
        communityPermissions,
        guestPermissions);
  }
  public void addFileShortcutResources(
      DLFolder folder,
      DLFileShortcut fileShortcut,
      boolean addCommunityPermissions,
      boolean addGuestPermissions)
      throws PortalException, SystemException {

    resourceLocalService.addResources(
        fileShortcut.getCompanyId(),
        folder.getGroupId(),
        fileShortcut.getUserId(),
        DLFileShortcut.class.getName(),
        fileShortcut.getFileShortcutId(),
        false,
        addCommunityPermissions,
        addGuestPermissions);
  }
  protected void reindexFolders(long companyId, int folderStart, int folderEnd) throws Exception {

    List<DLFolder> dlFolders =
        DLFolderLocalServiceUtil.getCompanyFolders(companyId, folderStart, folderEnd);

    for (DLFolder dlFolder : dlFolders) {
      String portletId = PortletKeys.DOCUMENT_LIBRARY;
      long groupId = dlFolder.getGroupId();
      long folderId = dlFolder.getFolderId();

      String[] newIds = {
        String.valueOf(companyId), portletId, String.valueOf(groupId), String.valueOf(folderId)
      };

      Indexer indexer = IndexerRegistryUtil.getIndexer(FileModel.class);

      indexer.reindex(newIds);
    }
  }
  public boolean isPermittedToAddFolder() {

    if (permittedToAddFolder == null) {

      try {
        PermissionChecker permissionChecker = liferayFacesContext.getPermissionChecker();
        DLFolder selectedDLFolder = docLibModelBean.getSelectedFolderUserObject().getDlFolder();
        long scopeGroupId = selectedDLFolder.getGroupId();
        long folderId = selectedDLFolder.getFolderId();
        permittedToAddFolder =
            DLFolderPermission.contains(
                permissionChecker, scopeGroupId, folderId, ActionKeys.ADD_FOLDER);
      } catch (Exception e) {
        logger.error(e.getMessage(), e);
      }
    }

    return permittedToAddFolder;
  }
  @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());
      }
    }
  }
  protected List<DocLibFileEntry> findViewableDocuments() {
    List<DocLibFileEntry> viewableDocuments = new ArrayList<DocLibFileEntry>();

    try {
      long folderGroupId = dlFolder.getGroupId();
      long folderId = dlFolder.getFolderId();

      List<DLFileEntry> dlFileEntries = null;

      if (DLFolderPermission.contains(
          permissionChecker, folderGroupId, folderId, ActionKeys.VIEW)) {
        OrderByComparator orderByComparator =
            DocumentComparatorFactory.getComparator(getSortColumn(), isSortAscending());

        dlFileEntries =
            DLFileEntryServiceUtil.getFileEntries(
                folderGroupId, folderId, QueryUtil.ALL_POS, QueryUtil.ALL_POS, orderByComparator);
      }

      if (dlFileEntries != null) {

        for (DLFileEntry dlFileEntry : dlFileEntries) {
          boolean permittedToViewDocument = false;

          try {
            permittedToViewDocument =
                DLFileEntryPermission.contains(permissionChecker, dlFileEntry, ActionKeys.VIEW);
          } catch (Exception e) {
            logger.error(e.getMessage(), e);
          }

          viewableDocuments.add(
              new DocLibFileEntry(
                  dlFileEntry, portalURL, pathContext, folderGroupId, permittedToViewDocument));
        }
      }
    } catch (Exception e) {
      logger.error(e.getMessage(), e);
    }

    return viewableDocuments;
  }
  public DLFolder updateDLFolder(DLFolder model) throws SystemException {
    DLFolder dlFolder = new DLFolderImpl();

    dlFolder.setNew(false);

    dlFolder.setUuid(model.getUuid());
    dlFolder.setFolderId(model.getFolderId());
    dlFolder.setGroupId(model.getGroupId());
    dlFolder.setCompanyId(model.getCompanyId());
    dlFolder.setUserId(model.getUserId());
    dlFolder.setUserName(model.getUserName());
    dlFolder.setCreateDate(model.getCreateDate());
    dlFolder.setModifiedDate(model.getModifiedDate());
    dlFolder.setParentFolderId(model.getParentFolderId());
    dlFolder.setName(model.getName());
    dlFolder.setDescription(model.getDescription());
    dlFolder.setLastPostDate(model.getLastPostDate());

    return dlFolderPersistence.update(dlFolder);
  }
  public void updateStatuses(User user, List<Object> dlFileEntriesAndDLFolders, int status)
      throws PortalException, SystemException {

    for (Object object : dlFileEntriesAndDLFolders) {
      if (object instanceof DLFileEntry) {
        DLFileEntry dlFileEntry = (DLFileEntry) object;

        List<DLFileVersion> dlFileVersions =
            dlFileVersionLocalService.getFileVersions(
                dlFileEntry.getFileEntryId(), WorkflowConstants.STATUS_ANY);

        dlFileVersions = ListUtil.copy(dlFileVersions);

        Collections.sort(dlFileVersions, new FileVersionVersionComparator());

        DLFileVersion latestDlFileVersion = dlFileVersions.get(0);

        if ((status == WorkflowConstants.STATUS_APPROVED)
            && (latestDlFileVersion.getStatus() == WorkflowConstants.STATUS_IN_TRASH)) {

          continue;
        }

        // Asset

        if (status == WorkflowConstants.STATUS_APPROVED) {
          if (latestDlFileVersion.isApproved()) {
            assetEntryLocalService.updateVisible(
                DLFileEntryConstants.getClassName(), dlFileEntry.getFileEntryId(), true);
          }
        } else {
          assetEntryLocalService.moveEntryToTrash(
              DLFileEntryConstants.getClassName(), dlFileEntry.getFileEntryId());
        }

        // Social

        if (status == WorkflowConstants.STATUS_APPROVED) {
          socialActivityCounterLocalService.enableActivityCounters(
              DLFileEntryConstants.getClassName(), dlFileEntry.getFileEntryId());

          socialActivityLocalService.addActivity(
              user.getUserId(),
              dlFileEntry.getGroupId(),
              DLFileEntryConstants.getClassName(),
              dlFileEntry.getFileEntryId(),
              SocialActivityConstants.TYPE_RESTORE_FROM_TRASH,
              StringPool.BLANK,
              0);
        } else if (latestDlFileVersion.getStatus() == WorkflowConstants.STATUS_APPROVED) {

          socialActivityLocalService.addActivity(
              user.getUserId(),
              dlFileEntry.getGroupId(),
              DLFileEntryConstants.getClassName(),
              dlFileEntry.getFileEntryId(),
              SocialActivityConstants.TYPE_MOVE_TO_TRASH,
              StringPool.BLANK,
              0);
        }

        // Index

        Indexer indexer = IndexerRegistryUtil.nullSafeGetIndexer(DLFileEntry.class);

        if (status == WorkflowConstants.STATUS_APPROVED) {
          indexer.reindex(dlFileEntry);
        } else {
          indexer.delete(dlFileEntry);
        }

        // Workflow

        if (status != WorkflowConstants.STATUS_APPROVED) {
          for (DLFileVersion dlFileVersion : dlFileVersions) {
            if (!dlFileVersion.isPending()) {
              continue;
            }

            dlFileVersion.setStatus(WorkflowConstants.STATUS_DRAFT);

            dlFileVersionPersistence.update(dlFileVersion, false);

            workflowInstanceLinkLocalService.deleteWorkflowInstanceLink(
                dlFileVersion.getCompanyId(),
                dlFileVersion.getGroupId(),
                DLFileEntryConstants.getClassName(),
                dlFileVersion.getFileVersionId());
          }
        }
      } else if (object instanceof DLFolder) {
        DLFolder dlFolder = (DLFolder) object;

        if (dlFolder.isInTrash()) {
          continue;
        }

        QueryDefinition queryDefinition = new QueryDefinition(WorkflowConstants.STATUS_ANY);

        List<Object> foldersAndFileEntriesAndFileShortcuts =
            dlFolderLocalService.getFoldersAndFileEntriesAndFileShortcuts(
                dlFolder.getGroupId(), dlFolder.getFolderId(), null, false, queryDefinition);

        updateStatuses(user, foldersAndFileEntriesAndFileShortcuts, status);
      }
    }
  }
  @Test
  public void testUpdateExisting() throws Exception {
    long pk = ServiceTestUtil.nextLong();

    DLFolder newDLFolder = _persistence.create(pk);

    newDLFolder.setUuid(ServiceTestUtil.randomString());

    newDLFolder.setGroupId(ServiceTestUtil.nextLong());

    newDLFolder.setCompanyId(ServiceTestUtil.nextLong());

    newDLFolder.setUserId(ServiceTestUtil.nextLong());

    newDLFolder.setUserName(ServiceTestUtil.randomString());

    newDLFolder.setCreateDate(ServiceTestUtil.nextDate());

    newDLFolder.setModifiedDate(ServiceTestUtil.nextDate());

    newDLFolder.setRepositoryId(ServiceTestUtil.nextLong());

    newDLFolder.setMountPoint(ServiceTestUtil.randomBoolean());

    newDLFolder.setParentFolderId(ServiceTestUtil.nextLong());

    newDLFolder.setName(ServiceTestUtil.randomString());

    newDLFolder.setDescription(ServiceTestUtil.randomString());

    newDLFolder.setLastPostDate(ServiceTestUtil.nextDate());

    newDLFolder.setDefaultFileEntryTypeId(ServiceTestUtil.nextLong());

    newDLFolder.setHidden(ServiceTestUtil.randomBoolean());

    newDLFolder.setOverrideFileEntryTypes(ServiceTestUtil.randomBoolean());

    newDLFolder.setStatus(ServiceTestUtil.nextInt());

    newDLFolder.setStatusByUserId(ServiceTestUtil.nextLong());

    newDLFolder.setStatusByUserName(ServiceTestUtil.randomString());

    newDLFolder.setStatusDate(ServiceTestUtil.nextDate());

    _persistence.update(newDLFolder);

    DLFolder existingDLFolder = _persistence.findByPrimaryKey(newDLFolder.getPrimaryKey());

    Assert.assertEquals(existingDLFolder.getUuid(), newDLFolder.getUuid());
    Assert.assertEquals(existingDLFolder.getFolderId(), newDLFolder.getFolderId());
    Assert.assertEquals(existingDLFolder.getGroupId(), newDLFolder.getGroupId());
    Assert.assertEquals(existingDLFolder.getCompanyId(), newDLFolder.getCompanyId());
    Assert.assertEquals(existingDLFolder.getUserId(), newDLFolder.getUserId());
    Assert.assertEquals(existingDLFolder.getUserName(), newDLFolder.getUserName());
    Assert.assertEquals(
        Time.getShortTimestamp(existingDLFolder.getCreateDate()),
        Time.getShortTimestamp(newDLFolder.getCreateDate()));
    Assert.assertEquals(
        Time.getShortTimestamp(existingDLFolder.getModifiedDate()),
        Time.getShortTimestamp(newDLFolder.getModifiedDate()));
    Assert.assertEquals(existingDLFolder.getRepositoryId(), newDLFolder.getRepositoryId());
    Assert.assertEquals(existingDLFolder.getMountPoint(), newDLFolder.getMountPoint());
    Assert.assertEquals(existingDLFolder.getParentFolderId(), newDLFolder.getParentFolderId());
    Assert.assertEquals(existingDLFolder.getName(), newDLFolder.getName());
    Assert.assertEquals(existingDLFolder.getDescription(), newDLFolder.getDescription());
    Assert.assertEquals(
        Time.getShortTimestamp(existingDLFolder.getLastPostDate()),
        Time.getShortTimestamp(newDLFolder.getLastPostDate()));
    Assert.assertEquals(
        existingDLFolder.getDefaultFileEntryTypeId(), newDLFolder.getDefaultFileEntryTypeId());
    Assert.assertEquals(existingDLFolder.getHidden(), newDLFolder.getHidden());
    Assert.assertEquals(
        existingDLFolder.getOverrideFileEntryTypes(), newDLFolder.getOverrideFileEntryTypes());
    Assert.assertEquals(existingDLFolder.getStatus(), newDLFolder.getStatus());
    Assert.assertEquals(existingDLFolder.getStatusByUserId(), newDLFolder.getStatusByUserId());
    Assert.assertEquals(existingDLFolder.getStatusByUserName(), newDLFolder.getStatusByUserName());
    Assert.assertEquals(
        Time.getShortTimestamp(existingDLFolder.getStatusDate()),
        Time.getShortTimestamp(newDLFolder.getStatusDate()));
  }
  @Indexable(type = IndexableType.DELETE)
  public DLFolder deleteFolder(DLFolder dlFolder, boolean includeTrashedEntries)
      throws PortalException, SystemException {

    // Folders

    List<DLFolder> dlFolders =
        dlFolderPersistence.findByG_P(dlFolder.getGroupId(), dlFolder.getFolderId());

    for (DLFolder curDLFolder : dlFolders) {
      if (includeTrashedEntries || !curDLFolder.isInTrash()) {
        dlFolderLocalService.deleteFolder(curDLFolder, includeTrashedEntries);
      }
    }

    // Resources

    resourceLocalService.deleteResource(
        dlFolder.getCompanyId(),
        DLFolder.class.getName(),
        ResourceConstants.SCOPE_INDIVIDUAL,
        dlFolder.getFolderId());

    // WebDAVProps

    webDAVPropsLocalService.deleteWebDAVProps(DLFolder.class.getName(), dlFolder.getFolderId());

    // File entries

    dlFileEntryLocalService.deleteFileEntries(
        dlFolder.getGroupId(), dlFolder.getFolderId(), includeTrashedEntries);

    // File entry types

    dlFileEntryTypeLocalService.unsetFolderFileEntryTypes(dlFolder.getFolderId());

    // File shortcuts

    dlFileShortcutLocalService.deleteFileShortcuts(
        dlFolder.getGroupId(), dlFolder.getFolderId(), includeTrashedEntries);

    // Expando

    expandoValueLocalService.deleteValues(DLFolder.class.getName(), dlFolder.getFolderId());

    // App helper

    dlAppHelperLocalService.deleteFolder(new LiferayFolder(dlFolder));

    // Folder

    dlFolderPersistence.remove(dlFolder);

    // Directory

    try {
      DLStoreUtil.deleteDirectory(
          dlFolder.getCompanyId(), dlFolder.getFolderId(), StringPool.BLANK);
    } catch (NoSuchDirectoryException nsde) {
      if (_log.isDebugEnabled()) {
        _log.debug(nsde.getMessage());
      }
    }

    return dlFolder;
  }
  public DLFolder updateStatus(
      long userId,
      long folderId,
      int status,
      Map<String, Serializable> workflowContext,
      ServiceContext serviceContext)
      throws PortalException, SystemException {

    // Folder

    User user = userPersistence.findByPrimaryKey(userId);

    DLFolder dlFolder = dlFolderPersistence.findByPrimaryKey(folderId);

    int oldStatus = dlFolder.getStatus();

    dlFolder.setStatus(status);
    dlFolder.setStatusByUserId(user.getUserId());
    dlFolder.setStatusByUserName(user.getFullName());
    dlFolder.setStatusDate(new Date());

    dlFolderPersistence.update(dlFolder);

    // Folders, file entries, and file shortcuts

    QueryDefinition queryDefinition = new QueryDefinition(WorkflowConstants.STATUS_ANY);

    List<Object> foldersAndFileEntriesAndFileShortcuts =
        getFoldersAndFileEntriesAndFileShortcuts(
            dlFolder.getGroupId(), folderId, null, false, queryDefinition);

    dlAppHelperLocalService.updateDependentStatus(
        user, foldersAndFileEntriesAndFileShortcuts, status);

    // Asset

    if (status == WorkflowConstants.STATUS_APPROVED) {
      assetEntryLocalService.updateVisible(DLFolder.class.getName(), dlFolder.getFolderId(), true);
    } else if (status == WorkflowConstants.STATUS_IN_TRASH) {
      assetEntryLocalService.updateVisible(DLFolder.class.getName(), dlFolder.getFolderId(), false);
    }

    // Trash

    if (status == WorkflowConstants.STATUS_IN_TRASH) {
      UnicodeProperties typeSettingsProperties = new UnicodeProperties();

      typeSettingsProperties.put("title", dlFolder.getName());

      trashEntryLocalService.addTrashEntry(
          userId,
          dlFolder.getGroupId(),
          DLFolderConstants.getClassName(),
          dlFolder.getFolderId(),
          WorkflowConstants.STATUS_APPROVED,
          null,
          typeSettingsProperties);
    } else {
      trashEntryLocalService.deleteEntry(DLFolderConstants.getClassName(), dlFolder.getFolderId());
    }

    // Indexer

    if (((status == WorkflowConstants.STATUS_APPROVED)
            || (status == WorkflowConstants.STATUS_IN_TRASH)
            || (oldStatus == WorkflowConstants.STATUS_IN_TRASH))
        && ((serviceContext == null) || serviceContext.isIndexingEnabled())) {

      Indexer indexer = IndexerRegistryUtil.nullSafeGetIndexer(DLFolderConstants.getClassName());

      indexer.reindex(dlFolder);
    }

    return dlFolder;
  }
  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 static boolean contains(
      PermissionChecker permissionChecker, DLFolder dlFolder, String actionId)
      throws PortalException, SystemException {

    if (actionId.equals(ActionKeys.ADD_FOLDER)) {
      actionId = ActionKeys.ADD_SUBFOLDER;
    }

    Boolean hasPermission =
        StagingPermissionUtil.hasPermission(
            permissionChecker,
            dlFolder.getGroupId(),
            DLFolder.class.getName(),
            dlFolder.getFolderId(),
            PortletKeys.DOCUMENT_LIBRARY,
            actionId);

    if (hasPermission != null) {
      return hasPermission.booleanValue();
    }

    long folderId = dlFolder.getFolderId();

    if (actionId.equals(ActionKeys.VIEW)) {
      while (folderId != DLFolderConstants.DEFAULT_PARENT_FOLDER_ID) {
        dlFolder = DLFolderLocalServiceUtil.getFolder(folderId);

        folderId = dlFolder.getParentFolderId();

        if (!permissionChecker.hasOwnerPermission(
                dlFolder.getCompanyId(),
                DLFolder.class.getName(),
                dlFolder.getFolderId(),
                dlFolder.getUserId(),
                actionId)
            && !permissionChecker.hasPermission(
                dlFolder.getGroupId(),
                DLFolder.class.getName(),
                dlFolder.getFolderId(),
                actionId)) {

          return false;
        }

        if (!PropsValues.PERMISSIONS_VIEW_DYNAMIC_INHERITANCE) {
          break;
        }
      }

      return true;
    } else {
      while (folderId != DLFolderConstants.DEFAULT_PARENT_FOLDER_ID) {
        dlFolder = DLFolderLocalServiceUtil.getFolder(folderId);

        folderId = dlFolder.getParentFolderId();

        if (permissionChecker.hasOwnerPermission(
            dlFolder.getCompanyId(),
            DLFolder.class.getName(),
            dlFolder.getFolderId(),
            dlFolder.getUserId(),
            actionId)) {

          return true;
        }

        if (permissionChecker.hasPermission(
            dlFolder.getGroupId(), DLFolder.class.getName(), dlFolder.getFolderId(), actionId)) {

          return true;
        }
      }

      return false;
    }
  }