001/*
002 * Copyright (c) 2006-2011 Nuxeo SA (http://nuxeo.com/) and others.
003 *
004 * All rights reserved. This program and the accompanying materials
005 * are made available under the terms of the Eclipse Public License v1.0
006 * which accompanies this distribution, and is available at
007 * http://www.eclipse.org/legal/epl-v10.html
008 *
009 * Contributors:
010 *     Florent Guillaume
011 */
012package org.nuxeo.ecm.core.opencmis.impl.client;
013
014import java.math.BigInteger;
015import java.util.ArrayList;
016import java.util.List;
017import java.util.Map;
018
019import org.apache.chemistry.opencmis.client.api.Document;
020import org.apache.chemistry.opencmis.client.api.ObjectId;
021import org.apache.chemistry.opencmis.client.api.ObjectType;
022import org.apache.chemistry.opencmis.client.api.OperationContext;
023import org.apache.chemistry.opencmis.client.api.Policy;
024import org.apache.chemistry.opencmis.client.api.SecondaryType;
025import org.apache.chemistry.opencmis.commons.PropertyIds;
026import org.apache.chemistry.opencmis.commons.data.Ace;
027import org.apache.chemistry.opencmis.commons.data.ContentStream;
028import org.apache.chemistry.opencmis.commons.data.ContentStreamHash;
029import org.apache.chemistry.opencmis.commons.enums.VersioningState;
030import org.apache.chemistry.opencmis.commons.exceptions.CmisConstraintException;
031import org.apache.chemistry.opencmis.commons.exceptions.CmisInvalidArgumentException;
032import org.apache.chemistry.opencmis.commons.exceptions.CmisNotSupportedException;
033import org.apache.chemistry.opencmis.commons.impl.dataobjects.ContentStreamHashImpl;
034import org.apache.chemistry.opencmis.commons.spi.Holder;
035import org.nuxeo.ecm.core.opencmis.impl.server.NuxeoObjectData;
036
037/**
038 * Live local CMIS Document, which is backed by a Nuxeo document.
039 */
040public class NuxeoDocument extends NuxeoFileableObject implements Document {
041
042    public NuxeoDocument(NuxeoSession session, NuxeoObjectData data, ObjectType type,
043            List<SecondaryType> secondaryTypes) {
044        super(session, data, type, secondaryTypes);
045    }
046
047    @Override
048    public void cancelCheckOut() {
049        service.cancelCheckOut(getRepositoryId(), getId(), null);
050    }
051
052    @Override
053    public ObjectId checkIn(boolean major, Map<String, ?> properties, ContentStream contentStream, String checkinComment) {
054        return checkIn(major, properties, contentStream, checkinComment, null, null, null);
055    }
056
057    @Override
058    public ObjectId checkIn(boolean major, Map<String, ?> properties, ContentStream contentStream,
059            String checkinComment, List<Policy> policies, List<Ace> addAces, List<Ace> removeAces) {
060        Holder<String> idHolder = new Holder<>(getId());
061        service.checkIn(getRepositoryId(), idHolder, Boolean.valueOf(major),
062                objectFactory.convertProperties(properties, type, null, UPDATABILITY_READWRITE),
063                objectFactory.convertContentStream(contentStream), checkinComment,
064                objectFactory.convertPolicies(policies), objectFactory.convertAces(addAces),
065                objectFactory.convertAces(removeAces), null);
066        return session.createObjectId(idHolder.getValue());
067    }
068
069    @Override
070    public ObjectId checkOut() {
071        Holder<String> idHolder = new Holder<>(getId());
072        service.checkOut(getRepositoryId(), idHolder, null, null);
073        return session.createObjectId(idHolder.getValue());
074    }
075
076    @Override
077    public NuxeoDocument copy(ObjectId target) {
078        return copy(target, null, null, null, null, null, session.getDefaultContext());
079    }
080
081    @Override
082    public NuxeoDocument copy(ObjectId target, Map<String, ?> properties, VersioningState versioningState,
083            List<Policy> policies, List<Ace> addACEs, List<Ace> removeACEs, OperationContext context) {
084        if (target == null || target.getId() == null) {
085            throw new CmisInvalidArgumentException("Invalid target: " + target);
086        }
087        if (context == null) {
088            context = session.getDefaultContext();
089        }
090        NuxeoObjectData newData = nuxeoCmisService.copy(getId(), target.getId(), properties, type, versioningState,
091                policies, addACEs, removeACEs, context);
092        return (NuxeoDocument) session.getObjectFactory().convertObject(newData, context);
093    }
094
095    @Override
096    public void deleteAllVersions() {
097        // TODO Auto-generated method stub
098        throw new UnsupportedOperationException();
099    }
100
101    @Override
102    public NuxeoDocument deleteContentStream() {
103        ObjectId objectId = deleteContentStream(true);
104        return (NuxeoDocument) session.getObject(objectId);
105    }
106
107    @Override
108    public ObjectId deleteContentStream(boolean refresh) {
109        Holder<String> objectIdHolder = new Holder<String>(getId());
110        String changeToken = getPropertyValue(PropertyIds.CHANGE_TOKEN);
111        Holder<String> changeTokenHolder = new Holder<String>(changeToken);
112
113        service.deleteContentStream(getRepositoryId(), objectIdHolder, changeTokenHolder, null);
114
115        String objectId = objectIdHolder.getValue(); // never null
116        return session.createObjectId(objectId);
117    }
118
119    @Override
120    public List<Document> getAllVersions() {
121        // TODO Auto-generated method stub
122        throw new UnsupportedOperationException();
123    }
124
125    @Override
126    public List<Document> getAllVersions(OperationContext context) {
127        // TODO Auto-generated method stub
128        throw new UnsupportedOperationException();
129    }
130
131    @Override
132    public String getCheckinComment() {
133        return getPropertyValue(PropertyIds.CHECKIN_COMMENT);
134    }
135
136    @Override
137    public ContentStream getContentStream() {
138        return getContentStream(null, null, null);
139    }
140
141    @Override
142    public ContentStream getContentStream(String streamId) {
143        return getContentStream(streamId, null, null);
144    }
145
146    @Override
147    public ContentStream getContentStream(BigInteger offset, BigInteger length) {
148        return getContentStream(null, offset, length);
149    }
150
151    @Override
152    public ContentStream getContentStream(String streamId, BigInteger offset, BigInteger length) {
153        try {
154            return service.getContentStream(getRepositoryId(), getId(), streamId, offset, length, null);
155        } catch (CmisConstraintException e) {
156            return null;
157        }
158    }
159
160    @Override
161    public String getContentStreamFileName() {
162        return getPropertyValue(PropertyIds.CONTENT_STREAM_FILE_NAME);
163    }
164
165    @Override
166    public String getContentStreamId() {
167        return getPropertyValue(PropertyIds.CONTENT_STREAM_ID);
168    }
169
170    @Override
171    public long getContentStreamLength() {
172        Long length = getPropertyValue(PropertyIds.CONTENT_STREAM_LENGTH);
173        return length == null ? -1 : length.longValue();
174    }
175
176    @Override
177    public String getContentStreamMimeType() {
178        return getPropertyValue(PropertyIds.CONTENT_STREAM_MIME_TYPE);
179    }
180
181    @Override
182    public Document getObjectOfLatestVersion(boolean major) {
183        // TODO Auto-generated method stub
184        throw new UnsupportedOperationException();
185    }
186
187    @Override
188    public Document getObjectOfLatestVersion(boolean major, OperationContext context) {
189        // TODO Auto-generated method stub
190        throw new UnsupportedOperationException();
191    }
192
193    @Override
194    public String getVersionLabel() {
195        return getPropertyValue(PropertyIds.VERSION_LABEL);
196    }
197
198    @Override
199    public String getVersionSeriesCheckedOutBy() {
200        return getPropertyValue(PropertyIds.VERSION_SERIES_CHECKED_OUT_BY);
201    }
202
203    @Override
204    public String getVersionSeriesCheckedOutId() {
205        return getPropertyValue(PropertyIds.VERSION_SERIES_CHECKED_OUT_ID);
206    }
207
208    @Override
209    public String getVersionSeriesId() {
210        return getPropertyValue(PropertyIds.VERSION_SERIES_ID);
211    }
212
213    @Override
214    public Boolean isImmutable() {
215        return getPropertyValue(PropertyIds.IS_IMMUTABLE);
216    }
217
218    @Override
219    public Boolean isLatestMajorVersion() {
220        return getPropertyValue(PropertyIds.IS_LATEST_MAJOR_VERSION);
221    }
222
223    @Override
224    public Boolean isLatestVersion() {
225        return getPropertyValue(PropertyIds.IS_LATEST_VERSION);
226    }
227
228    @Override
229    public Boolean isMajorVersion() {
230        return getPropertyValue(PropertyIds.IS_MAJOR_VERSION);
231    }
232
233    @Override
234    public Boolean isVersionSeriesCheckedOut() {
235        return getPropertyValue(PropertyIds.IS_VERSION_SERIES_CHECKED_OUT);
236    }
237
238    @Override
239    public Boolean isPrivateWorkingCopy() {
240        return getPropertyValue(PropertyIds.IS_PRIVATE_WORKING_COPY);
241    }
242
243    @Override
244    public Document setContentStream(ContentStream contentStream, boolean overwrite) {
245        ObjectId objectId = setContentStream(contentStream, overwrite, true);
246        return (Document) session.getObject(objectId);
247    }
248
249    @Override
250    public ObjectId setContentStream(ContentStream contentStream, boolean overwrite, boolean refresh) {
251        Holder<String> objectIdHolder = new Holder<String>(getId());
252        String changeToken = getPropertyValue(PropertyIds.CHANGE_TOKEN);
253        Holder<String> changeTokenHolder = new Holder<String>(changeToken);
254
255        service.setContentStream(getRepositoryId(), objectIdHolder, Boolean.valueOf(overwrite), changeTokenHolder,
256                contentStream, null);
257
258        String objectId = objectIdHolder.getValue(); // never null
259        return session.createObjectId(objectId);
260    }
261
262    @Override
263    public Document appendContentStream(ContentStream contentStream, boolean isLastChunk) {
264        ObjectId objectId = appendContentStream(contentStream, isLastChunk, true);
265        return (Document) session.getObject(objectId);
266    }
267
268    @Override
269    public ObjectId appendContentStream(ContentStream contentStream, boolean isLastChunk, boolean refresh) {
270        throw new CmisNotSupportedException();
271    }
272
273    @Override
274    public List<ContentStreamHash> getContentStreamHashes() {
275        List<String> hashes = getPropertyValue(PropertyIds.CONTENT_STREAM_HASH);
276        if (hashes == null || hashes.size() == 0) {
277            return null;
278        }
279
280        List<ContentStreamHash> result = new ArrayList<ContentStreamHash>(hashes.size());
281        for (String hash : hashes) {
282            result.add(new ContentStreamHashImpl(hash));
283        }
284
285        return result;
286    }
287
288    @Override
289    public String getContentUrl() {
290        throw new UnsupportedOperationException();
291    }
292
293    @Override
294    public String getContentUrl(String streamId) {
295        throw new UnsupportedOperationException();
296    }
297
298}