/*
* To change this template, choose Tools | Templates
* and open the template in the editor.
*/
package reportgen.factory;
import reportgen.factory.patch.ReportPatch;
import reportgen.utils.ReportException;
import java.io.StringReader;
import org.jdom.Document;
import org.jdom.Element;
import org.jdom.input.SAXBuilder;
import reportgen.ren.loader.SubQueryLoader;
import reportgen.ren.report.ReportQuery;
/**
*
* @author axe
*/
public class ReportFactory {
private final static ReportVersion supported[] = new ReportVersion[]{
new ReportVersion(2,6,0),
new ReportVersion254_260(),
new ReportVersion253_254(),
new ReportVersion252_253(),
new ReportVersion251_252(),
new ReportVersion250_251(),
new ReportVersion240_250(),
};
public static ReportVersion getActualVersion() {
return supported[0];
}
public static ReportQuery fromString(int id,
String reportXML, SubQueryLoader subQueryLoader) throws ReportException {
reportXML = patch(reportXML);
ReportVersion version = getVersion(reportXML);
if(!version.isSupported()) {
throw new ReportException("Неподдерживаемая версия отчета: " + version);
}
return new ReportQuery(parseXML(reportXML), subQueryLoader);
}
public static String patch(String reportXML) {
while(true) {
ReportVersion version;
try {
version = new ReportVersion(parseXML(reportXML));
} catch (ReportException ex) {
return reportXML;
}
ReportVersion fit = null;
for(ReportVersion supportedVersion: supported) {
if(supportedVersion.fitTo(version)) {
fit = supportedVersion;
break;
}
}
if(fit == null) {
break;
} else {
ReportPatch patch = fit.getPatch();
if(patch != null) {
reportXML = patch.apply(reportXML);
} else {
break;
}
}
}
return reportXML;
}
public static ReportVersion getVersion(String reportXML) throws ReportException {
ReportVersion version = new ReportVersion(parseXML(reportXML));
for(ReportVersion supportedVersion: supported) {
if(supportedVersion.fitTo(version)) {
return supportedVersion;
}
}
return version;
}
private static Element parseXML(String reportXML) throws ReportException {
Document doc = null;
try {
doc = new SAXBuilder().build(new StringReader(reportXML));
} catch (Exception ex) {
System.err.println(reportXML);
throw new ReportException("Ошибка в XML структуре отчета. ", ex);
}
return doc.getRootElement();
}
}