package com.constellio.app.api.cmis.requests.versioning; import static org.apache.chemistry.opencmis.commons.enums.Action.CAN_CHECK_IN; import java.io.File; import java.io.IOException; import java.io.InputStream; import java.io.OutputStream; import java.util.List; import org.apache.chemistry.opencmis.commons.data.Acl; import org.apache.chemistry.opencmis.commons.data.ContentStream; import org.apache.chemistry.opencmis.commons.data.ExtensionsData; import org.apache.chemistry.opencmis.commons.data.Properties; import org.apache.chemistry.opencmis.commons.enums.Action; import org.apache.chemistry.opencmis.commons.exceptions.CmisPermissionDeniedException; import org.apache.chemistry.opencmis.commons.exceptions.CmisRuntimeException; import org.apache.chemistry.opencmis.commons.server.CallContext; import org.apache.chemistry.opencmis.commons.spi.Holder; import org.apache.commons.lang3.builder.ToStringBuilder; import org.slf4j.Logger; import org.slf4j.LoggerFactory; import com.constellio.app.api.cmis.ConstellioCmisException; import com.constellio.app.api.cmis.ConstellioCmisException.ConstellioCmisException_ContentAlreadyCheckedOut; import com.constellio.app.api.cmis.ConstellioCmisException.ConstellioCmisException_IOError; import com.constellio.app.api.cmis.ConstellioCmisException.ConstellioCmisException_RecordServicesError; import com.constellio.app.api.cmis.binding.collection.ConstellioCollectionRepository; import com.constellio.app.api.cmis.binding.global.ConstellioCmisContextParameters; import com.constellio.app.api.cmis.binding.utils.CmisContentUtils; import com.constellio.app.api.cmis.binding.utils.ContentCmisDocument; import com.constellio.app.api.cmis.builders.object.AllowableActionsBuilder; import com.constellio.app.api.cmis.requests.CmisCollectionRequest; import com.constellio.app.extensions.api.cmis.params.CheckInParams; import com.constellio.app.extensions.api.cmis.params.UpdateDocumentParams; import com.constellio.app.services.factories.AppLayerFactory; import com.constellio.data.io.services.facades.IOServices; import com.constellio.model.entities.records.Content; import com.constellio.model.entities.records.Record; import com.constellio.model.entities.records.wrappers.User; import com.constellio.model.entities.schemas.MetadataSchemaTypes; import com.constellio.model.services.contents.ContentManager; import com.constellio.model.services.contents.ContentVersionDataSummary; import com.constellio.model.services.records.RecordServices; import com.constellio.model.services.records.RecordServicesException; public class CheckInRequest extends CmisCollectionRequest<Boolean> { private static final String TEMP_FILE_RESOURCE_NAME = "CheckInRequest-TempFile"; private static final String COPY_TO_TEMP_FILE = "CheckInRequest-CopyToTempFile"; private static final String READ_TEMP_FILE = "CheckInRequest-ReadTempFile"; private static final Logger LOGGER = LoggerFactory.getLogger(CheckInRequest.class); String repositoryId; Holder<String> objectId; Boolean major; Properties properties; ContentStream contentStream; String checkinComment; List<String> policies; Acl addAces; org.apache.chemistry.opencmis.commons.data.Acl removeAces; ExtensionsData extension; public CheckInRequest(ConstellioCollectionRepository repository, CallContext context, AppLayerFactory appLayerFactory, String repositoryId, Holder<String> objectId, Boolean major, Properties properties, ContentStream contentStream, String checkinComment, List<String> policies, Acl addAces, Acl removeAces, ExtensionsData extension) { super(context, repository, appLayerFactory); this.repositoryId = repositoryId; this.objectId = objectId; this.major = major; this.properties = properties; this.contentStream = contentStream; this.checkinComment = checkinComment; this.policies = policies; this.addAces = addAces; this.removeAces = removeAces; this.extension = extension; } @Override protected Boolean process() throws ConstellioCmisException { RecordServices recordServices = modelLayerFactory.newRecordServices(); ContentManager contentManager = modelLayerFactory.getContentManager(); MetadataSchemaTypes types = modelLayerFactory.getMetadataSchemasManager().getSchemaTypes(collection); ContentCmisDocument contentCmisDocument = CmisContentUtils.getContent(objectId.getValue(), recordServices, types); Content content = contentCmisDocument.getContent(); ensureUserHasAllowableActionsOnRecord(contentCmisDocument.getRecord(), Action.CAN_CHECK_IN); IOServices ioServices = modelLayerFactory.getIOServicesFactory().newIOServices(); File file = null; OutputStream out = null; InputStream inFromCopy = null; if (contentStream != null) { try { file = ioServices.newTemporaryFile(TEMP_FILE_RESOURCE_NAME); out = ioServices.newFileOutputStream(file, COPY_TO_TEMP_FILE); ioServices.copy(contentStream.getStream(), out); ioServices.closeQuietly(out); inFromCopy = ioServices.newFileInputStream(file, READ_TEMP_FILE); if (user.getId().equals(content.getCheckoutUserId())) { ContentVersionDataSummary dataSummary = uploadContent(inFromCopy, contentStream.getFileName()); content.checkInWithModificationAndName(dataSummary, major, contentStream.getFileName()); } else { throw new ConstellioCmisException_ContentAlreadyCheckedOut(); } recordServices.update(contentCmisDocument.getRecord(), user); CheckInParams params = new CheckInParams(user, contentCmisDocument.getRecord()); appLayerFactory.getExtensions().forCollection(collection).onCheckIn(params); } catch (IOException e) { throw new ConstellioCmisException_IOError(e); } catch (RecordServicesException e) { throw new ConstellioCmisException_RecordServicesError(e); } finally { ioServices.closeQuietly(out); ioServices.closeQuietly(inFromCopy); ioServices.deleteQuietly(file); } } else { if (user.getId().equals(content.getCheckoutUserId())) { if (major) { content.finalizeVersion(); } else { content.checkIn(); } } else { throw new ConstellioCmisException_ContentAlreadyCheckedOut(); } try { recordServices.update(contentCmisDocument.getRecord(), user); CheckInParams params = new CheckInParams(user, contentCmisDocument.getRecord()); appLayerFactory.getExtensions().forCollection(collection).onCheckIn(params); } catch (RecordServicesException e) { throw new ConstellioCmisException_RecordServicesError(e); } } return true; } @Override protected Logger getLogger() { return LOGGER; } @Override public String toString() { return ToStringBuilder.reflectionToString(this); } }