/**
  * Get the subject of a field with the specified ID
  *
  * @param id
  * @return the subject or null if no field could be find with the specified id
  */
 public Object getSubject(String id) {
   LogTableField field = findField(id);
   if (field == null) {
     return null;
   }
   return field.getSubject();
 }
 /**
  * @return the field that represents the name of the object that is being used (or null if none is
  *     found)
  */
 public LogTableField getNameField() {
   for (LogTableField field : fields) {
     if (field.isNameField()) {
       return field;
     }
   }
   return null;
 }
 /** @return the field that represents the number of errors (or null if none is found) */
 public LogTableField getErrorsField() {
   for (LogTableField field : fields) {
     if (field.isErrorsField()) {
       return field;
     }
   }
   return null;
 }
 /** @return the field that represents the status (or null if none is found) */
 public LogTableField getStatusField() {
   for (LogTableField field : fields) {
     if (field.isStatusField()) {
       return field;
     }
   }
   return null;
 }
 public boolean containsKeyField() {
   for (LogTableField field : fields) {
     if (field.isKey()) {
       return true;
     }
   }
   return false;
 }
 /**
  * Find a log table field in this log table definition. Use the id of the field to do the lookup.
  *
  * @param id the id of the field to search for
  * @return the log table field or null if nothing was found.
  */
 public LogTableField findField(String id) {
   for (LogTableField field : fields) {
     if (field.getId().equals(id)) {
       return field;
     }
   }
   return null;
 }
 /**
  * Return the subject in the form of a string for the specified ID.
  *
  * @param id the id of the field to look for.
  * @return the string of the subject (name of step) or null if nothing was found.
  */
 public String getSubjectString(String id) {
   LogTableField field = findField(id);
   if (field == null) {
     return null;
   }
   if (field.getSubject() == null) {
     return null;
   }
   return field.getSubject().toString();
 }
 public void loadFieldsXML(Node node) {
   int nr = XMLHandler.countNodes(node, BaseLogTable.XML_TAG);
   for (int i = 0; i < nr; i++) {
     Node fieldNode = XMLHandler.getSubNodeByNr(node, BaseLogTable.XML_TAG, i);
     String id = XMLHandler.getTagValue(fieldNode, "id");
     LogTableField field = findField(id);
     if (field == null && i < fields.size()) {
       field = fields.get(i); // backward compatible until we go GA
     }
     if (field != null) {
       field.setFieldName(XMLHandler.getTagValue(fieldNode, "name"));
       field.setEnabled("Y".equalsIgnoreCase(XMLHandler.getTagValue(fieldNode, "enabled")));
     }
   }
 }
  public void replaceMeta(BaseLogTable baseLogTable) {
    this.space = baseLogTable.space;
    this.databasesInterface = baseLogTable.databasesInterface;
    this.connectionName = baseLogTable.connectionName;
    this.schemaName = baseLogTable.schemaName;
    this.tableName = baseLogTable.tableName;
    this.timeoutInDays = baseLogTable.timeoutInDays;

    fields.clear();
    for (LogTableField field : baseLogTable.fields) {
      try {
        fields.add((LogTableField) field.clone());
      } catch (CloneNotSupportedException e) {
        throw new RuntimeException("Clone problem with the base log table", e);
      }
    }
  }
  /**
   * Save this core information of the log table to the repository using the specified attribute
   * interface.
   *
   * @param attributeInterface The attribute interface to use to set attributes
   * @throws KettleException
   */
  public void saveToRepository(RepositoryAttributeInterface attributeInterface)
      throws KettleException {
    attributeInterface.setAttribute(
        getLogTableCode() + PROP_LOG_TABLE_CONNECTION_NAME, getConnectionName());
    attributeInterface.setAttribute(
        getLogTableCode() + PROP_LOG_TABLE_SCHEMA_NAME, getSchemaName());
    attributeInterface.setAttribute(getLogTableCode() + PROP_LOG_TABLE_TABLE_NAME, getTableName());
    attributeInterface.setAttribute(
        getLogTableCode() + PROP_LOG_TABLE_TIMEOUT_DAYS, getTimeoutInDays());

    // Store the fields too...
    //
    for (int i = 0; i < getFields().size(); i++) {
      LogTableField field = getFields().get(i);
      attributeInterface.setAttribute(
          getLogTableCode() + PROP_LOG_TABLE_FIELD_ID + i, field.getId());
      attributeInterface.setAttribute(
          getLogTableCode() + PROP_LOG_TABLE_FIELD_NAME + i, field.getFieldName());
      attributeInterface.setAttribute(
          getLogTableCode() + PROP_LOG_TABLE_FIELD_ENABLED + i, field.isEnabled());

      if (field.isSubjectAllowed()) {
        attributeInterface.setAttribute(
            getLogTableCode() + PROP_LOG_TABLE_FIELD_SUBJECT + i,
            field.getSubject() == null ? null : field.getSubject().toString());
      }
    }
  }
 public void loadFromRepository(RepositoryAttributeInterface attributeInterface)
     throws KettleException {
   String connectionNameFromRepository =
       attributeInterface.getAttributeString(getLogTableCode() + PROP_LOG_TABLE_CONNECTION_NAME);
   if (connectionNameFromRepository != null) {
     connectionName = connectionNameFromRepository;
   }
   String schemaNameFromRepository =
       attributeInterface.getAttributeString(getLogTableCode() + PROP_LOG_TABLE_SCHEMA_NAME);
   if (schemaNameFromRepository != null) {
     schemaName = schemaNameFromRepository;
   }
   String tableNameFromRepository =
       attributeInterface.getAttributeString(getLogTableCode() + PROP_LOG_TABLE_TABLE_NAME);
   if (tableNameFromRepository != null) {
     tableName = tableNameFromRepository;
   }
   timeoutInDays =
       attributeInterface.getAttributeString(getLogTableCode() + PROP_LOG_TABLE_TIMEOUT_DAYS);
   for (int i = 0; i < getFields().size(); i++) {
     String id =
         attributeInterface.getAttributeString(getLogTableCode() + PROP_LOG_TABLE_FIELD_ID + i);
     // Only read further if the ID is available.
     // For backward compatibility, this might not be provided yet!
     //
     if (id != null) {
       LogTableField field = findField(id);
       if (field != null) {
         field.setFieldName(
             attributeInterface.getAttributeString(
                 getLogTableCode() + PROP_LOG_TABLE_FIELD_NAME + i));
         field.setEnabled(
             attributeInterface.getAttributeBoolean(
                 getLogTableCode() + PROP_LOG_TABLE_FIELD_ENABLED + i));
         if (field.isSubjectAllowed()) {
           field.setSubject(
               attributeInterface.getAttributeString(
                   getLogTableCode() + PROP_LOG_TABLE_FIELD_SUBJECT + i));
         }
       }
     }
   }
 }
  protected String getFieldsXML() {
    StringBuffer retval = new StringBuffer();

    for (LogTableField field : fields) {
      retval.append(XMLHandler.openTag(XML_TAG));

      retval.append(XMLHandler.addTagValue("id", field.getId(), false));
      retval.append(XMLHandler.addTagValue("enabled", field.isEnabled(), false));
      retval.append(XMLHandler.addTagValue("name", field.getFieldName(), false));
      if (field.isSubjectAllowed()) {
        retval.append(
            XMLHandler.addTagValue(
                "subject",
                field.getSubject() == null ? null : field.getSubject().toString(),
                false));
      }

      retval.append(XMLHandler.closeTag(XML_TAG));
    }

    return retval.toString();
  }