/**
* Copyright (C) 2013 - present by OpenGamma Inc. and the OpenGamma group of companies
*
* Please see distribution for license.
*/
package com.opengamma.integration.viewer.status.impl;
import java.util.List;
import java.util.Map;
import java.util.Set;
import com.google.common.collect.ImmutableMap;
import com.google.common.collect.ImmutableSet;
import com.google.common.collect.Iterables;
import com.google.common.collect.Lists;
import com.google.common.collect.Sets;
import com.opengamma.integration.viewer.status.ViewStatus;
import com.opengamma.integration.viewer.status.ViewStatusKey;
import com.opengamma.integration.viewer.status.ViewStatusModel;
import com.opengamma.util.ArgumentChecker;
/**
* Simple implementation of {@link ViewStatusModel}
*/
public class SimpleViewStatusModel implements ViewStatusModel {
/**
* Column headers
*/
private final List<List<String>> _columnHeaders;
/**
* The rows
*/
private final List<List<Object>> _rows;
/**
* The unaggregated result.
*/
private final Map<ViewStatusKey, ViewStatus> _viewStatusResult;
public SimpleViewStatusModel(List<List<String>> columnHeaders, List<List<Object>> rows, Map<ViewStatusKey, ViewStatus> viewStatusResult) {
ArgumentChecker.notNull(columnHeaders, "columnHeaders");
ArgumentChecker.notNull(rows, "rows");
ArgumentChecker.notNull(viewStatusResult, "viewStatusResult");
_columnHeaders = deepCopyHeaders(columnHeaders);
_rows = deepCopyRows(rows);
_viewStatusResult = ImmutableMap.copyOf(viewStatusResult);
}
private List<List<Object>> deepCopyRows(List<List<Object>> rows) {
List<List<Object>> result = Lists.newArrayListWithCapacity(rows.size());
for (List<Object> row : rows) {
result.add(Lists.newArrayList(row));
}
return result;
}
private List<List<String>> deepCopyHeaders(final List<List<String>> columnHeaders) {
List<List<String>> headers = Lists.newArrayListWithCapacity(columnHeaders.size());
for (List<String> headings : columnHeaders) {
headers.add(Lists.newArrayList(headings));
}
return headers;
}
@Override
public ViewStatus getStatus(ViewStatusKey entry) {
return _viewStatusResult.get(entry);
}
@Override
public Set<ViewStatusKey> keySet() {
return ImmutableSet.copyOf(_viewStatusResult.keySet());
}
@Override
public Set<String> getValueRequirementNames() {
Set<String> result = Sets.newHashSetWithExpectedSize(_viewStatusResult.size());
for (ViewStatusKey key : _viewStatusResult.keySet()) {
result.add(key.getValueRequirementName());
}
return result;
}
@Override
public Set<String> getCurrencies() {
Set<String> result = Sets.newHashSetWithExpectedSize(_viewStatusResult.size());
for (ViewStatusKey key : _viewStatusResult.keySet()) {
result.add(key.getCurrency());
}
return result;
}
@Override
public Set<String> getComputationTargetTypes() {
Set<String> result = Sets.newHashSetWithExpectedSize(_viewStatusResult.size());
for (ViewStatusKey key : _viewStatusResult.keySet()) {
result.add(key.getTargetType());
}
return result;
}
@Override
public Set<String> getSecurityTypes() {
Set<String> result = Sets.newHashSetWithExpectedSize(_viewStatusResult.size());
for (ViewStatusKey key : _viewStatusResult.keySet()) {
result.add(key.getSecurityType());
}
return result;
}
@Override
public int getRowCount() {
return _rows.size();
}
@Override
public int getColumnCount() {
return Iterables.getFirst(_columnHeaders, Lists.newArrayList()).size();
}
@Override
public Object getRowValueAt(int rowIndex, int columnIndex) {
if (rowIndex < 0 || rowIndex >= _rows.size()) {
throw new IllegalArgumentException("RowIndex must be in range 0 >= rowIndex < " + _rows.size());
}
if (columnIndex < 0 || columnIndex >= getColumnCount()) {
throw new IllegalArgumentException("ColumnIndex must be in range 0 >= columnIndex < " + getColumnCount());
}
return Iterables.get(Iterables.get(_rows, rowIndex), columnIndex);
}
@Override
public int getHeaderRowCount() {
return _columnHeaders.size();
}
@Override
public String getColumnNameAt(int rowIndex, int columnIndex) {
if (rowIndex < 0 || rowIndex >= _columnHeaders.size()) {
throw new IllegalArgumentException("RowIndex must be in range 0 >= rowIndex < " + _columnHeaders.size());
}
if (columnIndex < 0 || columnIndex >= getColumnCount()) {
throw new IllegalArgumentException("ColumnIndex must be in range 0 >= columnIndex < " + getColumnCount());
}
return Iterables.get(Iterables.get(_columnHeaders, rowIndex), columnIndex);
}
}