package com.constellio.app.api.cmis.requests.object;
import java.util.ArrayList;
import java.util.List;
import org.apache.chemistry.opencmis.commons.data.ContentStream;
import org.apache.chemistry.opencmis.commons.data.Properties;
import org.apache.chemistry.opencmis.commons.data.PropertyData;
import org.apache.chemistry.opencmis.commons.enums.Action;
import org.apache.chemistry.opencmis.commons.enums.VersioningState;
import org.apache.chemistry.opencmis.commons.exceptions.CmisRuntimeException;
import org.apache.chemistry.opencmis.commons.server.CallContext;
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_UnsupportedVersioningState;
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.ContentCmisDocument;
import com.constellio.app.api.cmis.requests.CmisCollectionRequest;
import com.constellio.app.extensions.api.cmis.params.CreateDocumentParams;
import com.constellio.app.services.factories.AppLayerFactory;
import com.constellio.model.entities.records.Content;
import com.constellio.model.entities.records.Record;
import com.constellio.model.entities.records.Transaction;
import com.constellio.model.entities.records.wrappers.User;
import com.constellio.model.entities.schemas.Metadata;
import com.constellio.model.entities.schemas.MetadataSchema;
import com.constellio.model.entities.schemas.MetadataSchemaTypes;
import com.constellio.model.entities.schemas.MetadataValueType;
import com.constellio.model.services.contents.ContentManager;
import com.constellio.model.services.contents.ContentVersionDataSummary;
import com.constellio.model.services.records.RecordServicesException;
public class CreateDocumentRequest extends CmisCollectionRequest<ContentCmisDocument> {
private static final Logger LOGGER = LoggerFactory.getLogger(CmisCollectionRequest.class);
private final Properties properties;
private final String folderId;
private final ContentStream contentStream;
private final VersioningState versioningState;
public CreateDocumentRequest(ConstellioCollectionRepository repository, AppLayerFactory appLayerFactory,
CallContext context, Properties properties, String folderId, ContentStream contentStream,
VersioningState versioningState) {
super(context, repository, appLayerFactory);
this.properties = properties;
this.folderId = folderId;
this.contentStream = contentStream;
this.versioningState = versioningState;
}
@Override
public ContentCmisDocument process()
throws ConstellioCmisException {
Record record = recordServices.getDocumentById(folderId);
ensureUserHasAllowableActionsOnRecord(record, Action.CAN_CREATE_DOCUMENT);
MetadataSchema metadataSchema = types().getSchema(record.getSchemaCode());
PropertyData<?> property = properties.getProperties().get("metadata");
Metadata metadata = null;
if (property == null) {
for (Metadata aContentMetadata : metadataSchema.getMetadatas().onlyWithType(MetadataValueType.CONTENT)) {
metadata = aContentMetadata;
break;
}
} else {
String metadataLocalCode = (String) property.getFirstValue();
metadata = metadataSchema.getMetadata(metadataLocalCode);
}
if (metadata == null) {
throw new CmisRuntimeException("No content metadata");
}
Content content;
ContentVersionDataSummary dataSummary = uploadContent(contentStream.getStream(), contentStream.getFileName());
if (versioningState == VersioningState.MAJOR) {
content = contentManager.createMajor(user, contentStream.getFileName(), dataSummary);
} else if (versioningState == VersioningState.MINOR) {
content = contentManager.createMinor(user, contentStream.getFileName(), dataSummary);
} else {
throw new ConstellioCmisException_UnsupportedVersioningState();
}
if (metadata.isMultivalue() == true) {
List<Object> contentsInRecord = new ArrayList<>();
contentsInRecord.addAll(record.getList(metadata));
contentsInRecord.add(content);
record.set(metadata, contentsInRecord);
} else {
record.set(metadata, content);
}
try {
recordServices.execute(new Transaction(record).setUser(user));
} catch (RecordServicesException e) {
throw new RuntimeException(e);
}
// CreateDocumentParams params = new CreateDocumentParams(user, record);
// appLayerFactory.getExtensions().forCollection(collection).onCreateCMISDocument(params);
return ContentCmisDocument.createForVersionSeenBy(content, record, metadata.getLocalCode(), user);
}
@Override
protected Logger getLogger() {
return LOGGER;
}
@Override
public String toString() {
return ToStringBuilder.reflectionToString(this);
}
}