/**
 * Copyright (c) 2011, 2016 - Loetz GmbH&Co.KG (69115 Heidelberg, Germany)
 * 
 * All rights reserved. This program and the accompanying materials
 * are made available under the terms of the Eclipse Public License v1.0
 * which accompanies this distribution, and is available at
 * http://www.eclipse.org/legal/epl-v10.html
 * 
 * Contributors:
 * Christophe Loetz (Loetz GmbH&Co.KG) - initial implementation
 * 
 * 
 *  This copyright notice shows up in the generated Java code
 */
package org.eclipse.osbp.xtext.reportdsl.jvmmodel;

import com.google.common.base.Objects;
import com.google.inject.Inject;
import com.ibm.icu.util.ULocale;
import com.vaadin.data.Container;
import com.vaadin.server.Sizeable;
import com.vaadin.server.StreamResource;
import com.vaadin.ui.AbstractComponent;
import com.vaadin.ui.BrowserFrame;
import com.vaadin.ui.Button;
import com.vaadin.ui.HorizontalLayout;
import java.io.ByteArrayOutputStream;
import java.io.PrintStream;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.HashMap;
import java.util.List;
import java.util.Locale;
import java.util.UUID;
import java.util.function.BiConsumer;
import org.eclipse.birt.report.model.api.ColumnHandle;
import org.eclipse.birt.report.model.api.DesignElementHandle;
import org.eclipse.birt.report.model.api.DimensionHandle;
import org.eclipse.birt.report.model.api.GridHandle;
import org.eclipse.birt.report.model.api.IDesignEngine;
import org.eclipse.birt.report.model.api.OdaDataSetHandle;
import org.eclipse.birt.report.model.api.OdaDataSourceHandle;
import org.eclipse.birt.report.model.api.ReportItemHandle;
import org.eclipse.birt.report.model.api.RowHandle;
import org.eclipse.birt.report.model.api.SessionHandle;
import org.eclipse.birt.report.model.api.SimpleMasterPageHandle;
import org.eclipse.birt.report.model.api.StructureFactory;
import org.eclipse.birt.report.model.api.command.ContentException;
import org.eclipse.birt.report.model.api.command.CustomMsgException;
import org.eclipse.birt.report.model.api.core.IModuleModel;
import org.eclipse.birt.report.model.api.elements.DesignChoiceConstants;
import org.eclipse.birt.report.model.api.elements.structures.CachedMetaData;
import org.eclipse.birt.report.model.api.elements.structures.ComputedColumn;
import org.eclipse.birt.report.model.api.elements.structures.OdaResultSetColumn;
import org.eclipse.birt.report.model.api.metadata.DimensionValue;
import org.eclipse.birt.report.model.core.ContainerSlot;
import org.eclipse.birt.report.model.core.DesignElement;
import org.eclipse.birt.report.model.elements.interfaces.IDataSetModel;
import org.eclipse.birt.report.model.util.CssPropertyConstants;
import org.eclipse.e4.core.di.extensions.EventUtils;
import org.eclipse.e4.core.services.events.IEventBroker;
import org.eclipse.emf.common.util.EList;
import org.eclipse.emf.ecore.EObject;
import org.eclipse.emf.ecore.resource.Resource;
import org.eclipse.osbp.dsl.semantic.common.types.LDataType;
import org.eclipse.osbp.dsl.semantic.common.types.LKeyAndValue;
import org.eclipse.osbp.dsl.semantic.common.types.LPackage;
import org.eclipse.osbp.dsl.semantic.entity.LEntityAttribute;
import org.eclipse.osbp.eventbroker.EventBrokerMsg;
import org.eclipse.osbp.ui.api.datamart.IDataMart;
import org.eclipse.osbp.ui.api.report.IReportProvider;
import org.eclipse.osbp.utils.entityhelper.DataType;
import org.eclipse.osbp.utils.vaadin.ViewLayoutManager;
import org.eclipse.osbp.xtext.action.common.IToolbarAction;
import org.eclipse.osbp.xtext.basic.generator.BasicDslGeneratorUtils;
import org.eclipse.osbp.xtext.datamartdsl.DatamartAttribute;
import org.eclipse.osbp.xtext.datamartdsl.DatamartCube;
import org.eclipse.osbp.xtext.datamartdsl.DatamartDefinition;
import org.eclipse.osbp.xtext.datamartdsl.DatamartEntity;
import org.eclipse.osbp.xtext.datamartdsl.DatamartNavigation;
import org.eclipse.osbp.xtext.datamartdsl.DatamartRole;
import org.eclipse.osbp.xtext.datamartdsl.DatamartSource;
import org.eclipse.osbp.xtext.datamartdsl.DatamartTask;
import org.eclipse.osbp.xtext.datamartdsl.jvmmodel.DatamartDSLJvmModelInferrer;
import org.eclipse.osbp.xtext.datamartdsl.util.DatamartAttributeUtil;
import org.eclipse.osbp.xtext.i18n.DSLOutputConfigurationProvider;
import org.eclipse.osbp.xtext.i18n.I18NKeyGenerator;
import org.eclipse.osbp.xtext.i18n.I18NModelGenerator;
import org.eclipse.osbp.xtext.reportdsl.AutoText;
import org.eclipse.osbp.xtext.reportdsl.AutoTextEnum;
import org.eclipse.osbp.xtext.reportdsl.DatamartTable;
import org.eclipse.osbp.xtext.reportdsl.DatamartTableAttribute;
import org.eclipse.osbp.xtext.reportdsl.DatamartTableGroup;
import org.eclipse.osbp.xtext.reportdsl.Element;
import org.eclipse.osbp.xtext.reportdsl.Grid;
import org.eclipse.osbp.xtext.reportdsl.GridCell;
import org.eclipse.osbp.xtext.reportdsl.GridRow;
import org.eclipse.osbp.xtext.reportdsl.Image;
import org.eclipse.osbp.xtext.reportdsl.Label;
import org.eclipse.osbp.xtext.reportdsl.NonTranslatableText;
import org.eclipse.osbp.xtext.reportdsl.PageDetail;
import org.eclipse.osbp.xtext.reportdsl.PageFooter;
import org.eclipse.osbp.xtext.reportdsl.PageHeader;
import org.eclipse.osbp.xtext.reportdsl.PageTemplate;
import org.eclipse.osbp.xtext.reportdsl.Report;
import org.eclipse.osbp.xtext.reportdsl.ReportDesign;
import org.eclipse.osbp.xtext.reportdsl.ReportDesignTemplate;
import org.eclipse.osbp.xtext.reportdsl.ReportModel;
import org.eclipse.osbp.xtext.reportdsl.ReportPackage;
import org.eclipse.osbp.xtext.reportdsl.StringBinder;
import org.eclipse.osbp.xtext.reportdsl.Style;
import org.eclipse.osbp.xtext.reportdsl.SubSubTitle;
import org.eclipse.osbp.xtext.reportdsl.SubTitle;
import org.eclipse.osbp.xtext.reportdsl.TableAttribute;
import org.eclipse.osbp.xtext.reportdsl.TableValueElement;
import org.eclipse.osbp.xtext.reportdsl.Text;
import org.eclipse.osbp.xtext.reportdsl.Title;
import org.eclipse.osbp.xtext.reportdsl.UnitEnum;
import org.eclipse.osbp.xtext.reportdsl.common.BaseReport;
import org.eclipse.osbp.xtext.reportdsl.common.BirtEngine;
import org.eclipse.osbp.xtext.reportdsl.common.DataTypes;
import org.eclipse.osbp.xtext.reportdsl.common.OdaConnProperties;
import org.eclipse.osbp.xtext.reportdsl.common.attribute.Attribute;
import org.eclipse.osbp.xtext.reportdsl.common.attribute.Width;
import org.eclipse.osbp.xtext.reportdsl.common.item.BaseItem;
import org.eclipse.osbp.xtext.reportdsl.common.item.BodyItem;
import org.eclipse.osbp.xtext.reportdsl.common.item.ContainerItem;
import org.eclipse.osbp.xtext.reportdsl.common.item.DataUtils;
import org.eclipse.osbp.xtext.reportdsl.common.item.GridItem;
import org.eclipse.osbp.xtext.reportdsl.common.item.ImageItem;
import org.eclipse.osbp.xtext.reportdsl.common.item.PageFooterItem;
import org.eclipse.osbp.xtext.reportdsl.common.item.PageHeaderItem;
import org.eclipse.osbp.xtext.reportdsl.jvmmodel.ReportGeneratorWorkSet;
import org.eclipse.osbp.xtext.reportdsl.jvmmodel.Utilities;
import org.eclipse.xtend2.lib.StringConcatenation;
import org.eclipse.xtext.common.types.JvmDeclaredType;
import org.eclipse.xtext.generator.IFileSystemAccess;
import org.eclipse.xtext.naming.IQualifiedNameProvider;
import org.eclipse.xtext.naming.QualifiedName;
import org.eclipse.xtext.xbase.compiler.GeneratorConfig;
import org.eclipse.xtext.xbase.compiler.ImportManager;
import org.eclipse.xtext.xbase.compiler.output.TreeAppendable;
import org.eclipse.xtext.xbase.lib.CollectionLiterals;
import org.eclipse.xtext.xbase.lib.Conversions;
import org.eclipse.xtext.xbase.lib.Exceptions;
import org.eclipse.xtext.xbase.lib.Extension;
import org.eclipse.xtext.xbase.lib.IterableExtensions;
import org.eclipse.xtext.xbase.lib.IteratorExtensions;
import org.eclipse.xtext.xbase.lib.Procedures.Procedure1;
import org.osgi.service.event.Event;
import org.osgi.service.event.EventHandler;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;

@SuppressWarnings("all")
public class ReportModelGenerator extends I18NModelGenerator {
  @Inject
  @Extension
  private IQualifiedNameProvider _iQualifiedNameProvider;
  
  @Inject
  @Extension
  private DatamartDSLJvmModelInferrer datamartInferrer;
  
  @Inject
  @Extension
  private BasicDslGeneratorUtils _basicDslGeneratorUtils;
  
  @Inject
  @Extension
  private DataType dtType;
  
  private final static Logger LOGGER = LoggerFactory.getLogger(ReportModelGenerator.class);
  
  private static Object designEngine = null;
  
  @Override
  public void doGenerate(final Resource input, final IFileSystemAccess fsa) {
    StringConcatenation _builder = new StringConcatenation();
    _builder.append(BaseReport.CAPTION_I18NKEY_SAVE_PDF);
    _builder.append(",");
    _builder.append(BaseReport.CAPTION_I18NKEY_PRINT_PDF);
    this.addTranslatables(_builder.toString());
    super.doGenerate(input, fsa);
  }
  
  protected void _internalDoGenerate(final ReportModel orgModel, final IFileSystemAccess fsa) {
    ReportModelGenerator.designEngine = BirtEngine.createDesignEngine();
    EList<ReportPackage> _pckg = orgModel.getPckg();
    for (final ReportPackage pkg : _pckg) {
      EList<Report> _reports = pkg.getReports();
      for (final Report report : _reports) {
        try {
          this.generateReportFile(pkg, report, fsa);
        } catch (final Throwable _t) {
          if (_t instanceof Exception) {
            final Exception e = (Exception)_t;
            ReportModelGenerator.LOGGER.error("{}", e);
          } else {
            throw Exceptions.sneakyThrow(_t);
          }
        }
      }
    }
  }
  
  private void generateReportFile(final ReportPackage pckg, final Report report, final IFileSystemAccess fsa) {
    ReportDesign _design = report.getDesign();
    if ((_design instanceof ReportDesignTemplate)) {
      this.generateReportRoleFile(pckg, report, null, fsa);
      EList<DatamartRole> _roles = report.getDatamartRef().getRoles();
      for (final DatamartRole role : _roles) {
        this.generateReportRoleFile(pckg, report, role, fsa);
      }
    }
  }
  
  private void generateReportRoleFile(final ReportPackage pckg, final Report report, final DatamartRole role, final IFileSystemAccess fsa) {
    try {
      ReportGeneratorWorkSet workSet = new ReportGeneratorWorkSet();
      workSet.setGenerator(this);
      workSet.setReport(report);
      workSet.setRole(role);
      workSet.setFsa(fsa);
      ReportDesign _design = report.getDesign();
      ReportDesignTemplate template = ((ReportDesignTemplate) _design);
      String pckgName = this._iQualifiedNameProvider.getFullyQualifiedName(pckg).toString();
      String pckgNamePath = pckgName.replaceAll("\\.", "/");
      StringConcatenation _builder = new StringConcatenation();
      String _name = report.getName();
      _builder.append(_name);
      {
        if ((role != null)) {
          String _name_1 = role.getAssignedRole().getName();
          _builder.append(_name_1);
        }
      }
      _builder.append(".rptdesign");
      String filename = _builder.toString();
      StringConcatenation _builder_1 = new StringConcatenation();
      _builder_1.append(pckgNamePath);
      _builder_1.append("/");
      _builder_1.append(filename);
      String fullpath = _builder_1.toString();
      SessionHandle session = ((IDesignEngine) ReportModelGenerator.designEngine).newSessionHandle(ULocale.forLocale(Locale.getDefault()));
      workSet.setDesign(session.createDesign());
      workSet.setFactory(workSet.getDesign().getElementFactory());
      workSet.getDesign().setIncludeResource("i18n/I18N");
      workSet.getDesign().setProperty(DesignChoiceConstants.CHOICE_UNITS, report.getDefaultUnit().getLiteral());
      workSet.setRequestedMedia(report.getMedia());
      BodyItem body = new BodyItem(workSet);
      this.addDatamartSourceAndSet(report.getDatamartRef(), workSet, null, null);
      this.generateMasterPage(report.getDatamartRef(), workSet, report.getPageTemplate(), template.getHeader(), template.getFooter());
      this.generateItems(report.getDatamartRef(), workSet, body, ((Element[])Conversions.unwrapArray(template.getDetail().getElements(), Element.class)));
      ByteArrayOutputStream baos = new ByteArrayOutputStream();
      try {
        workSet.getDesign().getModule().prepareToSave();
        workSet.getDesign().getModule().getWriter().write(baos);
        workSet.getDesign().getModule().onSave();
      } catch (final Throwable _t) {
        if (_t instanceof Exception) {
          final Exception e = (Exception)_t;
          ByteArrayOutputStream _byteArrayOutputStream = new ByteArrayOutputStream();
          baos = _byteArrayOutputStream;
          PrintStream _printStream = new PrintStream(baos);
          e.printStackTrace(_printStream);
        } else {
          throw Exceptions.sneakyThrow(_t);
        }
      }
      fsa.generateFile(fullpath, DSLOutputConfigurationProvider.DEFAULT_REPORT_OUTPUT, baos.toString());
    } catch (Throwable _e) {
      throw Exceptions.sneakyThrow(_e);
    }
  }
  
  private void generateMasterPage(final DatamartDefinition datamart, final ReportGeneratorWorkSet workSet, final PageTemplate pageTemplate, final PageHeader pageHeader, final PageFooter pageFooter) {
    try {
      PageHeader header = pageHeader;
      PageFooter footer = pageFooter;
      if ((header == null)) {
        header = pageTemplate.getHeader();
      }
      if ((footer == null)) {
        footer = pageTemplate.getFooter();
      }
      SimpleMasterPageHandle masterPage = workSet.getFactory().newSimpleMasterPage(pageTemplate.getName());
      masterPage.setPageType(pageTemplate.getSize().name().toLowerCase());
      masterPage.setOrientation(pageTemplate.getOrientation().name().toLowerCase());
      DimensionHandle _leftMargin = masterPage.getLeftMargin();
      double _leftMarginValue = pageTemplate.getLeftMarginValue();
      String _literal = workSet.getReport().getDefaultUnit().getLiteral();
      DimensionValue _dimensionValue = new DimensionValue(_leftMarginValue, _literal);
      _leftMargin.setValue(_dimensionValue);
      DimensionHandle _topMargin = masterPage.getTopMargin();
      double _topMarginValue = pageTemplate.getTopMarginValue();
      String _literal_1 = workSet.getReport().getDefaultUnit().getLiteral();
      DimensionValue _dimensionValue_1 = new DimensionValue(_topMarginValue, _literal_1);
      _topMargin.setValue(_dimensionValue_1);
      DimensionHandle _bottomMargin = masterPage.getBottomMargin();
      double _bottomMarginValue = pageTemplate.getBottomMarginValue();
      String _literal_2 = workSet.getReport().getDefaultUnit().getLiteral();
      DimensionValue _dimensionValue_2 = new DimensionValue(_bottomMarginValue, _literal_2);
      _bottomMargin.setValue(_dimensionValue_2);
      DimensionHandle _rightMargin = masterPage.getRightMargin();
      double _rightMarginValue = pageTemplate.getRightMarginValue();
      String _literal_3 = workSet.getReport().getDefaultUnit().getLiteral();
      DimensionValue _dimensionValue_3 = new DimensionValue(_rightMarginValue, _literal_3);
      _rightMargin.setValue(_dimensionValue_3);
      if ((header != null)) {
        masterPage.setShowHeaderOnFirst(header.isShowOnFirst());
        DimensionHandle _headerHeight = masterPage.getHeaderHeight();
        double _heightValue = header.getHeightValue();
        String _literal_4 = workSet.getReport().getDefaultUnit().getLiteral();
        DimensionValue _dimensionValue_4 = new DimensionValue(_heightValue, _literal_4);
        _headerHeight.setValue(_dimensionValue_4);
        PageHeaderItem _pageHeaderItem = new PageHeaderItem(workSet, masterPage);
        this.generateItems(datamart, workSet, _pageHeaderItem, ((Element[])Conversions.unwrapArray(header.getElements(), Element.class)));
      }
      if ((footer != null)) {
        masterPage.setShowFooterOnLast(footer.isShowOnLast());
        DimensionHandle _footerHeight = masterPage.getFooterHeight();
        double _heightValue_1 = footer.getHeightValue();
        String _literal_5 = workSet.getReport().getDefaultUnit().getLiteral();
        DimensionValue _dimensionValue_5 = new DimensionValue(_heightValue_1, _literal_5);
        _footerHeight.setValue(_dimensionValue_5);
        PageFooterItem _pageFooterItem = new PageFooterItem(workSet, masterPage);
        this.generateItems(datamart, workSet, _pageFooterItem, ((Element[])Conversions.unwrapArray(footer.getElements(), Element.class)));
      }
      workSet.getDesign().getMasterPages().add(masterPage);
    } catch (Throwable _e) {
      throw Exceptions.sneakyThrow(_e);
    }
  }
  
  private void addDatamartSourceAndSet(final DatamartDefinition datamart, final ReportGeneratorWorkSet workSet, final String alias, final DatamartAttribute[] hiddens) {
    try {
      String dataSourceName = Utilities.getDataSourceName(alias, datamart).toString();
      ContainerSlot slot = workSet.getDesign().getModule().getSlot(IModuleModel.DATA_SOURCE_SLOT);
      boolean createDataSource = true;
      List<DesignElement> _contents = slot.getContents();
      for (final DesignElement slotElem : _contents) {
        boolean _equals = dataSourceName.equals(slotElem.getName());
        if (_equals) {
          createDataSource = false;
        }
      }
      if (createDataSource) {
        OdaDataSourceHandle odsourceh = workSet.getFactory().newOdaDataSource(dataSourceName, BaseReport.DATASOURCE_EXTENSION_ID);
        odsourceh.getElement().setID(workSet.getDesign().getModule().getNextID());
        workSet.getDesign().getModule().addElementID(odsourceh.getElement());
        workSet.getDesign().getModule().add(odsourceh.getElement(), IModuleModel.DATA_SOURCE_SLOT);
        String dataSetName = Utilities.getDataSetName(alias, datamart).toString();
        OdaDataSetHandle odseth = workSet.getFactory().newOdaDataSet(dataSetName, BaseReport.DATASOURCE_EXTENSION_ID.concat(".dataSet"));
        workSet.getDataSets().put(dataSetName, odseth);
        odseth.getElement().setID(workSet.getDesign().getModule().getNextID());
        odseth.setProperty(OdaConnProperties.DATAMART_BUNDLENAME, Utilities.getBundleName(datamart));
        odseth.setProperty(OdaConnProperties.DATAMART_CLASSNAME, this.getDatamartClassName(alias, datamart));
        odseth.setProperty(OdaConnProperties.DATAMART_DATASOURCE, odsourceh.getElement().getName());
        odseth.setProperty(OdaConnProperties.DATAMART_DATASOURCENAME, dataSourceName);
        odseth.setProperty(OdaConnProperties.DATAMART_DATASETNAME, dataSetName);
        DatamartSource _source = datamart.getSource();
        boolean _matched = false;
        if (_source instanceof DatamartCube) {
          _matched=true;
          this.addDatamartCubeResultSet(workSet, odseth, dataSetName, datamart);
        }
        if (!_matched) {
          if (_source instanceof DatamartEntity) {
            _matched=true;
            this.addDatamartEntityResultSet(workSet, odseth, dataSetName, datamart);
          }
        }
        if (!_matched) {
          if (_source instanceof DatamartTask) {
            _matched=true;
            ReportModelGenerator.LOGGER.error("DatamartTask ... todo");
          }
        }
        workSet.getDesign().getModule().addElementID(odseth.getElement());
        workSet.getDesign().getModule().add(odseth.getElement(), IModuleModel.DATA_SET_SLOT);
      }
    } catch (Throwable _e) {
      throw Exceptions.sneakyThrow(_e);
    }
  }
  
  private void addDatamartCubeResultSet(final ReportGeneratorWorkSet workSet, final OdaDataSetHandle odseth, final String dataSetName, final DatamartDefinition datamart) {
    try {
      System.err.println("DatamartCube ... todo");
      String selectColumns = "";
      CachedMetaData cmd = new CachedMetaData();
      ArrayList<OdaResultSetColumn> sd = new ArrayList<OdaResultSetColumn>();
      StringConcatenation _builder = new StringConcatenation();
      _builder.append("select ");
      _builder.append(selectColumns);
      _builder.append(" from ");
      String _name = datamart.getName();
      _builder.append(_name);
      odseth.setProperty("queryText", _builder.toString());
      cmd.setProperty(IDataSetModel.RESULT_SET_PROP, sd);
      odseth.setProperty(IDataSetModel.CACHED_METADATA_PROP, cmd);
      odseth.getElement().setProperty(IDataSetModel.RESULT_SET_PROP, sd);
    } catch (Throwable _e) {
      throw Exceptions.sneakyThrow(_e);
    }
  }
  
  private void addAllDatamartProperties(final ReportGeneratorWorkSet workSet, final ArrayList<OdaResultSetColumn> sd, final ArrayList<ComputedColumn> cc, final EObject eObject) {
    boolean _matched = false;
    if (eObject instanceof DatamartEntity) {
      _matched=true;
      EList<DatamartNavigation> _navigations = ((DatamartEntity)eObject).getNavigations();
      for (final DatamartNavigation navigation : _navigations) {
        final Procedure1<EObject> _function = (EObject element) -> {
          this.addAllDatamartProperties(workSet, sd, cc, element);
        };
        IteratorExtensions.<EObject>forEach(navigation.eAllContents(), _function);
      }
      boolean _isNullOrEmpty = IterableExtensions.isNullOrEmpty(((DatamartEntity)eObject).getAttributes());
      if (_isNullOrEmpty) {
        DatamartAttributeUtil.fillEmptyAttributes(((DatamartEntity)eObject));
      }
      EList<DatamartAttribute> _attributes = ((DatamartEntity)eObject).getAttributes();
      for (final DatamartAttribute datamartAttribute : _attributes) {
        {
          LEntityAttribute attribute = datamartAttribute.getAttributeRef();
          if (((((!attribute.isId()) && (!attribute.isUuid())) && (!attribute.isVersion())) && (!attribute.isTransient()))) {
            boolean _isAuthorized = this.datamartInferrer.isAuthorized(workSet.getRole(), ((DatamartEntity)eObject).getEntityRef(), attribute.getName());
            if (_isAuthorized) {
              this.addDatamartAttribute(workSet, sd, cc, datamartAttribute);
            }
          }
        }
      }
    }
  }
  
  private void addDatamartEntityResultSet(final ReportGeneratorWorkSet workSet, final OdaDataSetHandle odseth, final String dataSetName, final DatamartDefinition datamart) {
    try {
      String selectColumns = "";
      CachedMetaData cmd = new CachedMetaData();
      ArrayList<OdaResultSetColumn> sd = new ArrayList<OdaResultSetColumn>();
      ArrayList<ComputedColumn> cc = new ArrayList<ComputedColumn>();
      workSet.setPosition(0);
      this.addAllDatamartProperties(workSet, sd, cc, datamart.getSource());
      workSet.putResultSetColumns(dataSetName, sd);
      workSet.putComputedColumns(dataSetName, cc);
      for (final ComputedColumn cc1 : cc) {
        boolean _isEmpty = selectColumns.isEmpty();
        if (_isEmpty) {
          selectColumns = cc1.getName();
        } else {
          selectColumns = selectColumns.concat(",").concat(cc1.getName());
        }
      }
      StringConcatenation _builder = new StringConcatenation();
      _builder.append("select ");
      _builder.append(selectColumns);
      _builder.append(" from ");
      String _name = datamart.getName();
      _builder.append(_name);
      odseth.setProperty("queryText", _builder.toString());
      cmd.setProperty(IDataSetModel.RESULT_SET_PROP, sd);
      odseth.setProperty(IDataSetModel.CACHED_METADATA_PROP, cmd);
      odseth.getElement().setProperty(IDataSetModel.RESULT_SET_PROP, sd);
    } catch (Throwable _e) {
      throw Exceptions.sneakyThrow(_e);
    }
  }
  
  private void addDatamartAttribute(final ReportGeneratorWorkSet workSet, final ArrayList<OdaResultSetColumn> sd, final ArrayList<ComputedColumn> cc, final DatamartAttribute datamartAttribute) {
    LEntityAttribute attribute = datamartAttribute.getAttributeRef();
    IDataMart.EType etype = this.dtType.getBasicType(attribute);
    DataTypes dataType = DataTypes.typeFor(etype);
    boolean _equals = Objects.equal(dataType, DataTypes.ANY);
    if (_equals) {
      dataType = DataTypes.typeFor(attribute.getType());
    }
    String name = DatamartAttributeUtil.getAliasedAttributeName(datamartAttribute);
    for (final OdaResultSetColumn column : sd) {
      boolean _equalsIgnoreCase = column.getColumnName().equalsIgnoreCase(name);
      if (_equalsIgnoreCase) {
        return;
      }
    }
    OdaResultSetColumn st = new OdaResultSetColumn();
    st.setColumnName(name);
    st.setProperty("name", name);
    st.setNativeDataType(Integer.valueOf(dataType.getNativeOdaDataTypeId()));
    st.setNativeName(name);
    int _position = workSet.getPosition();
    int _plus = (_position + 1);
    workSet.setPosition(_plus);
    st.setPosition(Integer.valueOf(workSet.getPosition()));
    st.setDataType(dataType.getNativeOdaDataTypeName());
    sd.add(st);
    ComputedColumn cs1 = StructureFactory.createComputedColumn();
    cs1.setName(name);
    cs1.setDisplayName(name);
    cs1.setExpression("dataSetRow[\"".concat(name).concat("\"]"));
    cs1.setDataType(dataType.getNativeOdaDataTypeName());
    this.setProperties(cs1, attribute);
    cc.add(cs1);
  }
  
  private void setProperties(final ComputedColumn column, final LEntityAttribute attribute) {
    LDataType lDataType = this.dtType.getLDataType(attribute);
    if ((lDataType != null)) {
      EList<LKeyAndValue> _properties = lDataType.getProperties();
      for (final LKeyAndValue prop : _properties) {
        column.setProperty(prop.getKey(), prop.getValue());
      }
    }
  }
  
  private CharSequence getDatamartClassName(final String alias, final DatamartDefinition datamart) {
    StringConcatenation _builder = new StringConcatenation();
    EObject _eContainer = datamart.eContainer();
    QualifiedName _fullyQualifiedName = this._iQualifiedNameProvider.getFullyQualifiedName(((LPackage) _eContainer));
    _builder.append(_fullyQualifiedName);
    _builder.append(".");
    String _name = datamart.getName();
    _builder.append(_name);
    _builder.append("Class");
    return _builder;
  }
  
  public void generateItems(final DatamartDefinition datamart, final ReportGeneratorWorkSet workSet, final ContainerItem container, final Element[] elements) {
    if ((elements != null)) {
      for (final Element element : elements) {
        try {
          boolean _matched = false;
          if (element instanceof Title) {
            _matched=true;
            container.addHeader(1, I18NKeyGenerator.key(((Title)element).getText()), ((Title)element).getText().replace("\"", ""), ((Title)element).getStyle());
          }
          if (!_matched) {
            if (element instanceof SubTitle) {
              _matched=true;
              container.addHeader(2, I18NKeyGenerator.key(((SubTitle)element).getText()), ((SubTitle)element).getText().replace("\"", ""), ((SubTitle)element).getStyle());
            }
          }
          if (!_matched) {
            if (element instanceof SubSubTitle) {
              _matched=true;
              container.addHeader(3, I18NKeyGenerator.key(((SubSubTitle)element).getText()), ((SubSubTitle)element).getText().replace("\"", ""), ((SubSubTitle)element).getStyle());
            }
          }
          if (!_matched) {
            if (element instanceof Label) {
              _matched=true;
              container.addLabel(I18NKeyGenerator.key(((Label)element).getText()), ((Label)element).getText().replace("\"", ""), ((Label)element).getStyle());
            }
          }
          if (!_matched) {
            if (element instanceof Text) {
              _matched=true;
              boolean _equals = ((Text)element).getTextContentType().getLiteral().equals(BaseItem.CONTENT_TYPE_HTML);
              if (_equals) {
                container.addText(I18NKeyGenerator.key(((Text)element).getText()), ((Text)element).getText(), ((Text)element).getStyle(), BaseItem.CONTENT_TYPE_HTML);
              } else {
                container.addText(I18NKeyGenerator.key(((Text)element).getText()), ((Text)element).getText().replace("\"", ""), ((Text)element).getStyle());
              }
            }
          }
          if (!_matched) {
            if (element instanceof NonTranslatableText) {
              _matched=true;
              container.addText(((NonTranslatableText)element).getValue().replace("\"", ""), null);
            }
          }
          if (!_matched) {
            if (element instanceof AutoText) {
              _matched=true;
              if ((((AutoText)element).getType().equals(AutoTextEnum.ACTUAL_DATE) || ((AutoText)element).getType().equals(AutoTextEnum.ACTUAL_TIME))) {
                container.addTextData(((AutoText)element).getType(), ((AutoText)element).getStyle());
              } else {
                boolean _equals = ((AutoText)element).getType().equals(AutoTextEnum.REPORT_NAME);
                if (_equals) {
                  String text = workSet.getReport().getName();
                  container.addLabel(text, text.replace("\"", ""), ((AutoText)element).getStyle());
                } else {
                  container.addAutoText(((AutoText)element).getType().toString(), ((AutoText)element).getStyle());
                }
              }
            }
          }
          if (!_matched) {
            if (element instanceof StringBinder) {
              _matched=true;
              container.addTextData(datamart, ((StringBinder) element), ((StringBinder)element).getStyle());
            }
          }
          if (!_matched) {
            if (element instanceof DatamartTableAttribute) {
              _matched=true;
              EObject eObj = ((DatamartTableAttribute)element).eContainer();
              while (((((eObj != null) && 
                (!(eObj instanceof PageHeader))) && 
                (!(eObj instanceof PageFooter))) && 
                (!(eObj instanceof PageDetail)))) {
                eObj = eObj.eContainer();
              }
              if (((eObj instanceof PageHeader) || (eObj instanceof PageFooter))) {
                TableValueElement _column = ((DatamartTableAttribute) element).getColumn();
                if ((_column instanceof TableAttribute)) {
                  TableValueElement _column_1 = ((DatamartTableAttribute) element).getColumn();
                  IDataMart.EType _basicType = this.dtType.getBasicType(((TableAttribute) _column_1).getValueRef().getAttributeRef());
                  boolean _equals = Objects.equal(_basicType, IDataMart.EType.BLOPMAPPING);
                  if (_equals) {
                    container.addDataImage(((DatamartTableAttribute)element), ((DatamartTableAttribute)element).getStyle());
                  } else {
                    TableValueElement _column_2 = ((DatamartTableAttribute) element).getColumn();
                    DatamartAttribute datamartAttribute = ((TableAttribute) _column_2).getValueRef();
                    ArrayList<DatamartAttribute> datamartAttributes = CollectionLiterals.<DatamartAttribute>newArrayList(datamartAttribute);
                    container.addTextData(datamart, datamartAttributes, ((DatamartTableAttribute)element).getStyle());
                  }
                }
              } else {
                if ((element instanceof DatamartTableAttribute)) {
                  if (((((DatamartTableAttribute) element).getColumn() instanceof TableAttribute) && 
                    Objects.equal(this.dtType.getBasicType(((TableAttribute) ((DatamartTableAttribute) element).getColumn()).getValueRef().getAttributeRef()), IDataMart.EType.BLOPMAPPING))) {
                    container.addDataImage(((DatamartTableAttribute)element), ((DatamartTableAttribute)element).getStyle());
                  } else {
                    EObject _eContainer = ((DatamartTableAttribute)element).eContainer();
                    if ((_eContainer instanceof GridCell)) {
                      container.addData(((DatamartTableAttribute)element), ((DatamartTableAttribute)element).getStyle());
                    } else {
                      Object datamartAlias = null;
                      ArrayList<DatamartAttribute> hiddens = new ArrayList<DatamartAttribute>();
                      String dataSetName = Utilities.getDataSetName(((String)datamartAlias), datamart).toString();
                      OdaDataSetHandle dataSet = workSet.getDataSets().get(dataSetName);
                      if ((dataSet == null)) {
                        final ArrayList<DatamartAttribute> _converted_hiddens = (ArrayList<DatamartAttribute>)hiddens;
                        this.addDatamartSourceAndSet(datamart, workSet, ((String)datamartAlias), ((DatamartAttribute[])Conversions.unwrapArray(_converted_hiddens, DatamartAttribute.class)));
                        dataSet = workSet.getDataSets().get(dataSetName);
                      }
                      container.addData(((DatamartTableAttribute)element), dataSet, dataSetName, ((DatamartTableAttribute)element).getStyle());
                    }
                  }
                }
              }
            }
          }
          if (!_matched) {
            if (element instanceof Image) {
              _matched=true;
              this.addImage(workSet, container, ((Image)element), null);
            }
          }
          if (!_matched) {
            if (element instanceof DatamartTable) {
              _matched=true;
              Width _width = new Width("100%");
              this.addDatamartTable(datamart, workSet, container, ((DatamartTable)element), _width);
            }
          }
          if (!_matched) {
            if (element instanceof Grid) {
              _matched=true;
              this.addGrid(datamart, workSet, container, ((Grid)element), ((Grid)element).getStyle());
            }
          }
        } catch (final Throwable _t) {
          if (_t instanceof ContentException) {
            final ContentException ce = (ContentException)_t;
            ReportModelGenerator.LOGGER.error("{}", ce);
          } else if (_t instanceof Exception) {
            final Exception e = (Exception)_t;
            ReportModelGenerator.LOGGER.error("{}", e);
          } else {
            throw Exceptions.sneakyThrow(_t);
          }
        }
      }
    }
  }
  
  private void addDatamartTable(final DatamartDefinition datamart, final ReportGeneratorWorkSet workSet, final ContainerItem container, final DatamartTable datamartTable, final Attribute... attributes) {
    try {
      DatamartDefinition newDatamart = datamart;
      DatamartDefinition _datamartRef = datamartTable.getDatamartRef();
      boolean _tripleNotEquals = (_datamartRef != null);
      if (_tripleNotEquals) {
        newDatamart = datamartTable.getDatamartRef();
      }
      ArrayList<DatamartAttribute> hiddens = new ArrayList<DatamartAttribute>();
      String alias = datamartTable.getName();
      String dataSetName = Utilities.getDataSetName(alias, newDatamart).toString();
      OdaDataSetHandle dataSet = workSet.getDataSets().get(dataSetName);
      if ((dataSet == null)) {
        final ArrayList<DatamartAttribute> _converted_hiddens = (ArrayList<DatamartAttribute>)hiddens;
        this.addDatamartSourceAndSet(newDatamart, workSet, alias, ((DatamartAttribute[])Conversions.unwrapArray(_converted_hiddens, DatamartAttribute.class)));
        dataSet = workSet.getDataSets().get(dataSetName);
      }
      container.addTable(newDatamart, dataSet, datamartTable, workSet.getComputedColumns(dataSetName), ((DatamartTableGroup[])Conversions.unwrapArray(datamartTable.getGroups(), DatamartTableGroup.class)), datamartTable.getDetail().getStyle(), ((DatamartTableAttribute[])Conversions.unwrapArray(datamartTable.getDetail().getColumnFormatters(), DatamartTableAttribute.class)), datamartTable.getStyle(), attributes);
    } catch (Throwable _e) {
      throw Exceptions.sneakyThrow(_e);
    }
  }
  
  private void addImage(final ReportGeneratorWorkSet workSet, final ContainerItem container, final Image imageData, final Style style, final Attribute... attributes) {
    String _literal = imageData.getSize().getLiteral();
    double _scale = imageData.getScale();
    double _heightValue = imageData.getHeightValue();
    UnitEnum _heightUnit = imageData.getHeightUnit();
    double _widthValue = imageData.getWidthValue();
    UnitEnum _widthUnit = imageData.getWidthUnit();
    String _literal_1 = imageData.getSourceType().getLiteral();
    String _filename = imageData.getFilename();
    ImageItem image = new ImageItem(workSet, 
      null, _literal, _scale, _heightValue, _heightUnit, _widthValue, _widthUnit, _literal_1, _filename);
    container.add(image, style, attributes);
  }
  
  private void addGrid(final DatamartDefinition datamart, final ReportGeneratorWorkSet workSet, final ContainerItem container, final Grid grid, final Style style, final Attribute... attributes) {
    try {
      Object datamartAlias = null;
      ArrayList<DatamartAttribute> hiddens = new ArrayList<DatamartAttribute>();
      String dataSetName = Utilities.getDataSetName(((String)datamartAlias), datamart).toString();
      OdaDataSetHandle dataSet = workSet.getDataSets().get(dataSetName);
      if ((dataSet == null)) {
        final ArrayList<DatamartAttribute> _converted_hiddens = (ArrayList<DatamartAttribute>)hiddens;
        this.addDatamartSourceAndSet(datamart, workSet, ((String)datamartAlias), ((DatamartAttribute[])Conversions.unwrapArray(_converted_hiddens, DatamartAttribute.class)));
        dataSet = workSet.getDataSets().get(dataSetName);
      }
      List<ComputedColumn> _computedColumns = workSet.getComputedColumns(dataSetName);
      final GridItem gridItem = new GridItem(workSet, dataSet, _computedColumns, grid);
      List<Attribute> attributeList = CollectionLiterals.<Attribute>newArrayList();
      for (final Attribute attribute : attributes) {
        attributeList.add(attribute);
      }
      String propValue = "";
      double _widthValue = grid.getWidthValue();
      boolean _tripleNotEquals = (_widthValue != 0);
      if (_tripleNotEquals) {
        propValue = workSet.getLocalizedDoubleValue(gridItem.getHandle(), grid.getWidthValue());
      } else {
        propValue = "100%";
      }
      Width _width = new Width(propValue);
      attributeList.add(_width);
      Attribute[] newAttributes = attributeList.<Attribute>toArray(new Attribute[attributeList.size()]);
      if (((grid.getVisibilityItem() != null) && grid.getVisibilityItem().isVisibility())) {
        DataUtils.addVisibility(gridItem.getHandle(), grid.getVisibilityItem().getVisibilityAttribute());
      }
      int rowNo = 0;
      HashMap<Integer, Double> maxCellWidthMap = CollectionLiterals.<Integer, Double>newHashMap();
      EList<GridRow> _rows = grid.getRows();
      for (final GridRow row : _rows) {
        {
          ReportItemHandle _handle = gridItem.getHandle();
          DesignElementHandle _get = ((GridHandle) _handle).getRows().get(rowNo);
          RowHandle rowHandle = ((RowHandle) _get);
          if (((row.getVisibilityItem() != null) && row.getVisibilityItem().isVisibility())) {
            DataUtils.addVisibility(rowHandle, row.getVisibilityItem().getVisibilityAttribute());
          }
          int columnNo = 0;
          EList<GridCell> _cells = row.getCells();
          for (final GridCell cell : _cells) {
            {
              double _widthValue_1 = cell.getWidthValue();
              boolean _notEquals = (_widthValue_1 != 0);
              if (_notEquals) {
                DesignElementHandle cellHandle = rowHandle.getCells().get(columnNo);
                StringConcatenation _builder = new StringConcatenation();
                String _localizedDoubleValue = workSet.getLocalizedDoubleValue(gridItem.getHandle(), cell.getWidthValue());
                _builder.append(_localizedDoubleValue);
                cellHandle.setStringProperty(CssPropertyConstants.WIDTH, _builder.toString());
                if (((maxCellWidthMap.isEmpty() || (maxCellWidthMap.get(Integer.valueOf(columnNo)) == null)) || ((maxCellWidthMap.get(Integer.valueOf(columnNo))).doubleValue() < cell.getWidthValue()))) {
                  maxCellWidthMap.put(Integer.valueOf(columnNo), Double.valueOf(cell.getWidthValue()));
                }
              }
              Style _style = cell.getStyle();
              boolean _tripleNotEquals_1 = (_style != null);
              if (_tripleNotEquals_1) {
                gridItem.applyCellStyle(rowHandle, columnNo, cell.getStyle());
              }
              if (((cell.getVisibilityItem() != null) && cell.getVisibilityItem().isVisibility())) {
                DesignElementHandle cellHandle_1 = rowHandle.getCells().get(columnNo);
                DataUtils.addVisibility(cellHandle_1, cell.getVisibilityItem().getVisibilityAttribute());
              }
              this.generateItems(datamart, workSet, gridItem.getCell(columnNo, rowNo).setColumnSpan(cell.getColumnspan()), ((Element[])Conversions.unwrapArray(cell.getElements(), Element.class)));
              columnNo = (columnNo + 1);
            }
          }
          Style _style = row.getStyle();
          boolean _tripleNotEquals_1 = (_style != null);
          if (_tripleNotEquals_1) {
            gridItem.applyRowStyle(rowNo, row.getStyle());
          }
          double _heightValue = row.getHeightValue();
          boolean _tripleNotEquals_2 = (_heightValue != 0);
          if (_tripleNotEquals_2) {
            gridItem.setRowHeight(rowNo, row.getHeightValue());
          }
          rowNo = (rowNo + 1);
        }
      }
      final BiConsumer<Integer, Double> _function = (Integer columnIdx, Double columnWidth) -> {
        try {
          if (((columnWidth).doubleValue() != 0.0)) {
            ReportItemHandle _handle = gridItem.getHandle();
            DesignElementHandle _get = ((GridHandle) _handle).getColumns().get((columnIdx).intValue());
            StringConcatenation _builder = new StringConcatenation();
            String _localizedDoubleValue = workSet.getLocalizedDoubleValue(gridItem.getHandle(), (columnWidth).doubleValue());
            _builder.append(_localizedDoubleValue);
            ((ColumnHandle) _get).setStringProperty(CssPropertyConstants.WIDTH, _builder.toString());
          }
        } catch (Throwable _e) {
          throw Exceptions.sneakyThrow(_e);
        }
      };
      maxCellWidthMap.forEach(_function);
      container.add(gridItem, style, newAttributes);
    } catch (Throwable _e) {
      throw Exceptions.sneakyThrow(_e);
    }
  }
  
  @Override
  public TreeAppendable createAppendable(final EObject context, final ImportManager importManager, final GeneratorConfig config) {
    TreeAppendable _xblockexpression = null;
    {
      this.setBuilder(context.eResource());
      this._basicDslGeneratorUtils.addImportFor(this, importManager, this._typeReferenceBuilder, ReportGeneratorWorkSet.class, HorizontalLayout.class, ViewLayoutManager.class, BrowserFrame.class, StreamResource.class, Sizeable.Unit.class, Button.class, com.vaadin.ui.Label.class, IEventBroker.class, EventHandler.class, Event.class, EventUtils.class, EventBrokerMsg.class, CustomMsgException.class, IReportProvider.Rendering.class, AbstractComponent.class, UUID.class, Container.Filter.class, IToolbarAction.class, HashMap.class);
      _xblockexpression = super.createAppendable(context, importManager, config);
    }
    return _xblockexpression;
  }
  
  public void internalDoGenerate(final EObject orgModel, final IFileSystemAccess fsa) {
    if (orgModel instanceof JvmDeclaredType) {
      _internalDoGenerate((JvmDeclaredType)orgModel, fsa);
      return;
    } else if (orgModel instanceof ReportModel) {
      _internalDoGenerate((ReportModel)orgModel, fsa);
      return;
    } else if (orgModel != null) {
      _internalDoGenerate(orgModel, fsa);
      return;
    } else {
      throw new IllegalArgumentException("Unhandled parameter types: " +
        Arrays.<Object>asList(orgModel, fsa).toString());
    }
  }
}
