/*
* To change this template, choose Tools | Templates
* and open the template in the editor.
*/
package beans.report.selectors.baseSelectors;
import beans.report.SelectorIndefiner;
import framework.beans.report.ReportBaseConstant;
import framework.generic.ClipsServerException;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.Map;
import javax.persistence.EntityManager;
import net.sf.jasperreports.engine.JRDataSource;
import net.sf.jasperreports.engine.data.JRMapCollectionDataSource;
/**
*
* @param <SELECTOR>
* @author finder
*/
public abstract class AbstractTablesSelector<SELECTOR extends AbstractDataSelector<?>> extends AbstractDataSelector<Map<String, Object>> {
private int tableid;
ArrayList<SELECTOR> selectorCache = new ArrayList<SELECTOR>();
public AbstractTablesSelector(EntityManager manager, int tableid) {
super(manager);
this.tableid = tableid;
}
public int getTableid() {
return tableid;
}
@Override
public void initDataSet() throws ClipsServerException {
// nothing to do
}
public SELECTOR createDataSellector(SelectorIndefiner dataSelectorID, int part) throws ClipsServerException{
switch (dataSelectorID.getId()){
default:
throw new IllegalArgumentException("Неизвестный тип выборщика данных");
}
}
public SELECTOR createDataSellector(int part) throws ClipsServerException{
if (selectorCache.size() > part && selectorCache.get(part) != null) {
return selectorCache.get(part);
}
SELECTOR sel = createDataSellector(getSelectorIndefiner(part), part);
if (isCacheEnabled()){
while (selectorCache.size() <= part) {
selectorCache.add(null);
}
selectorCache.set(part, sel);
}
if (sel != null) {
AbstractReportTable<?> table = getSelectorTable(part);
if (table != null && sel instanceof AbstractSQLSelector<?>) {
((AbstractSQLSelector<?>)sel).setFilterList(table.getFiltersList());
}
sel.setLpu(getLpu());
sel.setRange(getRange());
sel.initDataSet();
}
return sel;
}
abstract public AbstractReportTable<?> getSelectorTable(int part);
public SelectorIndefiner getSelectorIndefiner(int part) {
return getSelectorTable(part).getType();
}
@Override
protected void putTableParams(HashMap<String, Object> map, int part) throws ClipsServerException{
map.put(ReportBaseConstant.SUBREPORT_TABLE_ID, tableid);
map.put(ReportBaseConstant.SUBREPORT_PART_ID, part + 1);
map.put(ReportBaseConstant.SUBREPORT_TABLE_TYPE_ID, getSelectorIndefiner(part).getId());
}
protected ArrayList<Map<String, Object>> addSelectorDataSet(int part, String name, AbstractDataSelector<?> selector, HashMap<String, Object> subreportParams, ArrayList<Map<String, Object>> lines) throws ClipsServerException{
ArrayList<?> data = selector.getDataList(part);
if (lines == null){
lines = new ArrayList<Map<String, Object>>(data.size());
for (int i = 0; i < data.size(); i++){
lines.add(new HashMap<String, Object>(8));
}
}
if (data.size() != lines.size()){
throw new ClipsServerException("Ошибка алгоритма");
}
for (int i = 0; i < lines.size(); i++) {
Map<String, Object> map = lines.get(i);
map.put(name, data.get(i));
}
selector.putTableParams(subreportParams, part);
return lines;
}
protected ArrayList<Map<String, Object>> addSubreportDataSet(int part, HashMap<String, Object> subreportParams) throws ClipsServerException{
AbstractDataSelector<?> selector = createDataSellector(part);
ArrayList<Map<String, Object>> lines = addSelectorDataSet(part, "dt1", selector, subreportParams, null);
return lines;
}
protected HashMap<String, Object> getDataPart(int part) throws ClipsServerException{
HashMap<String, Object> subParams = new HashMap<String, Object>();
ArrayList<Map<String, Object>> lines = addSubreportDataSet(part, subParams);
JRDataSource sourse = new JRMapCollectionDataSource(lines);
HashMap<String, Object> target = new HashMap<String, Object>();
target.put(ReportBaseConstant.SUBREPORT_DATA_ARRAY_NAME, lines);
target.put(ReportBaseConstant.SUBREPORT_DATASOURCE_NAME, sourse);
target.put(ReportBaseConstant.SUBREPORT_PARAMETER_NAME, subParams);
putTableParams(target, part);
return target;
}
@Override
public ArrayList<Map<String, Object>> getDataList(int part) throws ClipsServerException {
ArrayList<Map<String, Object>> mainData = new ArrayList<Map<String, Object>>();
for (int i = 0; i < getTableCount(); i++){
Map<String, Object> newItem = getDataPart(i);
if (newItem == null) {
break;
}
mainData.add(newItem);
}
return mainData;
}
public void dispose(){
selectorCache.clear();
}
boolean isCacheEnabled(){
return true;
}
abstract public int getTableCount();
}