/*******************************************************************************
*
* Copyright 2010 Alexandru Craciun, and individual contributors as indicated
* by the @authors tag.
*
* This is free software; you can redistribute it and/or modify it
* under the terms of the GNU Lesser General Public License as
* published by the Free Software Foundation; either version 3 of
* the License, or (at your option) any later version.
*
* This software 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 software; if not, write to the Free
* Software Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA
* 02110-1301 USA, or see the FSF site: http://www.fsf.org.
******************************************************************************/
package org.netxilia.api.impl.format;
import java.util.ArrayList;
import java.util.Collection;
import java.util.Collections;
import java.util.Iterator;
import java.util.List;
import org.netxilia.api.INetxiliaSystem;
import org.netxilia.api.display.Style;
import org.netxilia.api.display.StyleAttribute;
import org.netxilia.api.display.StyleDefinition;
import org.netxilia.api.display.StyleGroup;
import org.netxilia.api.model.AbsoluteAlias;
import org.netxilia.api.model.CellData;
import org.netxilia.api.model.ISheet;
import org.netxilia.api.model.WorkbookId;
import org.netxilia.api.reference.AreaReference;
import org.netxilia.api.utils.Matrix;
import org.netxilia.api.value.IGenericValue;
import org.netxilia.api.value.NamedValue;
import org.springframework.beans.factory.annotation.Autowired;
/**
* This formatter provides the values for cell formatters using a set of cells for name and another one for values. The
* content is dynamic, i.e. it takes the last status of the sheet. The pattern's format is: <br>
*
*
* [name]:[workbook];[area ref name];[area ref values]
*
* @author <a href='mailto:ax.craciun@gmail.com'>Alexandru Craciun</a>
*
*/
public class SheetValueListFormatter extends AbstractValueListFormatter {
private static final long serialVersionUID = 1L;
private static final String ATT_WORKBOOK = "workbook";
private static final String ATT_NAME_REF = "name-ref";
private static final String ATT_VALUE_REF = "value-ref";
private AreaReference nameReference;
private AreaReference valueReference;
private AbsoluteAlias nameAlias;
private AbsoluteAlias valueAlias;
private WorkbookId workbook;
@Autowired
private INetxiliaSystem workbookProcessor;
public SheetValueListFormatter(StyleDefinition definition) {
super(definition);
workbook = new WorkbookId(definition.getAttribute(ATT_WORKBOOK));
// the references can be either an AreaReference or an AbsoluteAlias
String nameRef = definition.getAttribute(ATT_NAME_REF);
if (nameRef.contains(":")) {
nameReference = new AreaReference(nameRef);
} else {
nameAlias = new AbsoluteAlias(nameRef);
}
String valueRef = definition.getAttribute(ATT_VALUE_REF);
if (valueRef.contains(":")) {
valueReference = new AreaReference(valueRef);
} else {
valueAlias = new AbsoluteAlias(valueRef);
}
}
public WorkbookId getWorkbook() {
return workbook;
}
public INetxiliaSystem getWorkbookProcessor() {
return workbookProcessor;
}
public void setWorkbookProcessor(INetxiliaSystem workbookProcessor) {
this.workbookProcessor = workbookProcessor;
}
public static StyleDefinition buildDefinition(Style id, StyleGroup group, String name, String description,
WorkbookId workbook, AreaReference nameReference, AreaReference valueReference) {
Collection<StyleAttribute> atts = new ArrayList<StyleAttribute>();
atts.add(new StyleAttribute(ATT_WORKBOOK, workbook.getKey()));
atts.add(new StyleAttribute(ATT_NAME_REF, nameReference.toString()));
atts.add(new StyleAttribute(ATT_VALUE_REF, valueReference.toString()));
atts.add(new StyleAttribute(StyleAttribute.EDITOR, "select"));
// XXX: this pattern type should correspond to what is in the spring file
atts.add(new StyleAttribute(StyleAttribute.PATTERN_TYPE, "values"));
return new StyleDefinition(id, group, name, description, atts);
}
public static StyleDefinition buildDefinition(Style id, StyleGroup group, String name, String description,
WorkbookId workbook, AbsoluteAlias nameReference, AbsoluteAlias valueReference) {
Collection<StyleAttribute> atts = new ArrayList<StyleAttribute>();
atts.add(new StyleAttribute(ATT_WORKBOOK, workbook.getKey()));
atts.add(new StyleAttribute(ATT_NAME_REF, nameReference.toString()));
atts.add(new StyleAttribute(ATT_VALUE_REF, valueReference.toString()));
atts.add(new StyleAttribute(StyleAttribute.EDITOR, "select"));
// XXX: this pattern type should correspond to what is in the spring file
atts.add(new StyleAttribute(StyleAttribute.PATTERN_TYPE, "values"));
return new StyleDefinition(id, group, name, description, atts);
}
@Override
public List<NamedValue> getValues() {
ISheet nameSheet = null;
ISheet valueSheet = null;
try {
nameSheet = workbookProcessor.getWorkbook(workbook).getSheet(
nameReference != null ? nameReference.getSheetName() : nameAlias.getSheetName());
AreaReference resolvedNameReference = nameReference;
if (nameAlias != null) {
resolvedNameReference = nameSheet.receiveSheet().getNonBlocking().resolveAlias(nameAlias.getAlias());
}
Matrix<CellData> nameCells = nameSheet.receiveCells(resolvedNameReference).getNonBlocking();
Iterator<CellData> nameIterator = nameCells.iterator();
valueSheet = workbookProcessor.getWorkbook(workbook).getSheet(
valueReference != null ? valueReference.getSheetName() : valueAlias.getSheetName());
AreaReference resolvedValueReference = valueReference;
if (valueAlias != null) {
resolvedValueReference = valueSheet.receiveSheet().getNonBlocking().resolveAlias(valueAlias.getAlias());
}
Matrix<CellData> valueCells = valueSheet.receiveCells(resolvedValueReference).getNonBlocking();
Iterator<CellData> valueIterator = valueCells.iterator();
List<NamedValue> values = new ArrayList<NamedValue>();
while (nameIterator.hasNext()) {
IGenericValue nameCell = nameIterator.next().getValue();
IGenericValue valueCell = valueIterator.hasNext() ? valueIterator.next().getValue() : null;
if (nameCell != null) {
values.add(new NamedValue(nameCell.getStringValue(), valueCell != null ? valueCell.getStringValue()
: ""));
}
}
return values;
} catch (Exception e) {
return Collections.emptyList();
}
}
}