private void parseTemplate(final InputStream templateStream) {
    try {
      final ColumnFactory cf = new ColumnFactory();
      final BufferedReader templateReader =
          new BufferedReader(new InputStreamReader(templateStream));
      String line = null;
      StringBuffer header = new StringBuffer();
      boolean inTemplate = false;
      boolean inHeader = false;
      boolean inContents = false;
      RuleTemplate template = null;
      StringBuffer contents = new StringBuffer();
      while ((line = templateReader.readLine()) != null) {
        if (line.trim().length() > 0) {
          if (line.startsWith("template header")) {
            inHeader = true;
          } else if (line.startsWith("template")) {
            inTemplate = true;
            String quotedName = line.substring(8).trim();
            quotedName = quotedName.substring(1, quotedName.length() - 1);
            template = new RuleTemplate(quotedName, this);
            addTemplate(template);

          } else if (line.startsWith("package")) {
            if (inHeader == false) {
              throw new DecisionTableParseException("Missing header");
            }
            inHeader = false;
            header.append(line).append("\n");
          } else if (inHeader) {
            addColumn(cf.getColumn(line.trim()));
          } else if (!inTemplate && !inHeader) {
            header.append(line).append("\n");
          } else if (!inContents && line.startsWith("rule")) {
            inContents = true;
            contents.append(line).append("\n");
          } else if (line.equals("end template")) {
            template.setContents(contents.toString());
            contents.setLength(0);
            inTemplate = false;
            inContents = false;
          } else if (inContents) {
            contents.append(line).append("\n");
          } else if (inTemplate) {
            template.addColumn(line.trim());
          }
        }
      }
      if (inTemplate) {
        throw new DecisionTableParseException("Missing end template");
      }
      this.header = header.toString();

    } catch (IOException e) {
      throw new RuntimeException(e);
    } finally {
      if (templateStream != null) closeStream(templateStream);
    }
  }
  public StandardTable(TableComponent table, JRBaseObjectFactory factory) {
    whenNoDataType = table.getWhenNoDataType();

    datasetRun = factory.getDatasetRun(table.getDatasetRun());

    ColumnFactory columnFactory = new ColumnFactory(factory);
    columns = columnFactory.createColumns(table.getColumns());
  }
  public StandardBaseColumn(BaseColumn column, ColumnFactory factory) {
    this.printWhenExpression =
        factory.getBaseObjectFactory().getExpression(column.getPrintWhenExpression());

    this.tableHeader = factory.createCell(column.getTableHeader());
    this.tableFooter = factory.createCell(column.getTableFooter());
    this.groupHeaders = factory.createGroupCells(column.getGroupHeaders());
    this.groupFooters = factory.createGroupCells(column.getGroupFooters());
    this.columnHeader = factory.createCell(column.getColumnHeader());
    this.columnFooter = factory.createCell(column.getColumnFooter());

    this.width = column.getWidth();
  }
 private void copyPropertyExpressions(BaseColumn column, ColumnFactory factory) {
   JRPropertyExpression[] props = column.getPropertyExpressions();
   if (props != null && props.length > 0) {
     propertyExpressions = new ArrayList<JRPropertyExpression>(props.length);
     for (int i = 0; i < props.length; i++) {
       propertyExpressions.add(factory.getBaseObjectFactory().getPropertyExpression(props[i]));
     }
   }
 }
  public StandardBaseColumn(BaseColumn column, ColumnFactory factory) {
    this.uuid = column.getUUID();

    this.printWhenExpression =
        factory.getBaseObjectFactory().getExpression(column.getPrintWhenExpression());

    this.tableHeader = factory.createCell(column.getTableHeader());
    this.tableFooter = factory.createCell(column.getTableFooter());
    this.groupHeaders = factory.createGroupCells(column.getGroupHeaders());
    this.groupFooters = factory.createGroupCells(column.getGroupFooters());
    this.columnHeader = factory.createCell(column.getColumnHeader());
    this.columnFooter = factory.createCell(column.getColumnFooter());

    this.width = column.getWidth();

    propertiesMap = JRPropertiesMap.getPropertiesClone(column);
    copyPropertyExpressions(column, factory);
  }
  public static JEVisTree buildDefaultGraphTree(JEVisDataSource ds) {
    JEVisTree tree = new JEVisTree(ds);

    ViewFilter filter = ViewFilterFactory.createDefaultGraphFilter();
    tree.setFiler(filter);

    TreePlugin bp = new BarchartPlugin();
    //        bp.setTree(tree);

    //        getColumns().addAll(ColumnFactory.buildName(), ColumnFactory.buildID(),
    // ColumnFactory.buildClass(), ColumnFactory.buildColor(this),
    // ColumnFactory.buildBasicRowSelection(this));
    //        tree.getColumns().addAll(ColumnFactory.buildName(), ColumnFactory.buildID(),
    // ColumnFactory.buildClass(), ColumnFactory.buildBasicGraph(tree));
    tree.getColumns().addAll(ColumnFactory.buildName(), ColumnFactory.buildID());

    tree.getPlugins().add(bp);

    //        for (TreeTableColumn<SelectionTreeRow, Long> column : bp.getColumns()) {
    //            tree.getColumns().add(column);
    //        }
    return tree;
  }
  public StandardColumnGroup(ColumnGroup columnGroup, ColumnFactory factory) {
    super(columnGroup, factory);

    children = factory.createColumns(columnGroup.getColumns());
  }