/*
* To change this template, choose Tools | Templates
* and open the template in the editor.
*/
package beans.report.selectors;
import beans.directory.lpu.entity.Lpu;
import beans.report.selectors.baseSelectors.BaseReportLine;
import beans.report.selectors.baseSelectors.TableOfTable;
import beans.report.selectors.baseSelectors.AbstractReportTable;
import beans.report.selectors.data.*;
import beans.report.DiseaseReportMaps;
import beans.report.SelectorIndefiner;
import beans.report.selectors.disease.DiseaseTable;
import beans.report.selectors.baseSelectors.AbstractTablesSelector;
import beans.report.selectors.data.DateRange;
import beans.report.selectors.data.lowLevel.StringQuotedConverter;
import beans.report.selectors.baseSelectors.TableOfTableSelector;
import beans.report.selectors.disease.CombinedDiseaseTable;
import beans.report.selectors.disease.CombinedDiseaseTableSelector;
import beans.report.selectors.disease.DiseaseLine;
import beans.report.selectors.disease.DiseaseTableSellector;
import beans.report.selectors.disease.sicklist.SickListReportTable;
import beans.report.selectors.disease.diagnosis.DiagnosisReportTable;
import beans.report.selectors.disease.filters.FilterOnlyExDispanserAndExtendedMedExam;
import beans.report.selectors.disease.followUp.FollowUpReportTable;
import beans.report.selectors.filters.FilterOnlyCountrySide;
import com.thoughtworks.xstream.XStream;
import com.thoughtworks.xstream.io.xml.JDomReader;
import com.thoughtworks.xstream.io.xml.JDomWriter;
import framework.utils.Converter;
import java.util.ArrayList;
import java.util.Collection;
import java.util.List;
import javax.persistence.EntityManager;
import org.jdom.Element;
/**
*
* @author finder
*/
public class ReportTableFactory {
private static final String ATTRIBUTE_NAME_ID = "type_id";
private static final String REPORT_TABLE_ELEMENT_NAME = "table";
public ReportTableFactory() {
}
private static XStream reportXStream;
public static XStream initXStream(){
synchronized (ReportTableFactory.class){
if (reportXStream == null){
reportXStream = new XStream();
reportXStream.processAnnotations(new Class[] {
// tables
DiseaseTable.class,
DiagnosisReportTable.class,
SickListReportTable.class,
FollowUpReportTable.class,
TableOfTable.class,
CombinedDiseaseTable.class,
// lines
BaseReportLine.class,
DiseaseLine.class,
// filters
FilterOnlyExDispanserAndExtendedMedExam.class,
FilterOnlyCountrySide.class,
});
reportXStream.registerConverter((com.thoughtworks.xstream.converters.Converter)new StringQuotedConverter());
}
}
return reportXStream;
}
public ArrayList<AbstractReportTable<?>> parseXml(Element el){
ArrayList<AbstractReportTable<?>> target = new ArrayList<AbstractReportTable<?>>();
if (el == null) {
return target;
}
@SuppressWarnings("unchecked")
List<Element> els = el.getChildren(REPORT_TABLE_ELEMENT_NAME);
for (Element element : els) {
target.add(fromXml(element));
}
return target;
}
AbstractReportTable fromXml(Element el){
XStream xs = ReportTableFactory.initXStream();
JDomReader reader = new JDomReader(el);
AbstractReportTable target = (AbstractReportTable)xs.unmarshal(reader);
target.afterLoad();
return target;
}
public void toXml(Collection<AbstractReportTable<?>> list, Element target){
for (AbstractReportTable table : list) {
Element cur = toXml(table);
target.addContent(cur);
}
}
Element toXml(AbstractReportTable table){
XStream xs = ReportTableFactory.initXStream();
JDomWriter writer = new JDomWriter();
xs.marshal(table, writer);
Element target = (Element) writer.getTopLevelNodes().get(0);
target = Converter.asXStreamSubElement( target, REPORT_TABLE_ELEMENT_NAME, table.getClass());
target.setAttribute(ATTRIBUTE_NAME_ID, String.valueOf(table.getType().getId()));
return target;
}
public AbstractReportTable createByID(int id){
return createBySelectorIndefiner(DiseaseReportMaps.getSellectorByID(id));
}
public AbstractReportTable createBySelectorIndefiner(SelectorIndefiner indefiner){
switch (indefiner.getId()){
case DiseaseReportMaps.SELECTOR_ID_DISEATED_REPORT:
return new DiagnosisReportTable(indefiner.getId());
case DiseaseReportMaps.SELECTOR_ID_SICKLIST_REPORT:
return new SickListReportTable();
case DiseaseReportMaps.SELECTOR_ID_FOLLUP_REPORT:
return new FollowUpReportTable();
case DiseaseReportMaps.SELECTOR_ID_COMBINED_DISEASE_TABLE:
return new CombinedDiseaseTable();
case DiseaseReportMaps.SELECTOR_ID_TABLE_WITH_SUBTABLE:
return new TableOfTable();
default:
throw new RuntimeException("Неизвестный тип выборщика: " + indefiner.getId());
}
}
public AbstractTablesSelector<?> createTableSelector(EntityManager manager, Lpu lpu, AbstractReportTable table, int tableId, DateRange range){
AbstractTablesSelector selector;
if (table instanceof DiseaseTable){
switch (table.getType().getId()){
case DiseaseReportMaps.SELECTOR_ID_DISEATED_REPORT:
case DiseaseReportMaps.SELECTOR_ID_SICKLIST_REPORT:
case DiseaseReportMaps.SELECTOR_ID_FOLLUP_REPORT:
case DiseaseReportMaps.SELECTOR_ID_FORM_8_TABLE_1001:
selector = new DiseaseTableSellector((DiseaseTable) table, manager, tableId);
break;
case DiseaseReportMaps.SELECTOR_ID_COMBINED_DISEASE_TABLE:
selector = new CombinedDiseaseTableSelector((CombinedDiseaseTable) table, manager, tableId);
break;
default:
throw new RuntimeException("Неизвестный тип таблицы");
}
}
else if (table instanceof TableOfTable){
selector = new TableOfTableSelector((TableOfTable)table, manager, tableId);
}
else{
throw new RuntimeException("Неизвестный тип таблицы");
}
selector.setRange(range);
selector.setLpu(lpu);
return selector;
}
}