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}