/**
* AnalyzerBeans
* Copyright (C) 2014 Neopost - Customer Information Management
*
* This copyrighted material is made available to anyone wishing to use, modify,
* copy, or redistribute it subject to the terms and conditions of the GNU
* Lesser General Public License, as published by the Free Software Foundation.
*
* This program 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 Lesser General Public License
* for more details.
*
* You should have received a copy of the GNU Lesser General Public License
* along with this distribution; if not, write to:
* Free Software Foundation, Inc.
* 51 Franklin Street, Fifth Floor
* Boston, MA 02110-1301 USA
*/
package org.eobjects.analyzer.data;
import java.util.LinkedHashMap;
import java.util.List;
import java.util.Map;
import java.util.Set;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
/**
* Represents a row with transformed values as well as a delegate row (typically
* a {@link MetaModelInputRow} delegate).
*/
public final class TransformedInputRow extends AbstractInputRow {
private static final long serialVersionUID = 1L;
private static final Logger logger = LoggerFactory.getLogger(TransformedInputRow.class);
private final InputRow _delegate;
private final Map<InputColumn<?>, Object> _values;
private final int _rowId;
public TransformedInputRow(InputRow delegate) {
this(delegate, null);
}
public TransformedInputRow(InputRow delegate, Integer rowId) {
if (delegate == null) {
throw new IllegalArgumentException("Delegate cannot be null");
}
_delegate = delegate;
if (rowId == null) {
_rowId = delegate.getId();
} else {
_rowId = rowId;
}
_values = new LinkedHashMap<InputColumn<?>, Object>();
}
@Override
public int getId() {
return _rowId;
}
@Override
public boolean containsInputColumn(InputColumn<?> inputColumn) {
if (inputColumn.isVirtualColumn() && _values.containsKey(inputColumn)) {
return true;
}
return _delegate.containsInputColumn(inputColumn);
}
public void addValue(InputColumn<?> inputColumn, Object value) {
if (inputColumn.isPhysicalColumn()) {
throw new IllegalArgumentException("Cannot add physical column values to transformed InputRow.");
}
_values.put(inputColumn, value);
}
@SuppressWarnings("unchecked")
@Override
public <E> E getValueInternal(InputColumn<E> column) {
if (column.isPhysicalColumn()) {
logger.debug("Column is physical, delegating.");
return _delegate.getValue(column);
}
if (_values.containsKey(column)) {
return (E) _values.get(column);
}
return _delegate.getValue(column);
}
public InputRow getDelegate() {
return _delegate;
}
@Override
public List<InputColumn<?>> getInputColumns() {
List<InputColumn<?>> inputColumns = _delegate.getInputColumns();
inputColumns.addAll(_values.keySet());
return inputColumns;
}
public Set<InputColumn<?>> getTransformedInputColumns() {
return _values.keySet();
}
@Override
public String toString() {
return "TransformedInputRow[values=" + _values + ",delegate=" + _delegate + "]";
}
}