package com.constellio.app.ui.pages.management.taxonomy;
import static com.constellio.app.ui.i18n.i18n.$;
import static com.constellio.model.services.taxonomies.ConceptNodesTaxonomySearchServices.fromTypeIn;
import java.util.ArrayList;
import java.util.List;
import java.util.Map;
import com.constellio.app.ui.entities.MetadataSchemaVO;
import com.constellio.app.ui.entities.RecordVO;
import com.constellio.app.ui.entities.RecordVO.VIEW_MODE;
import com.constellio.app.ui.entities.TaxonomyVO;
import com.constellio.app.ui.framework.builders.MetadataSchemaToVOBuilder;
import com.constellio.app.ui.framework.builders.RecordToVOBuilder;
import com.constellio.app.ui.framework.builders.TaxonomyToVOBuilder;
import com.constellio.app.ui.framework.data.RecordVODataProvider;
import com.constellio.app.ui.pages.base.BasePresenter;
import com.constellio.app.ui.pages.base.SchemaPresenterUtils;
import com.constellio.app.ui.params.ParamUtils;
import com.constellio.data.utils.Factory;
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.MetadataSchema;
import com.constellio.model.entities.schemas.MetadataSchemaTypes;
import com.constellio.model.entities.schemas.Schemas;
import com.constellio.model.services.search.StatusFilter;
import com.constellio.model.services.search.query.logical.LogicalSearchQuery;
import com.constellio.model.services.search.query.logical.condition.LogicalSearchCondition;
import com.constellio.model.services.search.query.logical.condition.SchemaFilters;
import com.constellio.model.services.taxonomies.TaxonomiesManager;
import com.constellio.model.services.taxonomies.TaxonomiesSearchServices;
public class TaxonomyManagementSearchPresenter extends BasePresenter<TaxonomyManagementSearchView> {
public static final String TAXONOMY_CODE = "taxonomyCode";
public static final String QUERY = "q";
private MetadataSchemaToVOBuilder schemaVOBuilder = new MetadataSchemaToVOBuilder();
private transient TaxonomiesSearchServices taxonomiesSearchServices;
private TaxonomyVO taxonomy;
private String queryExpression;
private Taxonomy retrievedTaxonomy;
public TaxonomyManagementSearchPresenter(TaxonomyManagementSearchView view) {
super(view);
}
public TaxonomyManagementSearchPresenter forParams(String parameters) {
Map<String, String> params = ParamUtils.getParamsMap(parameters);
String taxonomyCode = params.get(TAXONOMY_CODE);
queryExpression = params.get(QUERY);
taxonomy = new TaxonomyToVOBuilder().build(fetchTaxonomy(taxonomyCode));
taxonomiesSearchServices = modelLayerFactory.newTaxonomiesSearchService();
retrievedTaxonomy = fetchTaxonomy(taxonomy.getCode());
return this;
}
public List<RecordVODataProvider> getDataProviders() {
MetadataSchemaTypes schemaTypes = modelLayerFactory.getMetadataSchemasManager()
.getSchemaTypes(taxonomy.getCollection());
List<RecordVODataProvider> dataProviders = createDataProvidersForSchemas(schemaTypes);
return dataProviders;
}
List<RecordVODataProvider> createDataProvidersForSchemas(MetadataSchemaTypes schemaTypes) {
List<RecordVODataProvider> dataProviders = new ArrayList<>();
for (String schemaType : taxonomy.getSchemaTypes()) {
for (MetadataSchema schema : schemaTypes.getSchemaType(schemaType).getAllSchemas()) {
createDataProviderForSchema(dataProviders, schema);
}
}
return dataProviders;
}
void createDataProviderForSchema(List<RecordVODataProvider> dataProviders, MetadataSchema schema) {
final String schemaCode = schema.getCode();
Factory<LogicalSearchQuery> queryFactory = new Factory<LogicalSearchQuery>() {
@Override
public LogicalSearchQuery get() {
LogicalSearchCondition condition = fromTypeIn(retrievedTaxonomy).returnAll();
LogicalSearchQuery query = getLogicalSearchQueryForSchema(schema(schemaCode),
new LogicalSearchQuery().setCondition(condition));
query.setFreeTextQuery(queryExpression);
if (isPrincipalTaxonomy()) {
query.filteredWithUser(getCurrentUser());
}
return query.filteredByStatus(StatusFilter.ACTIVES);
}
};
dataProviders.add(createDataProvider(queryFactory));
}
RecordVODataProvider createDataProvider(final Factory<LogicalSearchQuery> queryFactory) {
final String schemaCode = queryFactory.get().getSchemaCondition().getCode();
List<String> metadataCodes = new ArrayList<>();
metadataCodes.add(schemaCode + "_id");
metadataCodes.add(schemaCode + "_code");
metadataCodes.add(schemaCode + "_title");
MetadataSchemaVO schemaVO = schemaVOBuilder
.build(schema(schemaCode), VIEW_MODE.TABLE, metadataCodes, view.getSessionContext());
RecordToVOBuilder voBuilder = new RecordToVOBuilder();
RecordVODataProvider dataProvider = new RecordVODataProvider(schemaVO, voBuilder, modelLayerFactory,
view.getSessionContext()) {
@Override
protected LogicalSearchQuery getQuery() {
return queryFactory.get();
}
};
return dataProvider;
}
private LogicalSearchQuery getLogicalSearchQueryForSchema(MetadataSchema schema, LogicalSearchQuery query) {
return new LogicalSearchQuery(
query.getCondition().andWhere(Schemas.IDENTIFIER).isNotNull().withFilters(new SchemaFilters(schema)));
}
Taxonomy fetchTaxonomy(String taxonomyCode) {
TaxonomiesManager taxonomiesManager = view.getConstellioFactories().getModelLayerFactory().getTaxonomiesManager();
return taxonomiesManager.getEnabledTaxonomyWithCode(view.getCollection(), taxonomyCode);
}
public TaxonomyVO getTaxonomy() {
return taxonomy;
}
public void displayButtonClicked(RecordVO recordVO) {
view.navigate().to().taxonomyManagement(taxonomy.getCode(), recordVO.getId());
}
public void editButtonClicked(RecordVO recordVO) {
view.navigate().to().editTaxonomyConcept(taxonomy.getCode(), recordVO.getId(), recordVO.getSchema().getCode());
}
public void deleteButtonClicked(RecordVO recordVO) {
if (isDeletable(recordVO)) {
SchemaPresenterUtils utils = new SchemaPresenterUtils(recordVO.getSchema().getCode(), view.getConstellioFactories(),
view.getSessionContext());
utils.delete(utils.toRecord(recordVO), null, false);
view.refreshTable();
} else {
view.showErrorMessage($("TaxonomyManagementView.cannotDelete"));
}
}
public boolean isPrincipalTaxonomy() {
TaxonomiesManager taxonomiesManager = view.getConstellioFactories().getModelLayerFactory().getTaxonomiesManager();
Taxonomy principalTaxonomy = taxonomiesManager.getPrincipalTaxonomy(collection);
return principalTaxonomy != null && principalTaxonomy.getCode().equals(taxonomy.getCode());
}
public void backButtonClicked() {
view.navigate().to().taxonomyManagement(taxonomy.getCode());
}
@Override
protected boolean hasPageAccess(String parameters, final User user) {
Map<String, String> params = ParamUtils.getParamsMap(parameters);
String taxonomyCode = params.get(TAXONOMY_CODE);
return new TaxonomyPresentersService(appLayerFactory).canManage(taxonomyCode, user);
}
public void viewAssembled() {
}
public boolean isDeletable(RecordVO entity) {
Record record = presenterService().getRecord(entity.getId());
User user = getCurrentUser();
return recordServices().isLogicallyThenPhysicallyDeletable(record, user);
}
public String getDefaultOrderField() {
return Schemas.CODE.getLocalCode();
}
public void searchConcept(String freeText) {
view.navigate().to().taxonomySearch(taxonomy.getCode(), freeText);
}
public String getQueryExpression() {
return queryExpression;
}
}