Package reportgen.math.reference.cross

Source Code of reportgen.math.reference.cross.MathExpressionCrossReportColumnRef

/*
* To change this template, choose Tools | Templates
* and open the template in the editor.
*/
package reportgen.math.reference.cross;

import java.util.Map;
import reportgen.prototype.stream.SQLStream;
import reportgen.utils.ReportException;
import java.util.Set;
import org.jdom.Element;
import reportgen.math.MathExpressionOperand;
import reportgen.prototype.UsedReportableType;
import reportgen.prototype.context.group.ContextGroup;
import reportgen.prototype.context.Context;
import reportgen.ren.executer.QueryExecuterSub;
import reportgen.ren.report.extendedformat.range.cross.CrossReport;
import reportgen.ren.report.extendedformat.range.cross.CrossReportColumn;
import reportgen.utils.Atom;

/**
* Математический элемент - значение из кросс отчета.
* Отличается от значения из подотчета тем, что будет использоваться только
* при расширенном форматировании результатов отчета. при этом будет использоваться
* каждая строка отчета в отдельности. Поэтому вне зависисимости от того,
* сколько строк возвращает кросс-отчет, данные для каждого столбца будут иметь
* скалярный тип.
*
* Будет использоваться в выражении условия выборки по столбцу и строке,
* а также при расчете значения ячейки.
* При этом модель данных используемая при расчете должна содержать не только
* ссылки и значения результатов отчета, но и должна быть контекстно-зависимой
* от текущих столбцов и строк
*
*
* @author axe
*/

public class MathExpressionCrossReportColumnRef extends MathExpressionOperand {

    public static final ContextGroup GROUP = new CrossContextGroup();
    public static final String TAG = "cross-repref";
    private static final String CROSSID = "crossid";

    private CrossReportColumn column;

    public MathExpressionCrossReportColumnRef(CrossReportColumn column, Context context) {
        super(context);
        this.column = column;
    }

    public MathExpressionCrossReportColumnRef(Element element,
            Context context) throws ReportException {
        super(element, context);
        CrossReport crossReport = context.getCrossReport(new Atom(getStringAttribute(element, CROSSID)));

        String columnName  = element.getText();
        int index = crossReport.getSubReport().getColumnIndex(columnName);
        column = new CrossReportColumn(crossReport, index);
    }

    @Override
    protected void toXML(Element root) {
        root.setAttribute(CROSSID, String.valueOf(column.getReport().getAtom()));
        root.addContent(column.getColumnTitle());
    }

    @Override
    public MathExpressionCrossReportColumnRef makeClone() throws ReportException {
        return new MathExpressionCrossReportColumnRef(toXML(), getParentContext());
    }

    @Override
    public ContextGroup getContextGroup() {
        return GROUP;
    }

    @Override
    protected String getRootTag() {
        return TAG;
    }

    public CrossReportColumn getValue() {
        return column;
    }

    public void setValue(CrossReportColumn column) {
        this.column = column;
    }

    @Override
    public Class getCls() throws ReportException {
        return column.getCls();
    }

    @Override
    public Object getValue(Map constants) throws ReportException {
        return constants.get(column);
    }

    @Override
    public void appendToQuery(SQLStream sql, Map model) throws ReportException {
        throw new ReportException("Illegal use of MathExpressionCrossReportColumnRef");
    }

    @Override
    public void buildUsedSet(UsedReportableType cls, Set set) {
        if(cls == UsedReportableType.subreport_column) {
            set.add(this);
        }
    }

    @Override
    public boolean containsMissingVariables() {
        return false;
    }


    @Override
    public boolean isContain(Object entity) {
        if (column.getReport().equals(entity)) {
            return true;
        }
        return super.isContain(entity);
    }

    @Override
    public void validate() throws ReportException {
        QueryExecuterSub rep = column.getReport().getSubReport();
        if(rep.isCanBeOmitted() || rep.isOmitted()) {
            throw new ReportException("Подотчет '" +
                    rep.getReportTitle() + "' используемый в качестве кросс-отчета "
                    + "не может быть опциональным.");
        }
    }

    @Override
    public String toString() {
        return column.toString();
    }
}
TOP

Related Classes of reportgen.math.reference.cross.MathExpressionCrossReportColumnRef

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.