/** {@inheritDoc} */
  @Override
  public boolean validate(ERTable table, NormalColumn column) {
    if (column.getType() == null
        || column.getType().getAlias(table.getDiagram().getDatabase()) == null) {
      ValidateResult validateResult = new ValidateResult();
      validateResult.setMessage(
          ResourceString.getResourceString("error.validate.no.column.type1")
              + table.getPhysicalName()
              + ResourceString.getResourceString("error.validate.no.column.type2")
              + column.getPhysicalName());
      validateResult.setLocation(table.getLogicalName());
      validateResult.setSeverity(IMarker.SEVERITY_WARNING);
      validateResult.setObject(table);

      this.addError(validateResult);
    }

    return true;
  }
  /** {@inheritDoc} */
  @Override
  public void generate(
      IProgressMonitor monitor,
      HSSFWorkbook workbook,
      int sheetNo,
      boolean useLogicalNameAsSheetName,
      Map<String, Integer> sheetNameMap,
      Map<String, ObjectModel> sheetObjectMap,
      ERDiagram diagram,
      Map<String, LoopDefinition> loopDefinitionMap) {
    this.clear();

    List<ERTable> nodeSet = null;

    if (diagram.getCurrentCategory() != null) {
      nodeSet = diagram.getCurrentCategory().getTableContents();
    } else {
      nodeSet = diagram.getDiagramContents().getContents().getTableSet().getList();
    }

    for (ERTable table : nodeSet) {
      String name = null;
      if (useLogicalNameAsSheetName) {
        name = table.getLogicalName();
      } else {
        name = table.getPhysicalName();
      }

      HSSFSheet newSheet = createNewSheet(workbook, sheetNo, name, sheetNameMap);

      sheetObjectMap.put(workbook.getSheetName(workbook.getSheetIndex(newSheet)), table);

      this.setTableData(workbook, newSheet, table);

      monitor.worked(1);
    }
  }
  public void setTableData(HSSFWorkbook workbook, HSSFSheet sheet, ERTable table) {
    POIUtils.replace(
        sheet,
        KEYWORD_LOGICAL_TABLE_NAME,
        this.getValue(this.keywordsValueMap, KEYWORD_LOGICAL_TABLE_NAME, table.getLogicalName()));

    POIUtils.replace(
        sheet,
        KEYWORD_PHYSICAL_TABLE_NAME,
        this.getValue(this.keywordsValueMap, KEYWORD_PHYSICAL_TABLE_NAME, table.getPhysicalName()));

    POIUtils.replace(
        sheet,
        KEYWORD_TABLE_DESCRIPTION,
        this.getValue(this.keywordsValueMap, KEYWORD_TABLE_DESCRIPTION, table.getDescription()));

    POIUtils.replace(
        sheet,
        KEYWORD_TABLE_CONSTRAINT,
        this.getValue(this.keywordsValueMap, KEYWORD_TABLE_CONSTRAINT, table.getConstraint()));

    CellLocation cellLocation = POIUtils.findCell(sheet, FIND_KEYWORDS_OF_COLUMN);

    if (cellLocation != null) {
      int rowNum = cellLocation.r;
      HSSFRow templateRow = sheet.getRow(rowNum);

      if (this.columnTemplate == null) {
        this.columnTemplate = this.loadColumnTemplate(workbook, sheet, cellLocation);
      }

      int order = 1;

      for (NormalColumn normalColumn : table.getExpandedColumns()) {
        HSSFRow row = POIUtils.insertRow(sheet, rowNum++);
        this.setColumnData(this.keywordsValueMap, columnTemplate, row, normalColumn, table, order);
        order++;
      }

      this.setCellStyle(
          columnTemplate,
          sheet,
          cellLocation.r,
          rowNum - cellLocation.r,
          templateRow.getFirstCellNum());
    }

    CellLocation fkCellLocation = POIUtils.findCell(sheet, FIND_KEYWORDS_OF_FK_COLUMN);

    if (fkCellLocation != null) {
      int rowNum = fkCellLocation.r;
      HSSFRow templateRow = sheet.getRow(rowNum);

      if (this.fkColumnTemplate == null) {
        this.fkColumnTemplate = this.loadColumnTemplate(workbook, sheet, fkCellLocation);
      }

      int order = 1;

      for (NormalColumn normalColumn : table.getExpandedColumns()) {
        if (normalColumn.isForeignKey()) {
          HSSFRow row = POIUtils.insertRow(sheet, rowNum++);
          this.setColumnData(
              this.keywordsValueMap, this.fkColumnTemplate, row, normalColumn, table, order);
          order++;
        }
      }

      this.setCellStyle(
          this.fkColumnTemplate,
          sheet,
          fkCellLocation.r,
          rowNum - fkCellLocation.r,
          templateRow.getFirstCellNum());
    }

    this.setIndexMatrix(workbook, sheet, table);
    this.setComplexUniqueKeyMatrix(workbook, sheet, table);
  }