/** {@inheritDoc} */
  @Override
  public void updateFarm(Long farmNo, String comment, String domainName) {
    // 引数チェック
    if (farmNo == null) {
      throw new AutoApplicationException("ECOMMON-000003", "farmNo");
    }

    // TODO: 長さチェック(comment,domainName)

    // TODO: 形式チェック(domainName)

    // ファームの存在チェック
    Farm farm = farmDao.read(farmNo);
    if (farm == null) {
      // ファームが存在しない場合
      throw new AutoApplicationException("ESERVICE-000204", farmNo);
    }

    if (!farm.getDomainName().equals(domainName)) {
      // ドメイン名を変更しようとした場合

      // 全てのインスタンスが停止状態であることのチェック
      List<Instance> instances = instanceDao.readByFarmNo(farmNo);
      for (Instance instance : instances) {
        if (InstanceStatus.fromStatus(instance.getStatus()) != InstanceStatus.STOPPED) {
          // インスタンスが停止状態でない場合
          throw new AutoApplicationException("ESERVICE-000205", instance.getInstanceName());
        }
      }

      // ドメイン名の一意チェック
      // TODO: データベース上で一意キーを設定するべきか?
      List<Farm> checkFarms = farmDao.readAll();
      for (Farm checkFarm : checkFarms) {
        if (checkFarm.getDomainName().equals(domainName)) {
          // 同名のドメイン名が存在する場合
          throw new AutoApplicationException("ESERVICE-000206", domainName);
        }
      }
    }

    // インスタンスの更新
    farm.setComment(comment);
    farm.setDomainName(domainName);
    farmDao.update(farm);

    // イベントログ出力
    eventLogger.log(
        EventLogLevel.INFO,
        farmNo,
        farm.getFarmName(),
        null,
        null,
        null,
        null,
        "FarmUpdate",
        null,
        null,
        null);
  }