package org.saiku.adhoc.model.builder; import java.util.ArrayList; import java.util.List; import org.apache.commons.logging.Log; import org.apache.commons.logging.LogFactory; import org.pentaho.reporting.engine.classic.core.function.CountDistinctFunction; import org.pentaho.reporting.engine.classic.wizard.model.DefaultDetailFieldDefinition; import org.pentaho.reporting.engine.classic.wizard.model.DefaultGroupDefinition; import org.pentaho.reporting.engine.classic.wizard.model.DefaultWizardSpecification; import org.pentaho.reporting.engine.classic.wizard.model.DetailFieldDefinition; import org.pentaho.reporting.engine.classic.wizard.model.GroupDefinition; import org.pentaho.reporting.engine.classic.wizard.model.GroupType; import org.pentaho.reporting.engine.classic.wizard.model.Length; import org.pentaho.reporting.engine.classic.wizard.model.LengthUnit; import org.pentaho.reporting.engine.classic.wizard.model.WizardSpecification; import org.saiku.adhoc.exceptions.ReportException; import org.saiku.adhoc.model.master.SaikuColumn; import org.saiku.adhoc.model.master.SaikuGroup; import org.saiku.adhoc.model.master.SaikuMasterModel; import org.saiku.adhoc.utils.TemplateUtils; public class WizardBuilder { private static final Log log = LogFactory.getLog(WizardBuilder.class); public WizardSpecification build(SaikuMasterModel model) throws ReportException{ WizardSpecification wizardSpec = new DefaultWizardSpecification(); wizardSpec.setAutoGenerateDetails(false); List<SaikuColumn> columns = model.getColumns(); int columnCount = 0; for (SaikuColumn saikuColumn : columns) { if(!saikuColumn.isHideOnReport()){ columnCount++; } } //final int columnCount = columns.size(); final DetailFieldDefinition[] detailFields = new DetailFieldDefinition[columnCount]; //Add the columns int i = 0; Double widthCumul = Double.valueOf(0); for (SaikuColumn saikuColumn : columns) { if(!saikuColumn.isHideOnReport()){ String name = saikuColumn.getName(); DefaultDetailFieldDefinition detailFieldDef = new DefaultDetailFieldDefinition(name); detailFieldDef.setDisplayName(name); detailFieldDef.setAggregationFunction(TemplateUtils.strToAggfunctionClass(saikuColumn.getSelectedSummaryType())); //TODO: Wann ist die breite hier 0? Float colWidth = saikuColumn.getColumnHeaderFormat().getWidth(); if(colWidth!=null){ if(columns.indexOf(saikuColumn) == columnCount -1){ // colWidth = Double.valueOf(100) - widthCumul; } Length width = new Length(LengthUnit.PERCENTAGE, Math.round(colWidth.doubleValue()*1000)/1000); log.info("col["+i+"]:" + colWidth); detailFieldDef.setWidth(width); widthCumul+=colWidth; } detailFieldDef.setDataFormat(saikuColumn.getFormatMask()); detailFields[i] = detailFieldDef; i++; } } //Add the groups final List<GroupDefinition> groupDefs = new ArrayList<GroupDefinition>(); List<SaikuGroup> sGroups = model.getGroups(); final Class<CountDistinctFunction> aggFunctionClass = CountDistinctFunction.class; for (SaikuGroup saikuGroup : sGroups) { final GroupDefinition def = new DefaultGroupDefinition(GroupType.RELATIONAL, saikuGroup.getColumnName()); def.setAggregationFunction(aggFunctionClass); def.setDisplayName(saikuGroup.getColumnName()); def.setGroupTotalsLabel(saikuGroup.getGroupTotalsLabel()); groupDefs.add(def); } wizardSpec.setDetailFieldDefinitions(detailFields); GroupDefinition[] groups = groupDefs.toArray(new GroupDefinition[groupDefs.size()]); wizardSpec.setGroupDefinitions(groups); return wizardSpec; } }