package com.revolsys.gis.converter.process; import java.util.Collections; import java.util.HashMap; import java.util.Map; import java.util.Map.Entry; import org.springframework.core.convert.converter.Converter; import com.revolsys.record.Record; import com.revolsys.record.code.CodeTable; import com.revolsys.record.schema.RecordDefinition; public class SetCodeTableId extends AbstractSourceToTargetProcess<Record, Record> { private final CodeTable codeTable; private final Map<String, Converter<Record, Object>> codeTableValueConverters = new HashMap<>(); private final String targetFieldName; public SetCodeTableId(final CodeTable codeTable, final String targetFieldName) { this.codeTable = codeTable; this.targetFieldName = targetFieldName; } @Override public void process(final Record source, final Record target) { final Map<String, Object> codeTableValues = new HashMap<>(); for (final Entry<String, Converter<Record, Object>> entry : this.codeTableValueConverters .entrySet()) { String codeTableFieldName = entry.getKey(); final Converter<Record, Object> sourceAttributeConverter = entry.getValue(); Object sourceValue = sourceAttributeConverter.convert(source); if (sourceValue != null) { final RecordDefinition targetRecordDefinition = target.getRecordDefinition(); String codeTableValueName = null; final int dotIndex = codeTableFieldName.indexOf("."); if (dotIndex != -1) { codeTableValueName = codeTableFieldName.substring(dotIndex + 1); codeTableFieldName = codeTableFieldName.substring(0, dotIndex); } final CodeTable targetCodeTable = targetRecordDefinition .getCodeTableByFieldName(codeTableFieldName); if (targetCodeTable != null) { if (codeTableValueName == null) { sourceValue = targetCodeTable.getIdentifier(sourceValue); } else { sourceValue = targetCodeTable .getIdentifier(Collections.singletonMap(codeTableValueName, sourceValue)); } } } codeTableValues.put(codeTableFieldName, sourceValue); } final Object codeId = this.codeTable.getIdentifier(codeTableValues); target.setValue(this.targetFieldName, codeId); } public void setValueMapping(final String codeTableAttribute, final Converter<Record, Object> valueConverter) { this.codeTableValueConverters.put(codeTableAttribute, valueConverter); } @Override public String toString() { return "setCodeTableId" + this.codeTableValueConverters; } }