package com.constellio.app.ui.framework.data.trees;
import static com.constellio.app.services.factories.ConstellioFactories.getInstance;
import static com.constellio.model.services.search.query.ReturnedMetadatasFilter.idVersionSchemaTitlePath;
import com.constellio.app.ui.application.ConstellioUI;
import com.constellio.app.ui.entities.UserVO;
import com.constellio.app.ui.pages.base.SessionContext;
import com.constellio.model.entities.records.Record;
import com.constellio.model.entities.records.wrappers.User;
import com.constellio.model.entities.schemas.Schemas;
import com.constellio.model.entities.security.Role;
import com.constellio.model.services.factories.ModelLayerFactory;
import com.constellio.model.services.records.RecordServices;
import com.constellio.model.services.search.StatusFilter;
import com.constellio.model.services.taxonomies.FastContinueInfos;
import com.constellio.model.services.taxonomies.LinkableTaxonomySearchResponse;
import com.constellio.model.services.taxonomies.TaxonomiesSearchFilter;
import com.constellio.model.services.taxonomies.TaxonomiesSearchOptions;
import com.constellio.model.services.users.UserServices;
public class LinkableRecordTreeNodesDataProvider implements RecordTreeNodesDataProvider {
String taxonomyCode;
String schemaTypeCode;
boolean writeAccess;
TaxonomiesSearchFilter filter;
boolean ignoreLinkability;
public LinkableRecordTreeNodesDataProvider(String taxonomyCode, String schemaTypeCode, boolean writeAccess) {
this(taxonomyCode, schemaTypeCode, writeAccess, null);
}
public LinkableRecordTreeNodesDataProvider(String taxonomyCode, String schemaTypeCode, boolean writeAccess,
TaxonomiesSearchFilter filter) {
this.taxonomyCode = taxonomyCode;
this.schemaTypeCode = schemaTypeCode;
this.writeAccess = writeAccess;
this.filter = filter;
}
public void setIgnoreLinkability(boolean ignoreLinkability) {
this.ignoreLinkability = ignoreLinkability;
}
@Override
public LinkableTaxonomySearchResponse getChildrenNodes(String parentId, int start, int maxSize, FastContinueInfos infos) {
ModelLayerFactory modelLayerFactory = getInstance().getModelLayerFactory();
User currentUser = getCurrentUser(modelLayerFactory);
Record record = getRecord(modelLayerFactory, parentId);
TaxonomiesSearchOptions taxonomiesSearchOptions = newTaxonomiesSearchOptions(maxSize, start, infos);
return modelLayerFactory.newTaxonomiesSearchService().getLinkableChildConceptResponse(
currentUser, record, taxonomyCode, schemaTypeCode, taxonomiesSearchOptions);
}
@Override
public LinkableTaxonomySearchResponse getRootNodes(int start, int maxSize, FastContinueInfos infos) {
ModelLayerFactory modelLayerFactory = getInstance().getModelLayerFactory();
User currentUser = getCurrentUser(modelLayerFactory);
TaxonomiesSearchOptions taxonomiesSearchOptions = newTaxonomiesSearchOptions(maxSize, start, infos);
return modelLayerFactory.newTaxonomiesSearchService().getLinkableRootConceptResponse(
currentUser, currentUser.getCollection(), taxonomyCode, schemaTypeCode, taxonomiesSearchOptions);
}
@Override
public String getTaxonomyCode() {
return taxonomyCode;
}
protected TaxonomiesSearchOptions newTaxonomiesSearchOptions(int rows, int startRow, FastContinueInfos infos) {
TaxonomiesSearchOptions options = new TaxonomiesSearchOptions(rows, startRow, StatusFilter.ACTIVES)
.setFastContinueInfos(infos)
.setReturnedMetadatasFilter(idVersionSchemaTitlePath().withIncludedMetadata(Schemas.CODE)
.withIncludedMetadata(Schemas.DESCRIPTION_TEXT).withIncludedMetadata(Schemas.DESCRIPTION_STRING));
if (writeAccess) {
options.setRequiredAccess(Role.WRITE);
}
options.setAlwaysReturnTaxonomyConceptsWithReadAccess(ignoreLinkability);
options.setFilter(filter);
return options;
}
private User getCurrentUser(ModelLayerFactory modelLayerFactory) {
SessionContext sessionContext = ConstellioUI.getCurrentSessionContext();
String currentCollection = sessionContext.getCurrentCollection();
UserVO currentUserVO = sessionContext.getCurrentUser();
UserServices userServices = modelLayerFactory.newUserServices();
return userServices.getUserInCollection(currentUserVO.getUsername(), currentCollection);
}
private Record getRecord(ModelLayerFactory modelLayerFactory, String id) {
RecordServices recordServices = modelLayerFactory.newRecordServices();
return recordServices.getDocumentById(id);
}
}