package com.zendesk.maxwell.schema; import java.util.*; import com.zendesk.maxwell.schema.columndef.ColumnDef; public class TableColumnList implements Iterable<ColumnDef> { private final List<ColumnDef> columns; private HashMap<String, Integer> columnOffsetMap; public TableColumnList(List<ColumnDef> columns) { this.columns = columns; initColumnOffsetMap(); renumberColumns(); } public Iterator<ColumnDef> iterator() { return columns.iterator(); } public List<ColumnDef> getList() { return columns; } public synchronized int indexOf(String name) { String lcName = name.toLowerCase(); if ( this.columnOffsetMap.containsKey(lcName) ) { return this.columnOffsetMap.get(lcName); } else { return -1; } } public ColumnDef findByName(String name) { int index = indexOf(name); if ( index == -1 ) return null; else return columns.get(index); } public synchronized void add(int index, ColumnDef definition) { columns.add(index, definition); initColumnOffsetMap(); renumberColumns(); } public synchronized ColumnDef remove(int index) { ColumnDef c = columns.remove(index); initColumnOffsetMap(); renumberColumns(); return c; } public synchronized ColumnDef get(int index) { return columns.get(index); } public int size() { return columns.size(); } private void initColumnOffsetMap() { this.columnOffsetMap = new HashMap<>(); int i = 0; for(ColumnDef c : columns) { this.columnOffsetMap.put(c.getName().toLowerCase(), i++); } } private void renumberColumns() { int i = 0 ; for ( ColumnDef c : columns ) { c.setPos(i++); } } }