/** * This file is part of PaxmlCore. * * PaxmlCore is free software: you can redistribute it and/or modify * it under the terms of the GNU Affero General Public License as published by * the Free Software Foundation, either version 3 of the License, or * (at your option) any later version. * * PaxmlCore is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU Affero General Public License for more details. * * You should have received a copy of the GNU Affero General Public License * along with PaxmlCore. If not, see <http://www.gnu.org/licenses/>. */ package org.paxml.table; import java.util.AbstractMap; import java.util.ArrayList; import java.util.Iterator; import java.util.LinkedHashSet; import java.util.List; import java.util.Map; import java.util.Set; import org.paxml.util.RangedIterator; public abstract class AbstractRow<T extends ITable> extends AbstractMap<String, Object> implements IRow { private T table; @Override public Object getCellValue(String name) { ICell cell = getCell(name); return cell == null ? null : cell.getValue(); } @Override public Object getCellValue(int index) { ICell cell = getCell(index); return cell == null ? null : cell.getValue(); } @Override public Object put(String key, Object value) { IColumn col = table.getColumn(key); if (col == null) { col = table.addColumn(key); } int index = col.getIndex(); Object existing = getCellValue(index); setCellValue(index, value); return existing; } @Override public Set<Map.Entry<String, Object>> entrySet() { Set<Map.Entry<String, Object>> set = new LinkedHashSet<Map.Entry<String, Object>>(); for (final IColumn col : table.getColumns()) { set.add(new Map.Entry<String, Object>() { @Override public String getKey() { return col.getName(); } @Override public Object getValue() { return getCellValue(col.getIndex()); } @Override public Object setValue(Object value) { Object existing = getValue(); setCellValue(col.getIndex(), value); return existing; } }); } return set; } @Override public Iterator<ICell> iterator() { return getCells(); } @Override public ICell getCell(String name) { return getCell(table.getColumn(name).getIndex()); } @Override public void setCellValue(String name, Object value) { setCellValue(table.getColumn(name).getIndex(), value); } @Override public void setCellValues(Map<String, Object> values) { for (Map.Entry<String, Object> entry : values.entrySet()) { setCellValue(entry.getKey(), entry.getValue()); } } @Override public void setCellValues(int from, int to, Iterator<Object> values) { int now = from; while ((to < 0 || now <= to) && values.hasNext()) { Object v = values.next(); setCellValue(now++, v); } } abstract protected Iterator<ICell> getAllCells(); @Override public Iterator<ICell> getCells() { ITableRange range = getTable().getRange(); if (range == null) { return getAllCells(); } else { return new RangedIterator(range.getFirstColumn(), range.getLastColumn(), getAllCells()); } } @Override public T getTable() { return table; } public void setTable(T table) { this.table = table; } @Override public List<CellDiff> compare(List<IColumn> myColumns, IRow against, List<IColumn> theirColumns, ICellComparator comp) { if (myColumns == null) { myColumns = getTable().getColumns(); } if (theirColumns == null) { theirColumns = against.getTable().getColumns(); } if (comp == null) { comp = new DefaultCellComparator(); } List<CellDiff> diffs = new ArrayList<CellDiff>(0); final int overlappedCols = Math.min(myColumns.size(), theirColumns.size()); for (int i = 0; i < overlappedCols; i++) { ICell left = getCell(i); ICell right = against.getCell(i); CellDiffType d = comp.compare(left, right); if (d != null) { CellDiff cd = new CellDiff(); IColumn cLeft = myColumns.get(i); IColumn cRight = theirColumns.get(i); cd.setLeftColumnIndex(cLeft.getIndex()); cd.setLeftColumnName(cLeft.getName()); cd.setLeftValue(left == null ? null : left.getValue()); cd.setRightColumnIndex(cRight.getIndex()); cd.setRightColumnName(cRight.getName()); cd.setRightValue(right == null ? null : right.getValue()); cd.setType(d); diffs.add(cd); } } return diffs.isEmpty() ? null : diffs; } }