/*
* To change this template, choose Tools | Templates
* and open the template in the editor.
*/
package beans.report.selectors.disease;
import beans.report.selectors.baseSelectors.AbstractLineSelector;
import beans.report.selectors.data.DateRange;
import beans.report.selectors.disease.DiseaseTableLineData;
import beans.service.search.SerRenFilter;
import beans.directory.mkb10.entity.Mkb10;
import beans.service.ServiceRender;
import framework.generic.ClipsServerException;
import java.util.ArrayList;
import javax.persistence.EntityManager;
/**
*
* @author finder
* @param <DataLineType>
* @param <DataSetType>
*/
public abstract class DeseaseDataSelector<DataLineType extends DiseaseTableLineData, DataSetType> extends AbstractLineSelector<DiseaseLine, DataLineType, DataSetType> {
protected static final int OFF_RES_MKB = 0;
public DeseaseDataSelector(EntityManager manager, ArrayList<DiseaseLine> lines) {
super(manager, lines);
}
protected Mkb10 getMkbForItem(DataSetType item){
return (Mkb10)((Object[])item)[OFF_RES_MKB];
}
abstract protected boolean isMale(DataSetType itm);
protected abstract void addDataItem(DataSetType ds, DataLineType data);
/*
protected boolean isParentMkbForItem(Object ds, int mkbID){
Mkb10 dsMkb = getMkbForItem(ds);
return isParent(dsMkb, mkbID);
}
*/
protected boolean isIncludedToLine(Mkb10 dsMkb, DiseaseLine line){
for (int id : line.getRoLineItems()) {
if (dsMkb.isParent(id)){
return true;
}
}
return false;
}
protected boolean isExcludedFromLine(Mkb10 dsMkb, DiseaseLine line){
int[] exitems = line.getExcludedItems();
if (exitems != null){
for (int exid: exitems){
if (dsMkb.isParent(exid)){
return true;
}
}
}
return false;
}
protected boolean isValidForLine(DataSetType ds, DiseaseLine line){
Mkb10 dsMkb = getMkbForItem(ds);
if (dsMkb == null){
throw new IllegalStateException();
}
if (isIncludedToLine(dsMkb, line)) {
if (!isExcludedFromLine(dsMkb, line)) {
return true;
}
}
return false;
}
protected Object[] getLineExtraData(DataSetType data){
return (Object[]) data;
}
protected void buildLineData(DiseaseLine line, DataLineType data){
for (DataSetType ds: getDataSet()) {
if (isValidForLine(ds, line)){
if (!filtersPresent() || isAcceptedByFilters(getLineExtraData(ds))){
addDataItem(ds, data);
}
}
}
}
protected String buildMkbString(int[] itemMkbIds) throws ClipsServerException{
boolean first = true;
StringBuffer itemCodes = null;
for (int mkb10id : itemMkbIds) {
Mkb10 mkb10 = findEntity(Mkb10.class, mkb10id);
if (first) {
first = false;
itemCodes = new StringBuffer(mkb10.getCode());
}
else {
itemCodes.append(", ");
itemCodes.append(mkb10.getCode());
}
}
return itemCodes == null? "": itemCodes.toString();
}
protected abstract DataLineType createDataLine();
@Override
protected void buildLineHeader(DataLineType target, DiseaseLine line, int sexLineIdx, int realLineIdx, int part) throws ClipsServerException {
super.buildLineHeader(target, line, sexLineIdx, realLineIdx, part);
if (line.getAlternativeMkbCode() != null) {
target.setMkbCode(line.getAlternativeMkbCode());
}
else {
target.setMkbCode(buildMkbString(line.getItems()));
}
}
@Override
protected DataLineType buildTableLine(DiseaseLine line, int sexLineIdx, int realLineIdx, int part) throws ClipsServerException{
DataLineType target = createDataLine();
buildLineHeader(target, line, sexLineIdx, realLineIdx, part);
buildLineData(line, target);
return target;
}
}