001    /**
002     * Copyright (c) 2000-present Liferay, Inc. All rights reserved.
003     *
004     * This library is free software; you can redistribute it and/or modify it under
005     * the terms of the GNU Lesser General Public License as published by the Free
006     * Software Foundation; either version 2.1 of the License, or (at your option)
007     * any later version.
008     *
009     * This library is distributed in the hope that it will be useful, but WITHOUT
010     * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS
011     * FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public License for more
012     * details.
013     */
014    
015    package com.liferay.portal.repository.cmis.model;
016    
017    import com.liferay.portal.kernel.exception.PortalException;
018    import com.liferay.portal.kernel.lar.StagedModelType;
019    import com.liferay.portal.kernel.log.Log;
020    import com.liferay.portal.kernel.log.LogFactoryUtil;
021    import com.liferay.portal.kernel.repository.model.FileEntry;
022    import com.liferay.portal.kernel.repository.model.FileVersion;
023    import com.liferay.portal.kernel.repository.model.RepositoryModelOperation;
024    import com.liferay.portal.kernel.util.FileUtil;
025    import com.liferay.portal.kernel.util.GetterUtil;
026    import com.liferay.portal.kernel.util.MimeTypesUtil;
027    import com.liferay.portal.kernel.util.StringPool;
028    import com.liferay.portal.kernel.util.Validator;
029    import com.liferay.portal.model.User;
030    import com.liferay.portal.repository.cmis.CMISRepository;
031    import com.liferay.portal.security.auth.PrincipalThreadLocal;
032    import com.liferay.portal.service.CMISRepositoryLocalServiceUtil;
033    import com.liferay.portal.service.UserLocalServiceUtil;
034    import com.liferay.portlet.documentlibrary.NoSuchFileEntryException;
035    import com.liferay.portlet.documentlibrary.service.DLAppHelperLocalServiceUtil;
036    import com.liferay.portlet.documentlibrary.util.DLUtil;
037    import com.liferay.portlet.expando.model.ExpandoBridge;
038    
039    import java.io.InputStream;
040    import java.io.Serializable;
041    
042    import java.util.Calendar;
043    import java.util.Date;
044    import java.util.HashMap;
045    import java.util.List;
046    import java.util.Map;
047    
048    import org.apache.chemistry.opencmis.client.api.Document;
049    import org.apache.chemistry.opencmis.commons.data.ContentStream;
050    import org.apache.chemistry.opencmis.commons.exceptions.CmisObjectNotFoundException;
051    
052    /**
053     * @author Alexander Chow
054     */
055    public class CMISFileVersion extends CMISModel implements FileVersion {
056    
057            public CMISFileVersion(
058                    CMISRepository cmisRepository, String uuid, long fileVersionId,
059                    Document document) {
060    
061                    _cmisRepository = cmisRepository;
062                    _uuid = uuid;
063                    _fileVersionId = fileVersionId;
064                    _document = document;
065            }
066    
067            @Override
068            public Object clone() {
069                    CMISFileVersion cmisFileVersion = new CMISFileVersion(
070                            _cmisRepository, _uuid, _fileVersionId, _document);
071    
072                    cmisFileVersion.setCompanyId(getCompanyId());
073                    cmisFileVersion.setFileVersionId(getFileVersionId());
074                    cmisFileVersion.setGroupId(getGroupId());
075    
076                    try {
077                            cmisFileVersion.setParentFolder(getParentFolder());
078                    }
079                    catch (Exception e) {
080                    }
081    
082                    cmisFileVersion.setPrimaryKey(getPrimaryKey());
083    
084                    return cmisFileVersion;
085            }
086    
087            @Override
088            public void execute(RepositoryModelOperation repositoryModelOperation)
089                    throws PortalException {
090    
091                    repositoryModelOperation.execute(this);
092            }
093    
094            @Override
095            public Map<String, Serializable> getAttributes() {
096                    return new HashMap<String, Serializable>();
097            }
098    
099            @Override
100            public String getChangeLog() {
101                    return _document.getCheckinComment();
102            }
103    
104            @Override
105            public long getCompanyId() {
106                    return _cmisRepository.getCompanyId();
107            }
108    
109            @Override
110            public InputStream getContentStream(boolean incrementCounter) {
111                    ContentStream contentStream = _document.getContentStream();
112    
113                    try {
114                            DLAppHelperLocalServiceUtil.getFileAsStream(
115                                    PrincipalThreadLocal.getUserId(), getFileEntry(),
116                                    incrementCounter);
117                    }
118                    catch (Exception e) {
119                            _log.error(e);
120                    }
121    
122                    return contentStream.getStream();
123            }
124    
125            @Override
126            public Date getCreateDate() {
127                    Calendar creationDate = _document.getCreationDate();
128    
129                    return creationDate.getTime();
130            }
131    
132            @Override
133            public ExpandoBridge getExpandoBridge() {
134                    return null;
135            }
136    
137            @Override
138            public String getExtension() {
139                    return FileUtil.getExtension(getTitle());
140            }
141    
142            @Override
143            public String getExtraSettings() {
144                    return null;
145            }
146    
147            @Override
148            public FileEntry getFileEntry() throws PortalException {
149                    Document document = null;
150    
151                    try {
152                            List<Document> allVersions = _document.getAllVersions();
153    
154                            if (allVersions.isEmpty()) {
155                                    document = _document;
156                            }
157                            else {
158                                    document = allVersions.get(0);
159                            }
160                    }
161                    catch (CmisObjectNotFoundException confe) {
162                            throw new NoSuchFileEntryException(confe);
163                    }
164    
165                    return CMISRepositoryLocalServiceUtil.toFileEntry(
166                            getRepositoryId(), document);
167            }
168    
169            @Override
170            public long getFileEntryId() {
171                    try {
172                            return getFileEntry().getFileEntryId();
173                    }
174                    catch (NoSuchFileEntryException nsfee) {
175                    }
176                    catch (Exception e) {
177                            _log.error(e, e);
178                    }
179    
180                    return 0;
181            }
182    
183            @Override
184            public String getFileName() {
185                    return DLUtil.getSanitizedFileName(getTitle(), getExtension());
186            }
187    
188            @Override
189            public long getFileVersionId() {
190                    return _fileVersionId;
191            }
192    
193            @Override
194            public long getGroupId() {
195                    return _cmisRepository.getGroupId();
196            }
197    
198            @Override
199            public String getIcon() {
200                    return DLUtil.getFileIcon(getExtension());
201            }
202    
203            @Override
204            public String getMimeType() {
205                    String mimeType = _document.getContentStreamMimeType();
206    
207                    if (Validator.isNotNull(mimeType)) {
208                            return mimeType;
209                    }
210    
211                    return MimeTypesUtil.getContentType(getTitle());
212            }
213    
214            @Override
215            public Object getModel() {
216                    return _document;
217            }
218    
219            @Override
220            public Class<?> getModelClass() {
221                    return CMISFileVersion.class;
222            }
223    
224            @Override
225            public String getModelClassName() {
226                    return CMISFileVersion.class.getName();
227            }
228    
229            @Override
230            public Date getModifiedDate() {
231                    Calendar modificationDate = _document.getLastModificationDate();
232    
233                    return modificationDate.getTime();
234            }
235    
236            @Override
237            public long getPrimaryKey() {
238                    return _fileVersionId;
239            }
240    
241            @Override
242            public Serializable getPrimaryKeyObj() {
243                    return getPrimaryKey();
244            }
245    
246            @Override
247            public long getRepositoryId() {
248                    return _cmisRepository.getRepositoryId();
249            }
250    
251            @Override
252            public long getSize() {
253                    return _document.getContentStreamLength();
254            }
255    
256            @Override
257            public StagedModelType getStagedModelType() {
258                    return new StagedModelType(FileVersion.class);
259            }
260    
261            @Override
262            public int getStatus() {
263                    return 0;
264            }
265    
266            @Override
267            public long getStatusByUserId() {
268                    return 0;
269            }
270    
271            @Override
272            public String getStatusByUserName() {
273                    return null;
274            }
275    
276            @Override
277            public String getStatusByUserUuid() {
278                    return null;
279            }
280    
281            @Override
282            public Date getStatusDate() {
283                    return getModifiedDate();
284            }
285    
286            @Override
287            public String getTitle() {
288                    return _document.getName();
289            }
290    
291            @Override
292            public long getUserId() {
293                    try {
294                            return UserLocalServiceUtil.getDefaultUserId(getCompanyId());
295                    }
296                    catch (Exception e) {
297                            return 0;
298                    }
299            }
300    
301            @Override
302            public String getUserName() {
303                    return _document.getCreatedBy();
304            }
305    
306            @Override
307            public String getUserUuid() {
308                    try {
309                            User user = UserLocalServiceUtil.getDefaultUser(getCompanyId());
310    
311                            return user.getUserUuid();
312                    }
313                    catch (Exception e) {
314                            return StringPool.BLANK;
315                    }
316            }
317    
318            @Override
319            public String getUuid() {
320                    return _uuid;
321            }
322    
323            @Override
324            public String getVersion() {
325                    return GetterUtil.getString(_document.getVersionLabel());
326            }
327    
328            @Override
329            public boolean isApproved() {
330                    return false;
331            }
332    
333            @Override
334            public boolean isDefaultRepository() {
335                    return false;
336            }
337    
338            @Override
339            public boolean isDraft() {
340                    return false;
341            }
342    
343            @Override
344            public boolean isEscapedModel() {
345                    return false;
346            }
347    
348            @Override
349            public boolean isExpired() {
350                    return false;
351            }
352    
353            @Override
354            public boolean isPending() {
355                    return false;
356            }
357    
358            @Override
359            public void setCompanyId(long companyId) {
360                    _cmisRepository.setCompanyId(companyId);
361            }
362    
363            @Override
364            public void setCreateDate(Date date) {
365            }
366    
367            public void setFileVersionId(long fileVersionId) {
368                    _fileVersionId = fileVersionId;
369            }
370    
371            @Override
372            public void setGroupId(long groupId) {
373                    _cmisRepository.setGroupId(groupId);
374            }
375    
376            @Override
377            public void setModifiedDate(Date date) {
378            }
379    
380            public void setPrimaryKey(long primaryKey) {
381                    setFileVersionId(primaryKey);
382            }
383    
384            @Override
385            public void setPrimaryKeyObj(Serializable primaryKeyObj) {
386                    setPrimaryKey(((Long)primaryKeyObj).longValue());
387            }
388    
389            @Override
390            public void setUserId(long userId) {
391            }
392    
393            @Override
394            public void setUserName(String userName) {
395            }
396    
397            @Override
398            public void setUserUuid(String userUuid) {
399            }
400    
401            @Override
402            public void setUuid(String uuid) {
403            }
404    
405            @Override
406            public FileVersion toEscapedModel() {
407                    return this;
408            }
409    
410            @Override
411            public FileVersion toUnescapedModel() {
412                    return this;
413            }
414    
415            @Override
416            protected CMISRepository getCmisRepository() {
417                    return _cmisRepository;
418            }
419    
420            private static final Log _log = LogFactoryUtil.getLog(
421                    CMISFileVersion.class);
422    
423            private final CMISRepository _cmisRepository;
424            private final Document _document;
425            private long _fileVersionId;
426            private final String _uuid;
427    
428    }