/**
   * Filters tag's tuning parameters form functional block's tuning parameters string.
   *
   * @throws FileNotFoundException
   * @throws IOException
   * @param tagRecord Yokogawa tag record instance
   * @param blockTunningParameters Tag's parent block tuning parameters string
   * @return Tag's tuning parameters hash
   */
  private HashMap<String, String> _readTagTuningParameters(
      YgTagRecord tagRecord, String blockTunningParameters) {
    HashMap<String, String> result = new HashMap();
    int tagParamsStartPos = blockTunningParameters.indexOf(tagRecord.getTagName().trim() + ":");
    int tagParamsEndPos = blockTunningParameters.indexOf(";", tagParamsStartPos);

    if (tagParamsStartPos > -1) {
      String tagTunnigParams = blockTunningParameters.substring(tagParamsStartPos, tagParamsEndPos);
      String[] paramsAndValues = tagTunnigParams.split(",");
      String[] tempParamAndValuePair;

      for (String tempParamAndValue : paramsAndValues) {
        tempParamAndValuePair = tempParamAndValue.split("=");
        if (tempParamAndValuePair.length > 1)
          result.put(tempParamAndValuePair[0], tempParamAndValuePair[1]);
      } // for
    } // if

    return result;
  } // _readTagTuningParameters
  /**
   * Creates from Yokogawa backup data and adds system tag to current data source.
   *
   * @throws Exception
   * @param tagRecord Yokogawa tag record instance
   * @param units Engineering units list
   * @param tagTunningParams Tag's tuning parameters hash
   * @param blockTuningParams Tag's block tuning parameters string
   */
  private void _createSystemTagInstance(
      YgTagRecord tagRecord,
      List<String> units,
      HashMap<String, String> tagTunningParams,
      String blockTuningParams)
      throws Exception {
    Tag tag = addTag(tagRecord.getTagName().trim());

    TagSetting setting;
    Double tempDouble;
    String existingAlarms;
    int hhllParamStartIndex = blockTuningParams.indexOf("HHLL:");
    int hhllParamEndIndex;
    int inhlParamStartIndex = blockTuningParams.indexOf("INHL:");
    int inhlParamEndIndex;

    // If tag's settngs contain "trip" setpoints:
    if (hhllParamStartIndex > -1) {
      hhllParamEndIndex = blockTuningParams.indexOf(";", hhllParamStartIndex);
      existingAlarms = blockTuningParams.substring(hhllParamStartIndex + 5, hhllParamEndIndex);

      // If tag's settngs contain both low and high "trip" settings:
      if (existingAlarms.equals("HHLL")) {
        if (tagTunningParams.containsKey("LL")) {
          setting = new TagSetting();
          setting.setTypeId(SettingsTypes.ALARM_LL_SETTING.ID);
          setting.setValue(new Double(tagTunningParams.get("LL")).toString());
          addTagSetting(tag, setting);
        } // if

        if (tagTunningParams.containsKey("HH")) {
          setting = new TagSetting();
          setting.setTypeId(SettingsTypes.ALARM_HH_SETTING.ID);
          setting.setValue(new Double(tagTunningParams.get("HH")).toString());
          addTagSetting(tag, setting);
        } // if
      } // if

      // If tag's settngs contain only high "trip" setting:
      else if (existingAlarms.equals("HH")) {
        if (tagTunningParams.containsKey("HH")) {
          setting = new TagSetting();
          setting.setTypeId(SettingsTypes.ALARM_HH_SETTING.ID);
          setting.setValue(new Double(tagTunningParams.get("HH")).toString());
          addTagSetting(tag, setting);
        } // if
      } // if

      // If tag's settngs contain only low "trip" setting:
      else if (existingAlarms.equals("LL")) {
        if (tagTunningParams.containsKey("LL")) {
          setting = new TagSetting();
          setting.setTypeId(SettingsTypes.ALARM_LL_SETTING.ID);
          setting.setValue(new Double(tagTunningParams.get("LL")).toString());
          addTagSetting(tag, setting);
        } // if
      } // if
    } // if

    // If tag's setting contain alarm setpoints:
    if (inhlParamStartIndex > -1) {
      inhlParamEndIndex = blockTuningParams.indexOf(";", inhlParamStartIndex);
      existingAlarms = blockTuningParams.substring(inhlParamStartIndex + 5, inhlParamEndIndex);

      // If tag's settings contain both alarm low and alarm high setpoints:
      if (existingAlarms.equals("HL")) {
        if (tagTunningParams.containsKey("PL")) {
          setting = new TagSetting();
          setting.setTypeId(SettingsTypes.ALARM_L_SETTING.ID);
          setting.setValue(new Double(tagTunningParams.get("PL")).toString());
          addTagSetting(tag, setting);
        } // if

        if (tagTunningParams.containsKey("PH")) {
          setting = new TagSetting();
          setting.setTypeId(SettingsTypes.ALARM_H_SETTING.ID);
          setting.setValue(new Double(tagTunningParams.get("PH")).toString());
          addTagSetting(tag, setting);
        } // if
      } // if

      // If tag's settings contain alarm high setpoint:
      else if (existingAlarms.equals("H")) {
        if (tagTunningParams.containsKey("PH")) {
          setting = new TagSetting();
          setting.setTypeId(SettingsTypes.ALARM_H_SETTING.ID);
          setting.setValue(new Double(tagTunningParams.get("PH")).toString());
          addTagSetting(tag, setting);
        } // if
      } // if

      // If tag's settings contain alarm low setpoint:
      else if (existingAlarms.equals("L")) {
        if (tagTunningParams.containsKey("PL")) {
          setting = new TagSetting();
          setting.setTypeId(SettingsTypes.ALARM_L_SETTING.ID);
          setting.setValue(new Double(tagTunningParams.get("PL")).toString());
          addTagSetting(tag, setting);
        } // if
      } // if
    } // if

    // Add range min settng:
    tempDouble = tagRecord.getSl() / Math.pow(10, tagRecord.getDp());
    setting = new TagSetting();
    setting.setTypeId(SettingsTypes.RANGE_MIN_SETTING.ID);
    setting.setValue(tempDouble.toString());
    addTagSetting(tag, setting);

    // Add range max settng:
    tempDouble = tagRecord.getSh() / Math.pow(10, tagRecord.getDp());
    setting = new TagSetting();
    setting.setTypeId(SettingsTypes.RANGE_MAX_SETTING.ID);
    setting.setValue(tempDouble.toString());
    addTagSetting(tag, setting);

    // Add engineering units setting:
    if (tagRecord.getEngUnitsIndex() < units.size()) {
      setting = new TagSetting();
      setting.setTypeId(SettingsTypes.UNITS_SETTING.ID);
      setting.setValue(units.get(tagRecord.getEngUnitsIndex()));
      addTagSetting(tag, setting);
    } // if
  } // _createSystemTagInstance