Package reportgen.factory

Source Code of reportgen.factory.ReportFactory

/*
* 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();
    }
}
TOP

Related Classes of reportgen.factory.ReportFactory

TOP
Copyright © 2018 www.massapi.com. All rights reserved.
All source code are property of their respective owners. Java is a trademark of Sun Microsystems, Inc and owned by ORACLE Inc. Contact coftware#gmail.com.