/**
   * 指定したパスに配置されているCSVファイルを読み込み、Agentデータを生成する。
   *
   * @param parent CSVファイルが配置されているディレクトリ。
   * @param filename CSVファイル名。
   * @return 読み込みに成功した結果、生成されたAgentオブジェクト。
   * @throws IOException 読み込みに失敗した場合。
   */
  public Agent load(String parent, String filename) throws IOException {
    Agent agent = null;

    // ディレクトリとファイル名からFileオブジェクトを生成する
    File csvFile = new File(parent, filename);

    // CSVファイルリーダー
    ICsvBeanReader reader = null;
    try {
      // Excelの読み込み規則を使用してCSVファイルを読み込む
      reader = new CsvBeanReader(new FileReader(csvFile), CsvPreference.EXCEL_PREFERENCE);

      // ヘッダを取得する
      final String[] headers = reader.getHeader(true);

      // Agentを生成し、1行1個のVarbindを生成し格納する
      agent = new Agent();
      while (true) {
        SnmpVarbind varbind = reader.read(SnmpVarbind.class, headers, PROCESSORS);
        if (varbind == null) {
          break;
        }

        agent.addVarbind(varbind);
      }
    } catch (SuperCsvException exception) {
      IOException ioex = new IOException(exception.getLocalizedMessage());
      throw ioex;
    } finally {
      // 開かれているReaderはクローズする
      if (reader != null) {
        try {
          reader.close();
        } catch (IOException ioex) {
        }
      }
    }

    return agent;
  }
 /**
  * テスト用のメインメソッド。
  *
  * @param args 読み込むデータファイル。
  * @throws Exception
  */
 public static void main(String[] args) throws Exception {
   AgentMIBCSVLoader loader = new AgentMIBCSVLoader();
   Agent agent = loader.load(".", args[0]);
   System.out.println(agent.toString());
 }
  /** {@inheritDoc} */
  public PDU processPdu(PDU pdu) throws SnmpToolkitException {
    Log log = LogFactory.getLog(this.getClass());

    // 応答用のPDUを生成する
    PDU retPdu = new PDU();
    retPdu.setType(PDU.RESPONSE);

    // 要求のリクエストIDを取得し、応答PDUにセットする
    Integer32 requestID = pdu.getRequestID();
    retPdu.setRequestID(requestID);

    // SNMP4J用の型変換オブジェクト
    SnmpVariableHelper varHelper = new Snmp4jVariableHelper();

    // AgentServiceからAgentを取得する
    Agent agent = this.agentService_.getAgent();

    // 要求PDUのVarbindを走査する
    int varCount = 0;
    List<?> reqVarbinds = pdu.getVariableBindings();
    for (Object reqVarbindObj : reqVarbinds) {
      varCount++;

      // 要求されているOIDを取得する
      VariableBinding reqVarbind = (VariableBinding) reqVarbindObj;
      OID oid = reqVarbind.getOid();

      // GETNEXTでない場合は、指定されたOIDそのものを取得しようとする
      // GETNEXTの場合は、指定されたOID配下で最も近いオブジェクトを探す
      boolean exact = (pdu.getType() != PDU.GETNEXT);
      SnmpVarbind foundVarbind = agent.findObject(oid.toString(), exact);
      if (foundVarbind == null) {
        // Varbindが見つからなかった場合はnoSuchNameを返す
        log.warn("varbind is not found. oid=" + oid.toString());

        retPdu.setErrorStatus(SnmpConstants.SNMP_ERROR_NO_SUCH_NAME);
        retPdu.setErrorIndex(varCount);

        Variable retObject = new Null();
        VariableBinding retVarbind = new VariableBinding(oid, retObject);
        retPdu.add(retVarbind);
        break;
      }

      // READ-WRITEでなければエラー応答を返す
      String accessibility = foundVarbind.getAccessibility();
      if (accessibility.equals(SnmpVarbind.ACCESSIBILITY_NOT_ACCESSIBLE) == true) {
        log.warn("varbind is not accessible. accessibility=" + accessibility);

        retPdu.setErrorStatus(SnmpConstants.SNMP_ERROR_NO_ACCESS);
        retPdu.setErrorIndex(varCount);

        Variable retObject = new Null();
        VariableBinding retVarbind = new VariableBinding(oid, retObject);
        retPdu.add(retVarbind);
        break;
      }

      try {
        // 正常の応答を返す
        retPdu.setErrorStatus(SnmpConstants.SNMP_ERROR_SUCCESS);
        retPdu.setErrorIndex(0);

        log.debug("varbind is found: " + foundVarbind.toString());
        String typeStr = foundVarbind.getType();
        Object retValueObj = foundVarbind.getValue();
        Variable retObject = (Variable) varHelper.createAsnObject(retValueObj, typeStr);

        OID retOID = new OID(foundVarbind.getOid());
        VariableBinding retVarbind = new VariableBinding(retOID, retObject);
        retPdu.add(retVarbind);
      } catch (Exception exception) {
        log.warn("exception occured", exception);

        // 未知のエラーを示す応答PDUを作成する
        retPdu.setErrorStatus(SnmpConstants.SNMP_ERROR_GENERAL_ERROR);
        retPdu.setErrorIndex(varCount);

        if (foundVarbind != null) {
          OID retOID = new OID(foundVarbind.getOid());
          Variable retObject = new Null();
          VariableBinding retVarbind = new VariableBinding(retOID, retObject);
          retPdu.add(retVarbind);
        }
      }
    }
    return retPdu;
  }