package com.constellio.app.modules.rm.extensions.app; import static com.constellio.app.api.cmis.utils.CmisRecordUtils.toGregorianCalendar; import static org.apache.chemistry.opencmis.commons.PropertyIds.CREATION_DATE; import static org.apache.chemistry.opencmis.commons.PropertyIds.LAST_MODIFICATION_DATE; import org.joda.time.LocalDateTime; import com.constellio.app.api.cmis.builders.object.AllowableActionsBuilder; import com.constellio.app.api.cmis.builders.object.PropertiesBuilder; import com.constellio.app.extensions.api.cmis.CmisExtension; import com.constellio.app.extensions.api.cmis.params.BuildAllowableActionsParams; import com.constellio.app.extensions.api.cmis.params.BuildCmisObjectFromConstellioRecordParams; import com.constellio.app.extensions.api.cmis.params.BuildConstellioRecordFromCmisObjectParams; import com.constellio.app.extensions.api.cmis.params.CheckInParams; import com.constellio.app.extensions.api.cmis.params.CheckOutParams; import com.constellio.app.extensions.api.cmis.params.DeleteTreeParams; import com.constellio.app.extensions.api.cmis.params.GetObjectParams; import com.constellio.app.extensions.api.cmis.params.IsSchemaTypeSupportedParams; import com.constellio.app.modules.rm.constants.RMPermissionsTo; import com.constellio.app.modules.rm.services.RMSchemasRecordsServices; import com.constellio.app.modules.rm.wrappers.Document; import com.constellio.app.modules.rm.wrappers.Folder; import com.constellio.app.modules.rm.wrappers.RMObject; import com.constellio.app.services.factories.AppLayerFactory; import com.constellio.data.frameworks.extensions.ExtensionBooleanResult; import com.constellio.data.utils.TimeProvider; import com.constellio.model.entities.records.Record; import com.constellio.model.entities.records.wrappers.User; import com.constellio.model.services.logging.LoggingServices; import com.constellio.model.services.taxonomies.TaxonomiesManager; public class RMCmisExtension extends CmisExtension { RMSchemasRecordsServices rm; LoggingServices loggingServices; TaxonomiesManager taxonomiesManager; public RMCmisExtension(String collection, AppLayerFactory appLayerFactory) { this.rm = new RMSchemasRecordsServices(collection, appLayerFactory); this.loggingServices = new LoggingServices(appLayerFactory.getModelLayerFactory()); this.taxonomiesManager = appLayerFactory.getModelLayerFactory().getTaxonomiesManager(); } @Override public void buildCMISObjectFromConstellioRecord(BuildCmisObjectFromConstellioRecordParams params) { Record record = params.getRecord(); PropertiesBuilder propertiesBuilder = params.getPropertiesBuilder(); if (record.getSchemaCode().startsWith(Folder.SCHEMA_TYPE) || record.getSchemaCode().startsWith(Document.SCHEMA_TYPE)) { RMObject rmObject = rm.wrapRMObject(record); if (rmObject.getFormCreatedOn() != null) { propertiesBuilder.addPropertyDateTime(CREATION_DATE, toGregorianCalendar(rmObject.getFormCreatedOn())); } if (rmObject.getFormModifiedOn() != null) { propertiesBuilder.addPropertyDateTime(LAST_MODIFICATION_DATE, toGregorianCalendar(rmObject.getFormModifiedOn())); } } } @Override public void buildConstellioRecordFromCmisObject(BuildConstellioRecordFromCmisObjectParams params) { Record record = params.getRecord(); LocalDateTime now = TimeProvider.getLocalDateTime(); if (record.getSchemaCode().startsWith(Folder.SCHEMA_TYPE) || record.getSchemaCode().startsWith(Document.SCHEMA_TYPE)) { RMObject rmObject = rm.wrapRMObject(record); if (rmObject.getFormCreatedOn() == null) { rmObject.setCreatedOn(now); rmObject.setFormCreatedOn(now); } if (rmObject.getFormModifiedOn() == null) { rmObject.setModifiedOn(now); rmObject.setFormModifiedOn(now); } } } @Override public void buildAllowableActions(BuildAllowableActionsParams params) { User user = params.getUser(); Record record = params.getRecord(); if (user.hasWriteAccess().on(record) && user.hasDeleteAccess().on(record) && user.has(RMPermissionsTo.MANAGE_FOLDER_AUTHORIZATIONS).on(record) && record.getTypeCode().equals(Folder.SCHEMA_TYPE)) { params.getActions().addAll(AllowableActionsBuilder.MANAGE_SECURITY_ACTIONS); } if (user.hasWriteAccess().on(record) && user.hasDeleteAccess().on(record) && user.has(RMPermissionsTo.MANAGE_DOCUMENT_AUTHORIZATIONS).on(record) && record.getTypeCode().equals(Document.SCHEMA_TYPE)) { params.getActions().addAll(AllowableActionsBuilder.MANAGE_SECURITY_ACTIONS); } } @Override public void onGetObject(GetObjectParams params) { if (params.isOfType(Folder.SCHEMA_TYPE) || params.isOfType(Document.SCHEMA_TYPE)) { loggingServices.logRecordView(params.getRecord(), params.getUser()); } } // // @Override // public void onCreateCMISFolder(CreateFolderParams params) { // // } // // @Override // public void onCreateCMISDocument(CreateDocumentParams params) { // super.onCreateCMISDocument(params); // } // // @Override // public void onUpdateCMISFolder(UpdateFolderParams params) { // super.onUpdateCMISFolder(params); // } // // @Override // public void onUpdateCMISDocument(UpdateDocumentParams params) { // super.onUpdateCMISDocument(params); // } @Override public void onDeleteTree(DeleteTreeParams params) { if (params.isOfType(Folder.SCHEMA_TYPE) || params.isOfType(Document.SCHEMA_TYPE)) { loggingServices.logDeleteRecordWithJustification(params.getRecord(), params.getUser(), null); } } @Override public void onCheckIn(CheckInParams params) { if (params.isOfType(Document.SCHEMA_TYPE)) { loggingServices.borrowRecord(params.getRecord(), params.getUser()); } } @Override public void onCheckOut(CheckOutParams params) { if (params.isOfType(Document.SCHEMA_TYPE)) { loggingServices.returnRecord(params.getRecord(), params.getUser()); } } // @Override // public void onDeleteContent(DeleteContentParams params) { // // } @Override public ExtensionBooleanResult isSchemaTypeSupported(IsSchemaTypeSupportedParams params) { String schemaType = params.getSchemaType().getCode(); if (Folder.SCHEMA_TYPE.equals(schemaType) || Document.SCHEMA_TYPE.equals(schemaType)) { return ExtensionBooleanResult.FORCE_TRUE; } else { return ExtensionBooleanResult.NOT_APPLICABLE; } } }