package com.constellio.app.extensions;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Locale;
import java.util.Map;
import com.constellio.app.api.extensions.BatchProcessingExtension;
import com.constellio.app.api.extensions.BatchProcessingExtension.AddCustomLabelsParams;
import com.constellio.app.api.extensions.BatchProcessingExtension.IsMetadataDisplayedWhenModifiedParams;
import com.constellio.app.api.extensions.BatchProcessingExtension.IsMetadataModifiableParams;
import com.constellio.app.api.extensions.DownloadContentVersionLinkExtension;
import com.constellio.app.api.extensions.GenericRecordPageExtension;
import com.constellio.app.api.extensions.PageExtension;
import com.constellio.app.api.extensions.PagesComponentsExtension;
import com.constellio.app.api.extensions.RecordExportExtension;
import com.constellio.app.api.extensions.RecordFieldFactoryExtension;
import com.constellio.app.api.extensions.SearchPageExtension;
import com.constellio.app.api.extensions.SelectionPanelExtension;
import com.constellio.app.api.extensions.SystemCheckExtension;
import com.constellio.app.api.extensions.TaxonomyPageExtension;
import com.constellio.app.api.extensions.params.AvailableActionsParam;
import com.constellio.app.api.extensions.params.CollectionSystemCheckParams;
import com.constellio.app.api.extensions.params.DecorateMainComponentAfterInitExtensionParams;
import com.constellio.app.api.extensions.params.OnWriteRecordParams;
import com.constellio.app.api.extensions.params.PagesComponentsExtensionParams;
import com.constellio.app.api.extensions.params.RecordFieldFactoryExtensionParams;
import com.constellio.app.api.extensions.params.TryRepairAutomaticValueParams;
import com.constellio.app.api.extensions.taxonomies.FolderDeletionEvent;
import com.constellio.app.api.extensions.taxonomies.GetCustomResultDisplayParam;
import com.constellio.app.api.extensions.taxonomies.GetTaxonomyExtraFieldsParam;
import com.constellio.app.api.extensions.taxonomies.GetTaxonomyManagementClassifiedTypesParams;
import com.constellio.app.api.extensions.taxonomies.TaxonomyExtraField;
import com.constellio.app.api.extensions.taxonomies.TaxonomyManagementClassifiedType;
import com.constellio.app.api.extensions.taxonomies.UserSearchEvent;
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.extensions.records.RecordAppExtension;
import com.constellio.app.extensions.records.RecordNavigationExtension;
import com.constellio.app.extensions.records.params.BuildRecordVOParams;
import com.constellio.app.extensions.records.params.GetIconPathParams;
import com.constellio.app.extensions.sequence.AvailableSequence;
import com.constellio.app.extensions.sequence.AvailableSequenceForRecordParams;
import com.constellio.app.extensions.sequence.CollectionSequenceExtension;
import com.constellio.app.ui.framework.components.RecordFieldFactory;
import com.constellio.app.ui.framework.components.SearchResultDisplay;
import com.constellio.app.ui.pages.base.BasePresenter;
import com.constellio.data.frameworks.extensions.ExtensionBooleanResult;
import com.constellio.data.frameworks.extensions.ExtensionUtils;
import com.constellio.data.frameworks.extensions.ExtensionUtils.BooleanCaller;
import com.constellio.data.frameworks.extensions.VaultBehaviorsList;
import com.constellio.data.utils.KeyListMap;
import com.constellio.data.utils.Provider;
import com.constellio.model.entities.Taxonomy;
import com.constellio.model.entities.records.Record;
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.MetadataSchemaType;
public class AppLayerCollectionExtensions {
//------------ Extension points -----------
public Map<String, ModuleExtensions> moduleExtensionsMap = new HashMap<>();
public VaultBehaviorsList<PageExtension> pageAccessExtensions = new VaultBehaviorsList<>();
public VaultBehaviorsList<TaxonomyPageExtension> taxonomyAccessExtensions = new VaultBehaviorsList<>();
public VaultBehaviorsList<GenericRecordPageExtension> schemaTypeAccessExtensions = new VaultBehaviorsList<>();
public VaultBehaviorsList<SearchPageExtension> searchPageExtensions = new VaultBehaviorsList<>();
public VaultBehaviorsList<RecordAppExtension> recordAppExtensions = new VaultBehaviorsList<>();
public VaultBehaviorsList<RecordNavigationExtension> recordNavigationExtensions = new VaultBehaviorsList<>();
public VaultBehaviorsList<BatchProcessingExtension> batchProcessingExtensions = new VaultBehaviorsList<>();
public VaultBehaviorsList<CmisExtension> cmisExtensions = new VaultBehaviorsList<>();
public List<DownloadContentVersionLinkExtension> downloadContentVersionLinkExtensions = new ArrayList<>();
public VaultBehaviorsList<PagesComponentsExtension> pagesComponentsExtensions = new VaultBehaviorsList<>();
public VaultBehaviorsList<SelectionPanelExtension> selectionPanelExtensions = new VaultBehaviorsList<>();
public VaultBehaviorsList<RecordFieldFactoryExtension> recordFieldFactoryExtensions = new VaultBehaviorsList<>();
public VaultBehaviorsList<CollectionSequenceExtension> collectionSequenceExtensions = new VaultBehaviorsList<>();
public VaultBehaviorsList<SystemCheckExtension> systemCheckExtensions = new VaultBehaviorsList<>();
public VaultBehaviorsList<RecordExportExtension> recordExportExtensions = new VaultBehaviorsList<>();
//Key : schema type code
//Values : record's code
public KeyListMap<String, String> lockedRecords = new KeyListMap<>();
public <T extends ModuleExtensions> T forModule(String moduleId) {
return (T) moduleExtensionsMap.get(moduleId);
}
//----------------- Callers ---------------
public List<AvailableSequence> getAvailableSequencesForRecord(Record record) {
AvailableSequenceForRecordParams params = new AvailableSequenceForRecordParams(record);
List<AvailableSequence> availableSequences = new ArrayList<>();
for (CollectionSequenceExtension extension : collectionSequenceExtensions) {
List<AvailableSequence> extensionSequences = extension.getAvailableSequencesForRecord(params);
if (extensionSequences != null) {
availableSequences.addAll(extensionSequences);
}
}
return availableSequences;
}
public void onWriteRecord(OnWriteRecordParams params) {
for (RecordExportExtension recordExportExtension : recordExportExtensions) {
recordExportExtension.onWriteRecord(params);
}
}
public void buildRecordVO(BuildRecordVOParams params) {
for (RecordAppExtension recordAppExtension : recordAppExtensions) {
recordAppExtension.buildRecordVO(params);
}
}
public String getIconForRecord(GetIconPathParams params) {
for (RecordAppExtension recordAppExtension : recordAppExtensions) {
String icon = recordAppExtension.getIconPathForRecord(params);
if (icon != null) {
return icon;
}
}
return null;
}
public void buildCMISObjectFromConstellioRecord(BuildCmisObjectFromConstellioRecordParams params) {
for (CmisExtension extension : cmisExtensions) {
extension.buildCMISObjectFromConstellioRecord(params);
}
}
public void buildConstellioRecordFromCmisObject(BuildConstellioRecordFromCmisObjectParams params) {
for (CmisExtension extension : cmisExtensions) {
extension.buildConstellioRecordFromCmisObject(params);
}
}
public void buildAllowableActions(BuildAllowableActionsParams params) {
for (CmisExtension extension : cmisExtensions) {
extension.buildAllowableActions(params);
}
}
public void onGetObject(GetObjectParams params) {
for (CmisExtension extension : cmisExtensions) {
extension.onGetObject(params);
}
}
public boolean isSchemaTypeSupported(final IsSchemaTypeSupportedParams params, boolean defaultValue) {
return ExtensionUtils.getBooleanValue(cmisExtensions, defaultValue, new BooleanCaller<CmisExtension>() {
@Override
public ExtensionBooleanResult call(CmisExtension extension) {
return extension.isSchemaTypeSupported(params);
}
});
}
//
// public void onCreateCMISFolder(CreateFolderParams params) {
// for (CmisExtension extension : cmisExtensions) {
// extension.onCreateCMISFolder(params);
// }
// }
//
// public void onCreateCMISDocument(CreateDocumentParams params) {
// for (CmisExtension extension : cmisExtensions) {
// extension.onCreateCMISDocument(params);
// }
// }
//
// public void onUpdateCMISFolder(UpdateFolderParams params) {
// for (CmisExtension extension : cmisExtensions) {
// extension.onUpdateCMISFolder(params);
// }
// }
//
// public void onUpdateCMISDocument(UpdateDocumentParams params) {
// for (CmisExtension extension : cmisExtensions) {
// extension.onUpdateCMISDocument(params);
// }
// }
public void onCheckIn(CheckInParams params) {
for (CmisExtension extension : cmisExtensions) {
extension.onCheckIn(params);
}
}
public void onCheckOut(CheckOutParams params) {
for (CmisExtension extension : cmisExtensions) {
extension.onCheckOut(params);
}
}
public void onDeleteTree(DeleteTreeParams params) {
for (CmisExtension extension : cmisExtensions) {
extension.onDeleteTree(params);
}
}
// public void onDeleteContent(DeleteContentParams params) {
// for (CmisExtension extension : cmisExtensions) {
// extension.onDeleteContent(params);
// }
// }
public SearchResultDisplay getCustomResultDisplayFor(GetCustomResultDisplayParam params) {
List<TaxonomyManagementClassifiedType> types = new ArrayList<>();
for (SearchPageExtension extension : searchPageExtensions) {
SearchResultDisplay result = extension.getCustomResultDisplayFor(params);
if (result != null) {
return result;
}
}
return null;
}
public List<TaxonomyManagementClassifiedType> getClassifiedTypes(GetTaxonomyManagementClassifiedTypesParams params) {
List<TaxonomyManagementClassifiedType> types = new ArrayList<>();
for (TaxonomyPageExtension extension : taxonomyAccessExtensions) {
types.addAll(extension.getClassifiedTypesFor(params));
}
return types;
}
public List<TaxonomyExtraField> getTaxonomyExtraFields(GetTaxonomyExtraFieldsParam params) {
List<TaxonomyExtraField> fields = new ArrayList<>();
for (TaxonomyPageExtension extension : taxonomyAccessExtensions) {
fields.addAll(extension.getTaxonomyExtraFieldsFor(params));
}
return fields;
}
public boolean hasPageAccess(boolean defaultValue, final Class<? extends BasePresenter> presenterClass, final String params,
final User user) {
return pageAccessExtensions.getBooleanValue(defaultValue, new BooleanCaller<PageExtension>() {
@Override
public ExtensionBooleanResult call(PageExtension behavior) {
return behavior.hasPageAccess(presenterClass, params, user);
}
});
}
public boolean hasRestrictedRecordAccess(boolean defaultValue, final Class<? extends BasePresenter> presenterClass,
final String params, final User user, final Record restrictedRecord) {
return pageAccessExtensions.getBooleanValue(defaultValue, new BooleanCaller<PageExtension>() {
@Override
public ExtensionBooleanResult call(PageExtension behavior) {
return behavior.hasRestrictedRecordAccess(presenterClass, params, user, restrictedRecord);
}
});
}
public boolean canManageSchema(boolean defaultValue, final User user, final MetadataSchemaType schemaType) {
return schemaTypeAccessExtensions.getBooleanValue(defaultValue, new BooleanCaller<GenericRecordPageExtension>() {
@Override
public ExtensionBooleanResult call(GenericRecordPageExtension behavior) {
return behavior.canManageSchema(user, schemaType);
}
});
}
public boolean canViewSchemaRecord(boolean defaultValue, final User user, final MetadataSchemaType schemaType,
final Record restrictedRecord) {
return schemaTypeAccessExtensions.getBooleanValue(defaultValue, new BooleanCaller<GenericRecordPageExtension>() {
@Override
public ExtensionBooleanResult call(GenericRecordPageExtension behavior) {
return behavior.canViewSchemaRecord(user, schemaType, restrictedRecord);
}
});
}
public boolean canModifySchemaRecord(boolean defaultValue, final User user, final MetadataSchemaType schemaType,
final Record restrictedRecord) {
return schemaTypeAccessExtensions.getBooleanValue(defaultValue, new BooleanCaller<GenericRecordPageExtension>() {
@Override
public ExtensionBooleanResult call(GenericRecordPageExtension behavior) {
return behavior.canModifySchemaRecord(user, schemaType, restrictedRecord);
}
});
}
public boolean canLogicallyDeleteSchemaRecord(boolean defaultValue, final User user, final MetadataSchemaType schemaType,
final Record restrictedRecord) {
return schemaTypeAccessExtensions.getBooleanValue(defaultValue, new BooleanCaller<GenericRecordPageExtension>() {
@Override
public ExtensionBooleanResult call(GenericRecordPageExtension behavior) {
return behavior.canLogicallyDeleteSchemaRecord(user, schemaType, restrictedRecord);
}
});
}
public boolean isSchemaTypeConfigurable(boolean defaultValue, final MetadataSchemaType schemaType) {
return schemaTypeAccessExtensions.getBooleanValue(defaultValue, new BooleanCaller<GenericRecordPageExtension>() {
@Override
public ExtensionBooleanResult call(GenericRecordPageExtension behavior) {
return behavior.isSchemaTypeConfigurable(schemaType);
}
});
}
public boolean canManageTaxonomy(boolean defaultValue, final User user, final Taxonomy taxonomy) {
return taxonomyAccessExtensions.getBooleanValue(defaultValue, new BooleanCaller<TaxonomyPageExtension>() {
@Override
public ExtensionBooleanResult call(TaxonomyPageExtension behavior) {
return behavior.canManageTaxonomy(user, taxonomy);
}
});
}
public boolean displayTaxonomy(boolean defaultValue, final User user, final Taxonomy taxonomy) {
return taxonomyAccessExtensions.getBooleanValue(defaultValue, new BooleanCaller<TaxonomyPageExtension>() {
@Override
public ExtensionBooleanResult call(TaxonomyPageExtension behavior) {
return behavior.displayTaxonomy(user, taxonomy);
}
});
}
public void decorateView(PagesComponentsExtensionParams params) {
for (PagesComponentsExtension extension : pagesComponentsExtensions) {
extension.decorateView(params);
}
}
public void decorateMainComponentBeforeViewInstanciated(DecorateMainComponentAfterInitExtensionParams params) {
for (PagesComponentsExtension extension : pagesComponentsExtensions) {
extension.decorateMainComponentBeforeViewInstanciated(params);
}
}
public void decorateMainComponentAfterViewAssembledOnViewEntered(DecorateMainComponentAfterInitExtensionParams params) {
for (PagesComponentsExtension extension : pagesComponentsExtensions) {
extension.decorateMainComponentAfterViewAssembledOnViewEntered(params);
}
}
public void decorateMainComponentBeforeViewAssembledOnViewEntered(DecorateMainComponentAfterInitExtensionParams params) {
for (PagesComponentsExtension extension : pagesComponentsExtensions) {
extension.decorateMainComponentBeforeViewAssembledOnViewEntered(params);
}
}
public boolean isMetadataDisplayedWhenModifiedInBatchProcessing(final Metadata metadata) {
return batchProcessingExtensions.getBooleanValue(true, new BooleanCaller<BatchProcessingExtension>() {
@Override
public ExtensionBooleanResult call(BatchProcessingExtension behavior) {
return behavior.isMetadataDisplayedWhenModified(new IsMetadataDisplayedWhenModifiedParams(metadata));
}
});
}
public boolean isMetadataModifiableInBatchProcessing(final Metadata metadata, final User user, final String recordId) {
return batchProcessingExtensions.getBooleanValue(true, new BooleanCaller<BatchProcessingExtension>() {
@Override
public ExtensionBooleanResult call(BatchProcessingExtension behavior) {
return behavior.isMetadataModifiable(new IsMetadataModifiableParams(metadata, user, recordId));
}
});
}
public Map<String, String> getCustomLabels(final MetadataSchema schema, final Locale locale,
final Provider<String, String> resourceProvider) {
Map<String, String> customLabels = new HashMap<>();
for (BatchProcessingExtension extension : batchProcessingExtensions) {
extension.addCustomLabel(new AddCustomLabelsParams(schema, locale, resourceProvider, customLabels));
}
return customLabels;
}
public RecordFieldFactory newRecordFieldFactory(RecordFieldFactoryExtensionParams params) {
RecordFieldFactory recordFieldFactory = null;
for (RecordFieldFactoryExtension extension : recordFieldFactoryExtensions) {
recordFieldFactory = extension.newRecordFieldFactory(params);
if (recordFieldFactory != null) {
break;
}
}
return recordFieldFactory;
}
public void notifyNewUserSearch(UserSearchEvent event) {
for (SearchPageExtension extension : searchPageExtensions) {
extension.notifyNewUserSearch(event);
}
}
public void notifyFolderDeletion(FolderDeletionEvent event) {
for (RecordAppExtension extension : recordAppExtensions) {
extension.notifyFolderDeleted(event);
}
}
public void checkCollection(CollectionSystemCheckParams params) {
for (SystemCheckExtension extension : systemCheckExtensions) {
extension.checkCollection(params);
}
}
public boolean tryRepairAutomaticValue(TryRepairAutomaticValueParams params) {
boolean repaired = false;
for (SystemCheckExtension extension : systemCheckExtensions) {
repaired |= extension.tryRepairAutomaticValue(params);
}
return repaired;
}
public void addAvailableActions(AvailableActionsParam param) {
for (SelectionPanelExtension extension : selectionPanelExtensions) {
extension.addAvailableActions(param);
}
}
}