package com.constellio.model.services.batch.actions;
import static com.constellio.model.services.records.RecordUtils.changeSchemaTypeAccordingToTypeLinkedSchema;
import java.util.List;
import java.util.Map;
import java.util.Map.Entry;
import com.constellio.model.entities.batchprocess.BatchProcessAction;
import com.constellio.model.entities.records.Record;
import com.constellio.model.entities.records.Transaction;
import com.constellio.model.entities.schemas.Metadata;
import com.constellio.model.entities.schemas.MetadataSchemaTypes;
import com.constellio.model.services.records.RecordProvider;
import com.constellio.model.services.schemas.SchemaUtils;
public class ChangeValueOfMetadataBatchProcessAction implements BatchProcessAction {
final Map<String, Object> metadataChangedValues;
public ChangeValueOfMetadataBatchProcessAction(Map<String, Object> metadataChangedValues) {
this.metadataChangedValues = metadataChangedValues;
}
@Override
public Transaction execute(List<Record> batch, MetadataSchemaTypes schemaTypes, RecordProvider recordProvider) {
SchemaUtils utils = new SchemaUtils();
Transaction transaction = new Transaction().setSkippingRequiredValuesValidation(true);
for (Record record : batch) {
String schemaCode = record.getSchemaCode();
for (Entry<String, Object> entry : metadataChangedValues.entrySet()) {
String metadataCode = entry.getKey();
if (metadataCode.startsWith(utils.getSchemaTypeCode(schemaCode))) {
if (!metadataCode.startsWith(schemaCode + "_")) {
metadataCode = schemaCode + "_" + utils.getLocalCodeFromMetadataCode(metadataCode);
}
Metadata metadata = schemaTypes.getMetadata(metadataCode);
record.set(metadata, entry.getValue());
if (schemaTypes.isRecordTypeMetadata(metadata)) {
changeSchemaTypeAccordingToTypeLinkedSchema(record, schemaTypes, recordProvider, metadata);
}
}
}
}
transaction.addUpdate(batch);
return transaction;
}
@Override
public Object[] getInstanceParameters() {
return new Object[] { metadataChangedValues };
}
}