// Make a new Cell for ActionSetField columns
  private DecoratedGridCellValueAdaptor<? extends Comparable<?>> derieveCellFromAction(
      ActionSetFieldCol52 col) {

    // Check if the column has a "Value List" or an enumeration. Value List takes precedence
    final String factType = model.getBoundFactType(col.getBoundName());
    final String fieldName = col.getFactField();
    if (model.hasValueList(col)) {
      return makeValueListCell(col);

    } else if (sce.hasEnums(factType, fieldName)) {
      return makeEnumCell(factType, fieldName);
    }

    return derieveCellFromModel(col);
  }
  // Get Cell applicable to Model's data-type
  private DecoratedGridCellValueAdaptor<? extends Comparable<?>> derieveCellFromModel(
      DTColumnConfig52 col) {

    // Extended Entry...
    DecoratedGridCellValueAdaptor<? extends Comparable<?>> cell = makeTextCell();

    // Get a cell based upon the data-type
    String type = model.getType(col, sce);

    if (type.equals(SuggestionCompletionEngine.TYPE_NUMERIC)) {
      cell = makeNumericCell();
    } else if (type.equals(SuggestionCompletionEngine.TYPE_NUMERIC_BIGDECIMAL)) {
      cell = makeNumericBigDecimalCell();
    } else if (type.equals(SuggestionCompletionEngine.TYPE_NUMERIC_BIGINTEGER)) {
      cell = makeNumericBigIntegerCell();
    } else if (type.equals(SuggestionCompletionEngine.TYPE_NUMERIC_BYTE)) {
      cell = makeNumericByteCell();
    } else if (type.equals(SuggestionCompletionEngine.TYPE_NUMERIC_DOUBLE)) {
      cell = makeNumericDoubleCell();
    } else if (type.equals(SuggestionCompletionEngine.TYPE_NUMERIC_FLOAT)) {
      cell = makeNumericFloatCell();
    } else if (type.equals(SuggestionCompletionEngine.TYPE_NUMERIC_INTEGER)) {
      cell = makeNumericIntegerCell();
    } else if (type.equals(SuggestionCompletionEngine.TYPE_NUMERIC_LONG)) {
      cell = makeNumericLongCell();
    } else if (type.equals(SuggestionCompletionEngine.TYPE_NUMERIC_SHORT)) {
      cell = makeNumericShortCell();
    } else if (type.equals(SuggestionCompletionEngine.TYPE_BOOLEAN)) {
      cell = makeBooleanCell();
    } else if (type.equals(SuggestionCompletionEngine.TYPE_DATE)) {
      cell = makeDateCell();
    }

    return cell;
  }
  // Get the Data Type corresponding to a given column
  protected DTDataTypes52 getDataType(BaseColumn column) {

    // Limited Entry are simply boolean
    if (column instanceof LimitedEntryCol) {
      return DTDataTypes52.BOOLEAN;
    }

    // Action Work Items are always boolean
    if (column instanceof ActionWorkItemCol52) {
      return DTDataTypes52.BOOLEAN;
    }

    // Actions setting Field Values from Work Item Result Parameters are always boolean
    if (column instanceof ActionWorkItemSetFieldCol52
        || column instanceof ActionWorkItemInsertFactCol52) {
      return DTDataTypes52.BOOLEAN;
    }

    // Operators "is null" and "is not null" require a boolean cell
    if (column instanceof ConditionCol52) {
      ConditionCol52 cc = (ConditionCol52) column;
      if (cc.getOperator() != null
          && (cc.getOperator().equals("== null") || cc.getOperator().equals("!= null"))) {
        return DTDataTypes52.BOOLEAN;
      }
    }

    // Extended Entry...
    return model.getTypeSafeType(column, sce);
  }
 /**
  * Construct a new column of data for the underlying model
  *
  * @return
  */
 public List<DTCellValue52> makeColumnData(BaseColumn column) {
   List<DTCellValue52> data = new ArrayList<DTCellValue52>();
   for (int iRow = 0; iRow < model.getData().size(); iRow++) {
     DTCellValue52 cell = makeModelCellValue(column);
     data.add(cell);
   }
   return data;
 }
  // Get a cell for a Value List
  private DecoratedGridCellValueAdaptor<? extends Comparable<?>> makeValueListCell(
      DTColumnConfig52 col) {

    // Columns with "Value Lists" are always Text (for now)
    PopupValueListDropDownEditCell pudd =
        new PopupValueListDropDownEditCell(model.getValueList(col), isReadOnly);
    DecoratedGridCellValueAdaptor<? extends Comparable<?>> cell =
        new DecoratedGridCellValueAdaptor<String>(pudd, eventBus);
    return cell;
  }
 /**
  * Convert a column of domain data to that suitable for the UI
  *
  * @param column
  * @param columnData
  * @return
  */
 public List<CellValue<? extends Comparable<?>>> convertColumnData(
     BaseColumn column, List<DTCellValue52> columnData) {
   List<CellValue<? extends Comparable<?>>> data =
       new ArrayList<CellValue<? extends Comparable<?>>>();
   for (int iRow = 0; iRow < model.getData().size(); iRow++) {
     DTCellValue52 dcv = columnData.get(iRow);
     CellValue<? extends Comparable<?>> cell = convertModelCellValue(column, dcv);
     data.add(cell);
   }
   return data;
 }
 /**
  * Construct a new row of data for the underlying model
  *
  * @return
  */
 public List<DTCellValue52> makeRowData() {
   List<DTCellValue52> data = new ArrayList<DTCellValue52>();
   List<BaseColumn> columns = model.getExpandedColumns();
   // Use allColumns.size() - 1 to exclude the Analysis column that is not stored in the general
   // grid data
   for (int iCol = 0; iCol < columns.size() - 1; iCol++) {
     BaseColumn column = columns.get(iCol);
     DTCellValue52 cell = makeModelCellValue(column);
     data.add(cell);
   }
   return data;
 }
  // Make a new Cell for Condition columns
  private DecoratedGridCellValueAdaptor<? extends Comparable<?>> derieveCellFromCondition(
      ConditionCol52 col) {

    // Operators "is null" and "is not null" require a boolean cell
    if (col.getOperator() != null
        && (col.getOperator().equals("== null") || col.getOperator().equals("!= null"))) {
      return makeBooleanCell();
    }

    // Check if the column has a "Value List" or an enumeration. Value List takes precedence
    final String factType = model.getPattern(col).getFactType();
    final String fieldName = col.getFactField();
    if (model.hasValueList(col)) {
      return makeValueListCell(col);

    } else if (sce.hasEnums(factType, fieldName)) {
      return makeEnumCell(factType, fieldName);
    }

    return derieveCellFromModel(col);
  }
  /**
   * Construct a new row of data for the MergableGridWidget
   *
   * @return
   */
  @Override
  public DynamicDataRow makeUIRowData() {
    DynamicDataRow data = new DynamicDataRow();
    List<BaseColumn> columns = model.getExpandedColumns();
    for (BaseColumn column : columns) {
      DTCellValue52 dcv = makeModelCellValue(column);
      DTDataTypes52 dataType = getDataType(column);
      assertDTCellValue(dataType, dcv);
      CellValue<? extends Comparable<?>> cell = convertModelCellValue(column, dcv);
      data.add(cell);
    }

    return data;
  }
  private ListBox loadPatterns() {
    Set<String> vars = new HashSet<String>();
    ListBox patterns = new ListBox();

    for (Object o : model.getActionCols()) {
      ActionCol52 col = (ActionCol52) o;
      if (col instanceof ActionInsertFactCol52) {
        ActionInsertFactCol52 c = (ActionInsertFactCol52) col;
        if (!vars.contains(c.getBoundName())) {
          patterns.addItem(
              c.getFactType() + " [" + c.getBoundName() + "]",
              c.getFactType() + " " + c.getBoundName());
          vars.add(c.getBoundName());
        }
      }
    }

    return patterns;
  }
  @Test
  public void testImpossibleMatchesString() throws ParseException {
    SuggestionCompletionEngine sce = buildSuggestionCompletionEngine();

    GuidedDecisionTable52 dt = new GuidedDecisionTable52();

    Pattern52 driverPattern = new Pattern52();
    driverPattern.setBoundName("driverPattern");
    driverPattern.setFactType("Driver");

    ConditionCol52 name = new ConditionCol52();
    name.setFactField("name");
    name.setOperator("==");
    name.setConstraintValueType(BaseSingleFieldConstraint.TYPE_LITERAL);
    driverPattern.getConditions().add(name);

    ConditionCol52 notName = new ConditionCol52();
    notName.setFactField("name");
    notName.setOperator("!=");
    notName.setConstraintValueType(BaseSingleFieldConstraint.TYPE_LITERAL);
    driverPattern.getConditions().add(notName);

    ConditionCol52 nameIn = new ConditionCol52();
    nameIn.setFactField("name");
    nameIn.setOperator("in");
    nameIn.setConstraintValueType(BaseSingleFieldConstraint.TYPE_LITERAL);
    driverPattern.getConditions().add(nameIn);

    dt.getConditionPatterns().add(driverPattern);

    ActionSetFieldCol52 message = new ActionSetFieldCol52();
    message.setFactField("message");
    dt.getActionCols().add(message);

    @SuppressWarnings("unchecked")
    List<List<DTCellValue52>> data =
        Arrays.asList(
            Arrays.asList(
                new DTCellValue52(new BigDecimal("1")),
                new DTCellValue52("Row 1 description"),
                new DTCellValue52("Homer"),
                new DTCellValue52("Bart"),
                new DTCellValue52((String) null),
                new DTCellValue52("Row 1 message")),
            Arrays.asList(
                new DTCellValue52(new BigDecimal("2")),
                new DTCellValue52("Row 2 description"),
                new DTCellValue52("Homer"),
                new DTCellValue52("Homer"),
                new DTCellValue52((String) null),
                new DTCellValue52("Row 2 message")),
            Arrays.asList(
                new DTCellValue52(new BigDecimal("3")),
                new DTCellValue52("Row 3 description"),
                new DTCellValue52("Homer"),
                new DTCellValue52((String) null),
                new DTCellValue52((String) null),
                new DTCellValue52("Row 3 message")),
            Arrays.asList(
                new DTCellValue52(new BigDecimal("4")),
                new DTCellValue52("Row 4 description"),
                new DTCellValue52((String) null),
                new DTCellValue52("Bart"),
                new DTCellValue52((String) null),
                new DTCellValue52("Row 4 message")),
            Arrays.asList(
                new DTCellValue52(new BigDecimal("5")),
                new DTCellValue52("Row 5 description"),
                new DTCellValue52("Homer"),
                new DTCellValue52((String) null),
                new DTCellValue52("Marge,Lisa"),
                new DTCellValue52("Row 5 message")));

    dt.setData(data);

    DecisionTableAnalyzer analyzer = new DecisionTableAnalyzer(sce);
    List<Analysis> analysisData = analyzer.analyze(dt);

    assertEquals(data.size(), analysisData.size());
    assertEquals(0, analysisData.get(0).getImpossibleMatchesSize());
    assertEquals(1, analysisData.get(1).getImpossibleMatchesSize());
    assertEquals(0, analysisData.get(2).getImpossibleMatchesSize());
    assertEquals(0, analysisData.get(3).getImpossibleMatchesSize());
    assertEquals(1, analysisData.get(4).getImpossibleMatchesSize());
  }
  @Test
  public void testConflictingMatchCombination() throws ParseException {
    SuggestionCompletionEngine sce = buildSuggestionCompletionEngine();

    GuidedDecisionTable52 dt = new GuidedDecisionTable52();

    Pattern52 driverPattern = new Pattern52();
    driverPattern.setBoundName("driverPattern");
    driverPattern.setFactType("Driver");

    ConditionCol52 ageMinimum = new ConditionCol52();
    ageMinimum.setFactField("age");
    ageMinimum.setOperator(">=");
    ageMinimum.setConstraintValueType(BaseSingleFieldConstraint.TYPE_LITERAL);
    driverPattern.getConditions().add(ageMinimum);

    ConditionCol52 ageMaximum = new ConditionCol52();
    ageMaximum.setFactField("age");
    ageMaximum.setOperator("<=");
    ageMaximum.setConstraintValueType(BaseSingleFieldConstraint.TYPE_LITERAL);
    driverPattern.getConditions().add(ageMaximum);

    ConditionCol52 approved = new ConditionCol52();
    approved.setFactField("approved");
    approved.setOperator("==");
    approved.setConstraintValueType(BaseSingleFieldConstraint.TYPE_LITERAL);
    driverPattern.getConditions().add(approved);

    dt.getConditionPatterns().add(driverPattern);

    ActionSetFieldCol52 message = new ActionSetFieldCol52();
    message.setFactField("message");
    dt.getActionCols().add(message);

    @SuppressWarnings("unchecked")
    List<List<DTCellValue52>> data =
        Arrays.asList(
            Arrays.asList(
                new DTCellValue52(new BigDecimal("1")),
                new DTCellValue52("Row 1 description"),
                new DTCellValue52((BigDecimal) null),
                new DTCellValue52(new BigDecimal("20")),
                new DTCellValue52(Boolean.TRUE),
                new DTCellValue52("Row 1 message")),
            Arrays.asList(
                new DTCellValue52(new BigDecimal("2")),
                new DTCellValue52("Row 2 description"),
                new DTCellValue52(new BigDecimal("21")),
                new DTCellValue52(new BigDecimal("40")),
                new DTCellValue52(Boolean.TRUE),
                new DTCellValue52("Row 2 message")),
            Arrays.asList(
                new DTCellValue52(new BigDecimal("3")),
                new DTCellValue52("Row 3 description"),
                new DTCellValue52(new BigDecimal("41")),
                new DTCellValue52((BigDecimal) null),
                new DTCellValue52(Boolean.TRUE),
                new DTCellValue52("Row 3 message")),
            Arrays.asList(
                new DTCellValue52(new BigDecimal("4")),
                new DTCellValue52("Row 4 description"),
                new DTCellValue52((BigDecimal) null),
                new DTCellValue52(new BigDecimal("25")),
                new DTCellValue52(Boolean.FALSE),
                new DTCellValue52("Row 4 message")),
            Arrays.asList(
                new DTCellValue52(new BigDecimal("5")),
                new DTCellValue52("Row 5 description"),
                new DTCellValue52(new BigDecimal("26")),
                new DTCellValue52(new BigDecimal("60")),
                new DTCellValue52(Boolean.FALSE),
                new DTCellValue52("Row 5 message")),
            Arrays.asList(
                new DTCellValue52(new BigDecimal("6")),
                new DTCellValue52("Row 6 description"),
                new DTCellValue52(new BigDecimal("50")),
                new DTCellValue52((BigDecimal) null),
                new DTCellValue52(Boolean.FALSE),
                new DTCellValue52("Row 6 message")));

    dt.setData(data);

    DecisionTableAnalyzer analyzer = new DecisionTableAnalyzer(sce);
    List<Analysis> analysisData = analyzer.analyze(dt);

    assertEquals(data.size(), analysisData.size());
    assertEquals(0, analysisData.get(0).getConflictingMatchSize());
    assertEquals(0, analysisData.get(1).getConflictingMatchSize());
    assertEquals(0, analysisData.get(2).getConflictingMatchSize());
    assertEquals(0, analysisData.get(3).getConflictingMatchSize());
    assertEquals(1, analysisData.get(4).getConflictingMatchSize());
    assertEquals(1, analysisData.get(5).getConflictingMatchSize());
  }
  @Test
  public void testConflictingMatchLimitedEntry() throws ParseException {
    SuggestionCompletionEngine sce = buildSuggestionCompletionEngine();

    GuidedDecisionTable52 dt = new GuidedDecisionTable52();

    Pattern52 driverPattern = new Pattern52();
    driverPattern.setBoundName("driverPattern");
    driverPattern.setFactType("Driver");

    LimitedEntryConditionCol52 child = new LimitedEntryConditionCol52();
    child.setFactField("age");
    child.setOperator("<");
    child.setValue(new DTCellValue52(new BigDecimal("18")));
    child.setConstraintValueType(BaseSingleFieldConstraint.TYPE_LITERAL);
    driverPattern.getConditions().add(child);

    LimitedEntryConditionCol52 adult = new LimitedEntryConditionCol52();
    adult.setFactField("age");
    adult.setOperator(">=");
    adult.setValue(new DTCellValue52(new BigDecimal("18")));
    adult.setConstraintValueType(BaseSingleFieldConstraint.TYPE_LITERAL);
    driverPattern.getConditions().add(adult);

    LimitedEntryConditionCol52 pensioner = new LimitedEntryConditionCol52();
    pensioner.setFactField("age");
    pensioner.setOperator(">=");
    pensioner.setValue(new DTCellValue52(new BigDecimal("65")));
    pensioner.setConstraintValueType(BaseSingleFieldConstraint.TYPE_LITERAL);
    driverPattern.getConditions().add(pensioner);

    dt.getConditionPatterns().add(driverPattern);

    ActionSetFieldCol52 message = new ActionSetFieldCol52();
    message.setFactField("message");
    dt.getActionCols().add(message);

    @SuppressWarnings("unchecked")
    List<List<DTCellValue52>> data =
        Arrays.asList(
            Arrays.asList(
                new DTCellValue52(new BigDecimal("1")),
                new DTCellValue52("Row 1 description"),
                new DTCellValue52(Boolean.TRUE),
                new DTCellValue52(Boolean.FALSE),
                new DTCellValue52(Boolean.FALSE),
                new DTCellValue52("Row 1 message")),
            Arrays.asList(
                new DTCellValue52(new BigDecimal("2")),
                new DTCellValue52("Row 2 description"),
                new DTCellValue52(Boolean.FALSE),
                new DTCellValue52(Boolean.TRUE),
                new DTCellValue52(Boolean.FALSE),
                new DTCellValue52("Row 2 message")),
            Arrays.asList(
                new DTCellValue52(new BigDecimal("3")),
                new DTCellValue52("Row 3 description"),
                new DTCellValue52(Boolean.FALSE),
                new DTCellValue52(Boolean.FALSE),
                new DTCellValue52(Boolean.TRUE),
                new DTCellValue52("Row 3 message")));

    dt.setData(data);

    DecisionTableAnalyzer analyzer = new DecisionTableAnalyzer(sce);
    List<Analysis> analysisData = analyzer.analyze(dt);

    assertEquals(data.size(), analysisData.size());
    assertEquals(0, analysisData.get(0).getConflictingMatchSize());
    assertEquals(1, analysisData.get(1).getConflictingMatchSize());
    assertEquals(1, analysisData.get(2).getConflictingMatchSize());
  }
  @Test
  @Ignore("TODO fix GUVNOR-1677 duplication")
  public void testDuplicatedMatchNumeric() throws ParseException {
    SuggestionCompletionEngine sce = buildSuggestionCompletionEngine();

    GuidedDecisionTable52 dt = new GuidedDecisionTable52();

    Pattern52 driverPattern = new Pattern52();
    driverPattern.setBoundName("driverPattern");
    driverPattern.setFactType("Driver");

    ConditionCol52 ageMinimum = new ConditionCol52();
    ageMinimum.setFactField("age");
    ageMinimum.setOperator(">=");
    ageMinimum.setConstraintValueType(BaseSingleFieldConstraint.TYPE_LITERAL);
    driverPattern.getConditions().add(ageMinimum);

    ConditionCol52 ageMaximum = new ConditionCol52();
    ageMaximum.setFactField("age");
    ageMaximum.setOperator("<=");
    ageMaximum.setConstraintValueType(BaseSingleFieldConstraint.TYPE_LITERAL);
    driverPattern.getConditions().add(ageMaximum);

    dt.getConditionPatterns().add(driverPattern);

    ActionSetFieldCol52 message = new ActionSetFieldCol52();
    message.setFactField("message");
    dt.getActionCols().add(message);

    @SuppressWarnings("unchecked")
    List<List<DTCellValue52>> data =
        Arrays.asList(
            Arrays.asList(
                new DTCellValue52(new BigDecimal("1")),
                new DTCellValue52("Row 1 description"),
                new DTCellValue52((BigDecimal) null),
                new DTCellValue52(new BigDecimal("20")),
                new DTCellValue52("Same message")),
            Arrays.asList(
                new DTCellValue52(new BigDecimal("2")),
                new DTCellValue52("Row 2 description"),
                new DTCellValue52(new BigDecimal("21")),
                new DTCellValue52(new BigDecimal("40")),
                new DTCellValue52("Same message")),
            Arrays.asList(
                new DTCellValue52(new BigDecimal("3")),
                new DTCellValue52("Row 3 description"),
                new DTCellValue52(new BigDecimal("30")),
                new DTCellValue52(new BigDecimal("60")),
                new DTCellValue52("Same message")),
            Arrays.asList(
                new DTCellValue52(new BigDecimal("4")),
                new DTCellValue52("Row 4 description"),
                new DTCellValue52(new BigDecimal("50")),
                new DTCellValue52((BigDecimal) null),
                new DTCellValue52("Same message")));

    dt.setData(data);

    DecisionTableAnalyzer analyzer = new DecisionTableAnalyzer(sce);
    List<Analysis> analysisData = analyzer.analyze(dt);

    assertEquals(data.size(), analysisData.size());
    assertEquals(0, analysisData.get(0).getDuplicatedMatchSize());
    assertEquals(1, analysisData.get(1).getDuplicatedMatchSize());
    assertEquals(2, analysisData.get(2).getDuplicatedMatchSize());
    assertEquals(1, analysisData.get(3).getDuplicatedMatchSize());

    assertEquals(0, analysisData.get(0).getConflictingMatchSize());
    assertEquals(0, analysisData.get(1).getConflictingMatchSize());
    assertEquals(0, analysisData.get(2).getConflictingMatchSize());
    assertEquals(0, analysisData.get(3).getConflictingMatchSize());
  }
 private boolean unique(String header) {
   for (ActionCol52 o : model.getActionCols()) {
     if (o.getHeader().equals(header)) return false;
   }
   return true;
 }
  public ActionInsertColumnPopup(
      SuggestionCompletionEngine sce,
      final GuidedDecisionTable52 model,
      final GenericColumnCommand refreshGrid,
      final ActionInsertFactCol52 col,
      final boolean isNew) {
    this.editingCol = cloneActionInsertColumn(col);
    this.model = model;
    this.sce = sce;

    // Set-up factory for common widgets
    factory = new DTCellValueWidgetFactory(model, sce);

    setTitle(constants.ActionColumnConfigurationInsertingANewFact());
    setModal(false);

    // Fact being inserted
    HorizontalPanel pattern = new HorizontalPanel();
    pattern.add(patternLabel);
    doPatternLabel();

    Image changePattern =
        new ImageButton(
            images.edit(),
            constants.ChooseAPatternThatThisColumnAddsDataTo(),
            new ClickHandler() {
              public void onClick(ClickEvent w) {
                showChangePattern(w);
              }
            });
    pattern.add(changePattern);
    addAttribute(constants.Pattern(), pattern);

    // Fact field being set
    HorizontalPanel field = new HorizontalPanel();
    field.add(fieldLabel);
    Image editField =
        new ImageButton(
            images.edit(),
            constants.EditTheFieldThatThisColumnOperatesOn(),
            new ClickHandler() {
              public void onClick(ClickEvent w) {
                showFieldChange();
              }
            });
    field.add(editField);
    addAttribute(constants.Field(), field);
    doFieldLabel();

    // Column header
    final TextBox header = new TextBox();
    header.setText(col.getHeader());
    header.addChangeHandler(
        new ChangeHandler() {
          public void onChange(ChangeEvent event) {
            editingCol.setHeader(header.getText());
          }
        });
    addAttribute(constants.ColumnHeaderDescription(), header);

    // Optional value list
    if (model.getTableFormat() == TableFormat.EXTENDED_ENTRY) {
      final TextBox valueList = new TextBox();
      valueList.setText(editingCol.getValueList());
      valueList.addChangeHandler(
          new ChangeHandler() {
            public void onChange(ChangeEvent event) {
              editingCol.setValueList(valueList.getText());
            }
          });
      HorizontalPanel vl = new HorizontalPanel();
      vl.add(valueList);
      vl.add(new InfoPopup(constants.ValueList(), constants.ValueListsExplanation()));
      addAttribute(constants.optionalValueList(), vl);
    }

    // Default Value
    if (model.getTableFormat() == TableFormat.EXTENDED_ENTRY) {
      addAttribute(constants.DefaultValue(), DTCellValueWidgetFactory.getDefaultEditor(editingCol));
    }

    // Limited entry value widget
    limitedEntryValueAttributeIndex =
        addAttribute(constants.LimitedEntryValue(), limitedEntryValueWidgetContainer);
    makeLimitedValueWidget();

    // Logical insertion
    addAttribute(
        constants.LogicallyAssertAFactTheFactWillBeRetractedWhenTheSupportingEvidenceIsRemoved(),
        doInsertLogical());

    // Hide column tick-box
    addAttribute(
        constants.HideThisColumn(), DTCellValueWidgetFactory.getHideColumnIndicator(editingCol));

    Button apply = new Button(constants.ApplyChanges());
    apply.addClickHandler(
        new ClickHandler() {
          public void onClick(ClickEvent w) {
            if (null == editingCol.getHeader() || "".equals(editingCol.getHeader())) {
              Window.alert(constants.YouMustEnterAColumnHeaderValueDescription());
              return;
            }
            if (isNew) {
              if (!unique(editingCol.getHeader())) {
                Window.alert(constants.ThatColumnNameIsAlreadyInUsePleasePickAnother());
                return;
              }

            } else {
              if (!col.getHeader().equals(editingCol.getHeader())) {
                if (!unique(editingCol.getHeader())) {
                  Window.alert(constants.ThatColumnNameIsAlreadyInUsePleasePickAnother());
                  return;
                }
              }
            }

            // Pass new\modified column back for handling
            refreshGrid.execute(editingCol);
            hide();
          }
        });
    addAttribute("", apply);
  }
  @Test
  public void testImpossibleMatchesDate() throws ParseException {
    SuggestionCompletionEngine sce = buildSuggestionCompletionEngine();
    SimpleDateFormat dateFormat = new SimpleDateFormat("yyyy-MM-dd");

    GuidedDecisionTable52 dt = new GuidedDecisionTable52();

    Pattern52 driverPattern = new Pattern52();
    driverPattern.setBoundName("driverPattern");
    driverPattern.setFactType("Driver");

    ConditionCol52 dateOfBirthMinimum = new ConditionCol52();
    dateOfBirthMinimum.setFactField("dateOfBirth");
    dateOfBirthMinimum.setOperator(">=");
    dateOfBirthMinimum.setConstraintValueType(BaseSingleFieldConstraint.TYPE_LITERAL);
    driverPattern.getConditions().add(dateOfBirthMinimum);

    ConditionCol52 dateOfBirthMaximum = new ConditionCol52();
    dateOfBirthMaximum.setFactField("dateOfBirth");
    dateOfBirthMaximum.setOperator("<=");
    dateOfBirthMaximum.setConstraintValueType(BaseSingleFieldConstraint.TYPE_LITERAL);
    driverPattern.getConditions().add(dateOfBirthMaximum);

    dt.getConditionPatterns().add(driverPattern);

    ActionSetFieldCol52 message = new ActionSetFieldCol52();
    message.setFactField("message");
    dt.getActionCols().add(message);

    @SuppressWarnings("unchecked")
    List<List<DTCellValue52>> data =
        Arrays.asList(
            Arrays.asList(
                new DTCellValue52(new BigDecimal("1")),
                new DTCellValue52("Row 1 description"),
                new DTCellValue52(dateFormat.parse("1981-01-01")),
                new DTCellValue52(dateFormat.parse("2001-01-01")),
                new DTCellValue52("Row 1 message")),
            Arrays.asList(
                new DTCellValue52(new BigDecimal("2")),
                new DTCellValue52("Row 2 description"),
                new DTCellValue52(dateFormat.parse("2001-01-01")),
                new DTCellValue52(dateFormat.parse("1981-01-01")),
                new DTCellValue52("Row 2 message")),
            Arrays.asList(
                new DTCellValue52(new BigDecimal("3")),
                new DTCellValue52("Row 3 description"),
                new DTCellValue52((Date) null),
                new DTCellValue52(dateFormat.parse("2001-01-01")),
                new DTCellValue52("Row 3 message")),
            Arrays.asList(
                new DTCellValue52(new BigDecimal("4")),
                new DTCellValue52("Row 4 description"),
                new DTCellValue52(dateFormat.parse("1981-01-01")),
                new DTCellValue52((Date) null),
                new DTCellValue52("Row 4 message")));

    dt.setData(data);

    DecisionTableAnalyzer analyzer = new DecisionTableAnalyzer(sce);
    List<Analysis> analysisData = analyzer.analyze(dt);

    assertEquals(data.size(), analysisData.size());
    assertEquals(0, analysisData.get(0).getImpossibleMatchesSize());
    assertEquals(1, analysisData.get(1).getImpossibleMatchesSize());
    assertEquals(0, analysisData.get(2).getImpossibleMatchesSize());
    assertEquals(0, analysisData.get(3).getImpossibleMatchesSize());
  }