package org.activityinfo.core.shared.importing.model;
import com.google.common.collect.Maps;
import com.google.common.collect.Sets;
import org.activityinfo.model.resource.ResourceId;
import org.activityinfo.model.formTree.FormTree;
import org.activityinfo.core.shared.importing.source.SourceColumn;
import org.activityinfo.core.shared.importing.source.SourceColumnAccessor;
import org.activityinfo.core.shared.importing.source.SourceTable;
import org.activityinfo.core.shared.importing.strategy.ColumnAccessor;
import org.activityinfo.core.shared.importing.strategy.TargetSiteId;
import org.activityinfo.core.shared.importing.validation.ValidatedRowTable;
import java.util.Map;
/**
* A model which defines the mapping from an {@code SourceTable}
* to a FormClass
*/
public class ImportModel {
private SourceTable source;
private FormTree formTree;
private ValidatedRowTable validatedRowTable;
private final Map<SourceColumn, ColumnAction> columnActions = Maps.newHashMap();
public ImportModel(FormTree formTree) {
this.formTree = formTree;
}
public void setSource(SourceTable source) {
this.source = source;
this.columnActions.clear();
}
public SourceTable getSource() {
return source;
}
public SourceColumn setColumnBinding(ColumnAction action, SourceColumn sourceColumn) {
SourceColumn removedColumn = null;
for (Map.Entry<SourceColumn, ColumnAction> entry : Sets.newHashSet(columnActions.entrySet())) {
final ColumnAction value = entry.getValue();
if (value != null && value.equals(action) && value != IgnoreAction.INSTANCE) {
removedColumn = entry.getKey();
columnActions.remove(removedColumn);
}
}
columnActions.put(sourceColumn, action);
return removedColumn;
}
public FormTree getFormTree() {
return formTree;
}
public SourceColumn getSourceColumn(int columnIndex) {
return source.getColumns().get(columnIndex);
}
public Map<SourceColumn, ColumnAction> getColumnActions() {
return columnActions;
}
public Map<TargetSiteId, ColumnAccessor> getMappedColumns(ResourceId fieldId) {
Map<TargetSiteId, ColumnAccessor> mappings = Maps.newHashMap();
for (Map.Entry<SourceColumn, MapExistingAction> entry : getMapExistingActions(fieldId).entrySet()) {
TargetSiteId site = entry.getValue().getTarget().getSite();
ColumnAccessor column = new SourceColumnAccessor(entry.getKey());
mappings.put(site, column);
}
return mappings;
}
public Map<SourceColumn, MapExistingAction> getMapExistingActions(ResourceId fieldId) {
Map<SourceColumn, MapExistingAction> existingActions = Maps.newHashMap();
for (Map.Entry<SourceColumn, ColumnAction> entry : columnActions.entrySet()) {
if (entry.getValue() instanceof MapExistingAction) {
MapExistingAction action = (MapExistingAction) entry.getValue();
if (action.getTarget().getFormField().getId().equals(fieldId)) {
existingActions.put(entry.getKey(), action);
}
}
}
return existingActions;
}
public void setColumnAction(int columnIndex, ColumnAction target) {
columnActions.put(source.getColumns().get(columnIndex), target);
}
public ColumnAction getColumnAction(SourceColumn column) {
return columnActions.get(column);
}
public ValidatedRowTable getValidatedRowTable() {
return validatedRowTable;
}
public void setValidatedRowTable(ValidatedRowTable validatedRowTable) {
this.validatedRowTable = validatedRowTable;
}
}