package com.constellio.app.services.schemasDisplay;
import static java.util.Arrays.asList;
import java.util.ArrayList;
import java.util.List;
import com.constellio.app.entities.schemasDisplay.SchemaDisplayConfig;
import com.constellio.model.entities.schemas.MetadataSchemaType;
public class OngoingAddMetadatasToSchemas {
enum OngoingAddMetadatasToSchemasMode {FORM, DISPLAY, SEARCH, TABLE}
SchemaTypesDisplayTransactionBuilder transaction;
OngoingAddMetadatasToSchemasMode mode;
MetadataSchemaType schemaType;
SchemasDisplayManager schemasDisplayManager;
List<String> metadatasLocalCodes;
public OngoingAddMetadatasToSchemas(MetadataSchemaType schemaType, SchemasDisplayManager schemasDisplayManager,
List<String> metadatasLocalCodes, SchemaTypesDisplayTransactionBuilder transaction,
OngoingAddMetadatasToSchemasMode mode) {
this.transaction = transaction;
this.schemaType = schemaType;
this.schemasDisplayManager = schemasDisplayManager;
this.metadatasLocalCodes = metadatasLocalCodes;
this.mode = mode;
}
void remove() {
transaction.updateAllSchemas(schemaType.getCode(), new SchemaDisplayAlteration() {
@Override
public SchemaDisplayConfig alter(SchemaDisplayConfig schemaDisplayConfig) {
List<String> list = getList(schemaDisplayConfig);
List<String> metadataCodes = getMetadataCodesFor(schemaDisplayConfig.getSchemaCode());
list.removeAll(metadataCodes);
return withList(schemaDisplayConfig, list);
}
});
}
public SchemaTypesDisplayTransactionBuilder afterMetadata(final String afterMetadata) {
transaction.updateAllSchemas(schemaType.getCode(), new SchemaDisplayAlteration() {
@Override
public SchemaDisplayConfig alter(SchemaDisplayConfig schemaDisplayConfig) {
List<String> list = getList(schemaDisplayConfig);
List<String> metadataCodes = getMetadataCodesFor(schemaDisplayConfig.getSchemaCode());
list.removeAll(metadataCodes);
int index = list.indexOf(schemaDisplayConfig.getSchemaCode() + "_" + afterMetadata);
if (index != -1) {
list.addAll(index + 1, metadataCodes);
} else {
list.addAll(metadataCodes);
}
return withList(schemaDisplayConfig, list);
}
});
return transaction;
}
public SchemaTypesDisplayTransactionBuilder beforeMetadata(final String beforeMetadata) {
return beforeMetadatas(asList(beforeMetadata));
}
public SchemaTypesDisplayTransactionBuilder beforeMetadatas(final List<String> beforeMetadatas) {
transaction.updateAllSchemas(schemaType.getCode(), new SchemaDisplayAlteration() {
@Override
public SchemaDisplayConfig alter(SchemaDisplayConfig schemaDisplayConfig) {
List<String> list = getList(schemaDisplayConfig);
List<String> metadataCodes = getMetadataCodesFor(schemaDisplayConfig.getSchemaCode());
list.removeAll(metadataCodes);
int index = -1;
for (String beforeMetadata : beforeMetadatas) {
int metadataIndex = list.indexOf(schemaDisplayConfig.getSchemaCode() + "_" + beforeMetadata);
if (index == -1) {
index = metadataIndex;
} else if (metadataIndex != -1) {
index = Math.min(index, metadataIndex);
}
}
if (index != -1) {
list.addAll(index, metadataCodes);
} else {
list.addAll(metadataCodes);
}
return withList(schemaDisplayConfig, list);
}
});
return transaction;
}
public SchemaTypesDisplayTransactionBuilder atTheEnd() {
transaction.updateAllSchemas(schemaType.getCode(), new SchemaDisplayAlteration() {
@Override
public SchemaDisplayConfig alter(SchemaDisplayConfig schemaDisplayConfig) {
List<String> list = getList(schemaDisplayConfig);
List<String> metadataCodes = getMetadataCodesFor(schemaDisplayConfig.getSchemaCode());
list.removeAll(metadataCodes);
list.addAll(metadataCodes);
return withList(schemaDisplayConfig, list);
}
});
return transaction;
}
public SchemaTypesDisplayTransactionBuilder atFirstPosition() {
transaction.updateAllSchemas(schemaType.getCode(), new SchemaDisplayAlteration() {
@Override
public SchemaDisplayConfig alter(SchemaDisplayConfig schemaDisplayConfig) {
List<String> list = getList(schemaDisplayConfig);
List<String> metadataCodes = getMetadataCodesFor(schemaDisplayConfig.getSchemaCode());
list.removeAll(metadataCodes);
list.addAll(0, metadataCodes);
return withList(schemaDisplayConfig, list);
}
});
return transaction;
}
private List<String> getMetadataCodesFor(String schemaCode) {
List<String> metadataCodes = new ArrayList<>();
for (String metadataLocalCode : metadatasLocalCodes) {
metadataCodes.add(schemaCode + "_" + metadataLocalCode);
}
return metadataCodes;
}
public void beforeTheHugeCommentMetadata() {
beforeMetadata("comments");
}
public List<String> getList(SchemaDisplayConfig schemaDisplayConfig) {
switch (mode) {
case FORM:
return new ArrayList<>(schemaDisplayConfig.getFormMetadataCodes());
case DISPLAY:
return new ArrayList<>(schemaDisplayConfig.getDisplayMetadataCodes());
case SEARCH:
return new ArrayList<>(schemaDisplayConfig.getSearchResultsMetadataCodes());
case TABLE:
return new ArrayList<>(schemaDisplayConfig.getTableMetadataCodes());
}
return null;
}
public SchemaDisplayConfig withList(SchemaDisplayConfig schemaDisplayConfig, List<String> newValue) {
switch (mode) {
case FORM:
return schemaDisplayConfig.withFormMetadataCodes(newValue);
case DISPLAY:
return schemaDisplayConfig.withDisplayMetadataCodes(newValue);
case SEARCH:
return schemaDisplayConfig.withSearchResultsMetadataCodes(newValue);
case TABLE:
return schemaDisplayConfig.withTableMetadataCodes(newValue);
}
return null;
}
}