/**
* Copyright (c) 2000-present Liferay, Inc. All rights reserved.
*
* This library is free software; you can redistribute it and/or modify it under
* the terms of the GNU Lesser General Public License as published by the Free
* Software Foundation; either version 2.1 of the License, or (at your option)
* any later version.
*
* This library is distributed in the hope that it will be useful, but WITHOUT
* ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS
* FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public License for more
* details.
*/
package com.liferay.document.library.repository.cmis.internal.model;
import com.liferay.document.library.kernel.exception.NoSuchFileEntryException;
import com.liferay.document.library.kernel.exception.NoSuchFileVersionException;
import com.liferay.document.library.kernel.model.DLFileEntryConstants;
import com.liferay.document.library.kernel.service.DLAppHelperLocalServiceUtil;
import com.liferay.document.library.kernel.util.DLUtil;
import com.liferay.document.library.repository.cmis.internal.CMISRepository;
import com.liferay.exportimport.kernel.lar.StagedModelType;
import com.liferay.portal.kernel.exception.PortalException;
import com.liferay.portal.kernel.exception.SystemException;
import com.liferay.portal.kernel.lock.Lock;
import com.liferay.portal.kernel.lock.LockManager;
import com.liferay.portal.kernel.log.Log;
import com.liferay.portal.kernel.log.LogFactoryUtil;
import com.liferay.portal.kernel.model.RepositoryEntry;
import com.liferay.portal.kernel.model.User;
import com.liferay.portal.kernel.repository.Repository;
import com.liferay.portal.kernel.repository.RepositoryException;
import com.liferay.portal.kernel.repository.RepositoryProviderUtil;
import com.liferay.portal.kernel.repository.capabilities.Capability;
import com.liferay.portal.kernel.repository.model.FileEntry;
import com.liferay.portal.kernel.repository.model.FileShortcut;
import com.liferay.portal.kernel.repository.model.FileVersion;
import com.liferay.portal.kernel.repository.model.Folder;
import com.liferay.portal.kernel.repository.model.RepositoryModelOperation;
import com.liferay.portal.kernel.security.auth.PrincipalThreadLocal;
import com.liferay.portal.kernel.security.permission.PermissionChecker;
import com.liferay.portal.kernel.service.RepositoryEntryLocalServiceUtil;
import com.liferay.portal.kernel.util.ContentTypes;
import com.liferay.portal.kernel.util.FileUtil;
import com.liferay.portal.kernel.util.GetterUtil;
import com.liferay.portal.kernel.util.MimeTypesUtil;
import com.liferay.portal.kernel.util.StringPool;
import com.liferay.portal.kernel.util.Validator;
import java.io.InputStream;
import java.io.Serializable;
import java.util.ArrayList;
import java.util.Collections;
import java.util.Date;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import java.util.Set;
import org.apache.chemistry.opencmis.client.api.Document;
import org.apache.chemistry.opencmis.commons.data.AllowableActions;
import org.apache.chemistry.opencmis.commons.data.CmisExtensionElement;
import org.apache.chemistry.opencmis.commons.data.ContentStream;
import org.apache.chemistry.opencmis.commons.enums.Action;
import org.apache.chemistry.opencmis.commons.exceptions.CmisObjectNotFoundException;
/**
* @author Alexander Chow
*/
public class CMISFileEntry extends CMISModel implements FileEntry {
public CMISFileEntry(
CMISRepository cmisRepository, String uuid, long fileEntryId,
Document document, LockManager lockManager) {
_cmisRepository = cmisRepository;
_uuid = uuid;
_fileEntryId = fileEntryId;
_document = document;
_lockManager = lockManager;
}
@Override
public Object clone() {
CMISFileEntry cmisFileEntry = new CMISFileEntry(
_cmisRepository, _uuid, _fileEntryId, _document, _lockManager);
cmisFileEntry.setCompanyId(getCompanyId());
cmisFileEntry.setFileEntryId(getFileEntryId());
cmisFileEntry.setGroupId(getGroupId());
try {
cmisFileEntry.setParentFolder(getParentFolder());
}
catch (Exception e) {
}
cmisFileEntry.setPrimaryKey(getPrimaryKey());
return cmisFileEntry;
}
@Override
public boolean containsPermission(
PermissionChecker permissionChecker, String actionId) {
return containsPermission(_document, actionId);
}
@Override
public void execute(RepositoryModelOperation repositoryModelOperation)
throws PortalException {
repositoryModelOperation.execute(this);
}
@Override
public Map<String, Serializable> getAttributes() {
return new HashMap<>();
}
@Override
public long getCompanyId() {
return _cmisRepository.getCompanyId();
}
@Override
public InputStream getContentStream() {
ContentStream contentStream = _document.getContentStream();
try {
DLAppHelperLocalServiceUtil.getFileAsStream(
PrincipalThreadLocal.getUserId(), this, true);
}
catch (Exception e) {
_log.error(e, e);
}
return contentStream.getStream();
}
@Override
public InputStream getContentStream(String version) throws PortalException {
if (Validator.isNull(version)) {
return getContentStream();
}
for (Document document : getAllVersions()) {
if (version.equals(document.getVersionLabel())) {
ContentStream contentStream = document.getContentStream();
try {
DLAppHelperLocalServiceUtil.getFileAsStream(
PrincipalThreadLocal.getUserId(), this, true);
}
catch (Exception e) {
_log.error(e, e);
}
return contentStream.getStream();
}
}
throw new NoSuchFileVersionException(
"No CMIS file version with {fileEntryId=" + getFileEntryId() +
", version=" + version + "}");
}
@Override
public Date getCreateDate() {
return _document.getCreationDate().getTime();
}
@Override
public String getExtension() {
return FileUtil.getExtension(getTitle());
}
@Override
public long getFileEntryId() {
return _fileEntryId;
}
@Override
public String getFileName() {
return DLUtil.getSanitizedFileName(getTitle(), getExtension());
}
@Override
public List<FileShortcut> getFileShortcuts() {
return Collections.emptyList();
}
@Override
public FileVersion getFileVersion() throws PortalException {
return getLatestFileVersion();
}
@Override
public FileVersion getFileVersion(String version) throws PortalException {
if (Validator.isNull(version)) {
return getFileVersion();
}
for (Document document : getAllVersions()) {
if (version.equals(document.getVersionLabel())) {
return _cmisRepository.toFileVersion(this, document);
}
}
throw new NoSuchFileVersionException(
"No CMIS file version with {fileEntryId=" + getFileEntryId() +
", version=" + version + "}");
}
@Override
public List<FileVersion> getFileVersions(int status) {
try {
List<Document> documents = getAllVersions();
List<FileVersion> fileVersions = new ArrayList<>(documents.size());
for (Document document : documents) {
FileVersion fileVersion = _cmisRepository.toFileVersion(
this, document);
fileVersions.add(fileVersion);
}
return fileVersions;
}
catch (PortalException pe) {
throw new RepositoryException(pe);
}
}
@Override
public int getFileVersionsCount(int status) {
try {
List<Document> documents = getAllVersions();
return documents.size();
}
catch (PortalException pe) {
throw new RepositoryException(pe);
}
}
@Override
public Folder getFolder() {
Folder parentFolder = null;
try {
parentFolder = super.getParentFolder();
if (parentFolder != null) {
return parentFolder;
}
}
catch (Exception e) {
}
try {
List<org.apache.chemistry.opencmis.client.api.Folder>
cmisParentFolders = _document.getParents();
if (cmisParentFolders.isEmpty()) {
_document = _document.getObjectOfLatestVersion(false);
cmisParentFolders = _document.getParents();
}
parentFolder = _cmisRepository.toFolder(cmisParentFolders.get(0));
setParentFolder(parentFolder);
}
catch (Exception e) {
_log.error(e, e);
}
return parentFolder;
}
@Override
public long getFolderId() {
Folder folder = getFolder();
return folder.getFolderId();
}
@Override
public long getGroupId() {
return _cmisRepository.getGroupId();
}
@Override
public String getIcon() {
return DLUtil.getFileIcon(getExtension());
}
@Override
public String getIconCssClass() {
return DLUtil.getFileIconCssClass(getExtension());
}
@Override
public Date getLastPublishDate() {
return null;
}
@Override
public FileVersion getLatestFileVersion() throws PortalException {
if (_latestFileVersion != null) {
return _latestFileVersion;
}
List<Document> documents = getAllVersions();
if (!documents.isEmpty()) {
Document latestDocumentVersion = documents.get(0);
_latestFileVersion = _cmisRepository.toFileVersion(
this, latestDocumentVersion);
}
else {
_latestFileVersion = _cmisRepository.toFileVersion(this, _document);
}
return _latestFileVersion;
}
@Override
public FileVersion getLatestFileVersion(boolean trusted)
throws PortalException {
return getLatestFileVersion();
}
@Override
public Lock getLock() {
if (!isCheckedOut()) {
return null;
}
String checkedOutBy = _document.getVersionSeriesCheckedOutBy();
User user = getUser(checkedOutBy);
long userId = 0;
String userName = null;
if (user != null) {
userId = user.getUserId();
userName = user.getFullName();
}
return _lockManager.createLock(0, getCompanyId(), userId, userName);
}
@Override
public String getMimeType() {
String mimeType = _document.getContentStreamMimeType();
if (Validator.isNotNull(mimeType)) {
return mimeType;
}
return MimeTypesUtil.getContentType(getTitle());
}
@Override
public String getMimeType(String version) {
if (Validator.isNull(version)) {
return getMimeType();
}
try {
for (Document document : getAllVersions()) {
if (!version.equals(document.getVersionLabel())) {
continue;
}
String mimeType = document.getContentStreamMimeType();
if (Validator.isNotNull(mimeType)) {
return mimeType;
}
return MimeTypesUtil.getContentType(document.getName());
}
}
catch (PortalException pe) {
_log.error(pe, pe);
}
return ContentTypes.APPLICATION_OCTET_STREAM;
}
@Override
public Object getModel() {
return _document;
}
@Override
public Class<?> getModelClass() {
return FileEntry.class;
}
@Override
public String getModelClassName() {
return FileEntry.class.getName();
}
@Override
public Date getModifiedDate() {
return _document.getLastModificationDate().getTime();
}
@Override
public long getPrimaryKey() {
return _fileEntryId;
}
@Override
public Serializable getPrimaryKeyObj() {
return getPrimaryKey();
}
@Override
public int getReadCount() {
return 0;
}
@Override
public <T extends Capability> T getRepositoryCapability(
Class<T> capabilityClass) {
try {
Repository repository = RepositoryProviderUtil.getRepository(
getRepositoryId());
return repository.getCapability(capabilityClass);
}
catch (PortalException pe) {
throw new SystemException(
"Unable to access repository " + getRepositoryId(), pe);
}
}
@Override
public long getRepositoryId() {
return _cmisRepository.getRepositoryId();
}
@Override
public long getSize() {
return _document.getContentStreamLength();
}
@Override
public StagedModelType getStagedModelType() {
return new StagedModelType(DLFileEntryConstants.getClassName());
}
@Override
public String getTitle() {
return _document.getName();
}
@Override
public long getUserId() {
User user = getUser(_document.getCreatedBy());
if (user == null) {
return 0;
}
else {
return user.getUserId();
}
}
@Override
public String getUserName() {
User user = getUser(_document.getCreatedBy());
if (user == null) {
return StringPool.BLANK;
}
else {
return user.getFullName();
}
}
@Override
public String getUserUuid() {
User user = getUser(_document.getCreatedBy());
try {
return user.getUserUuid();
}
catch (Exception e) {
}
return StringPool.BLANK;
}
@Override
public String getUuid() {
return _uuid;
}
@Override
public String getVersion() {
return GetterUtil.getString(_document.getVersionLabel(), null);
}
/**
* @deprecated As of 2.0.0, replaced by {@link CMISFileVersion#getUserId()}
*/
@Deprecated
@Override
public long getVersionUserId() {
long versionUserId = 0;
try {
FileVersion fileVersion = getFileVersion();
versionUserId = fileVersion.getUserId();
}
catch (Exception e) {
_log.error(e, e);
}
return versionUserId;
}
/**
* @deprecated As of 2.0.0, replaced by {@link
* CMISFileVersion#getUserName()}
*/
@Deprecated
@Override
public String getVersionUserName() {
String versionUserName = StringPool.BLANK;
try {
FileVersion fileVersion = getFileVersion();
versionUserName = fileVersion.getUserName();
}
catch (Exception e) {
_log.error(e, e);
}
return versionUserName;
}
/**
* @deprecated As of 2.0.0, replaced by {@link
* CMISFileVersion#getUserUuid()}
*/
@Deprecated
@Override
public String getVersionUserUuid() {
String versionUserUuid = StringPool.BLANK;
try {
FileVersion fileVersion = getFileVersion();
versionUserUuid = fileVersion.getUserUuid();
}
catch (Exception e) {
_log.error(e, e);
}
return versionUserUuid;
}
@Override
public boolean hasLock() {
if (!isCheckedOut()) {
return false;
}
AllowableActions allowableActions = _document.getAllowableActions();
Set<Action> allowableActionsSet =
allowableActions.getAllowableActions();
if (allowableActionsSet.contains(Action.CAN_CHECK_IN)) {
return true;
}
List<CmisExtensionElement> cmisExtensionElements =
allowableActions.getExtensions();
if (cmisExtensionElements == null) {
return false;
}
for (CmisExtensionElement cmisExtensionElement :
cmisExtensionElements) {
String name = cmisExtensionElement.getName();
if ((name != null) && name.equals("canCheckInSpecified")) {
return GetterUtil.getBoolean(cmisExtensionElement.getValue());
}
}
return false;
}
@Override
public boolean isCheckedOut() {
return _document.isVersionSeriesCheckedOut();
}
@Override
public boolean isDefaultRepository() {
return false;
}
@Override
public boolean isEscapedModel() {
return false;
}
@Override
public boolean isInTrash() {
return false;
}
@Override
public boolean isInTrashContainer() {
return false;
}
@Override
public boolean isManualCheckInRequired() {
try {
RepositoryEntry repositoryEntry =
RepositoryEntryLocalServiceUtil.getRepositoryEntry(
_fileEntryId);
return repositoryEntry.isManualCheckInRequired();
}
catch (Exception e) {
if (_log.isInfoEnabled()) {
_log.info("Unable to retrieve repository entry", e);
}
return false;
}
}
@Override
public <T extends Capability> boolean isRepositoryCapabilityProvided(
Class<T> capabilityClass) {
Repository repository = getRepository();
return repository.isCapabilityProvided(capabilityClass);
}
@Override
public boolean isSupportsLocking() {
return true;
}
@Override
public boolean isSupportsMetadata() {
return false;
}
@Override
public boolean isSupportsSocial() {
return false;
}
@Override
public void setCompanyId(long companyId) {
_cmisRepository.setCompanyId(companyId);
}
@Override
public void setCreateDate(Date createDate) {
}
public void setFileEntryId(long fileEntryId) {
_fileEntryId = fileEntryId;
}
@Override
public void setGroupId(long groupId) {
_cmisRepository.setGroupId(groupId);
}
@Override
public void setLastPublishDate(Date lastPublishDate) {
}
@Override
public void setModifiedDate(Date modifiedDate) {
}
public void setPrimaryKey(long primaryKey) {
setFileEntryId(primaryKey);
}
@Override
public void setPrimaryKeyObj(Serializable primaryKeyObj) {
setPrimaryKey(((Long)primaryKeyObj).longValue());
}
@Override
public void setUserId(long userId) {
}
@Override
public void setUserName(String userName) {
}
@Override
public void setUserUuid(String userUuid) {
}
@Override
public void setUuid(String uuid) {
}
@Override
public FileEntry toEscapedModel() {
return this;
}
@Override
public FileEntry toUnescapedModel() {
return this;
}
protected List<Document> getAllVersions() throws PortalException {
if (_allVersions == null) {
try {
_allVersions = _document.getAllVersions();
}
catch (CmisObjectNotFoundException confe) {
throw new NoSuchFileEntryException(confe);
}
}
return _allVersions;
}
@Override
protected CMISRepository getCmisRepository() {
return _cmisRepository;
}
protected Repository getRepository() {
try {
return RepositoryProviderUtil.getRepository(getRepositoryId());
}
catch (PortalException pe) {
throw new SystemException(
"Unable to get repository for file entry " + getFileEntryId(),
pe);
}
}
private static final Log _log = LogFactoryUtil.getLog(CMISFileEntry.class);
private List<Document> _allVersions;
private final CMISRepository _cmisRepository;
private Document _document;
private long _fileEntryId;
private FileVersion _latestFileVersion;
private final LockManager _lockManager;
private final String _uuid;
}