/** {@inheritDoc} */
  @Override
  public List<FarmDto> getFarms(Long userNo, Long loginUserNo) {

    // ユーザー取得
    User user = userDao.read(loginUserNo);
    // 検索結果ファーム
    List<Farm> farms = new ArrayList<Farm>();
    // 戻り値用
    List<FarmDto> dtos = new ArrayList<FarmDto>();

    // パワーユーザは全権
    if (user.getPowerUser()) {
      farms = farmDao.readAll();
      for (Farm farm : farms) {
        FarmDto dto = new FarmDto();
        dto.setFarm(farm);
        dtos.add(dto);
      }
    }
    // マスターユーザー及び一般はマスター管理下
    else {
      // データ取得はマスターユーザ
      farms = farmDao.readByUserNo(userNo);

      // ユーザー権限取得
      List<UserAuth> userAuth = userAuthDao.readByUserNo(loginUserNo);
      HashMap<Long, Boolean> authMap = new HashMap<Long, Boolean>();
      for (UserAuth auth : userAuth) {
        if (auth.getFarmUse()) {
          authMap.put(auth.getFarmNo(), auth.getFarmUse());
        }
      }

      for (Farm farm : farms) {
        // 利用可能なファームのみ登録する ※マスターユーザーは全て
        if ((loginUserNo.equals(userNo)) || authMap.containsKey(farm.getFarmNo())) {
          FarmDto dto = new FarmDto();
          dto.setFarm(farm);
          dtos.add(dto);
        }
      }
    }

    // ソート
    Collections.sort(dtos, Comparators.COMPARATOR_FARM_DTO);

    return dtos;
  }
  /** {@inheritDoc} */
  @Override
  public Long createFarm(Long userNo, String farmName, String comment) {
    // 引数チェック
    if (userNo == null) {
      throw new AutoApplicationException("ECOMMON-000003", "userNo");
    }
    if (farmName == null || farmName.length() == 0) {
      throw new AutoApplicationException("ECOMMON-000003", "farmName");
    }

    // 形式チェック
    if (!Pattern.matches("^[0-9a-z]|[0-9a-z][0-9a-z-]*[0-9a-z]$", farmName)) {
      throw new AutoApplicationException("ECOMMON-000012", "farmName");
    }

    // TODO: 長さチェック

    // ファーム名の一意チェック
    Farm checkFarm = farmDao.readByFarmName(farmName);
    if (checkFarm != null) {
      // 同名のファームが存在する場合
      throw new AutoApplicationException("ESERVICE-000201", farmName);
    }

    // ファームのドメイン名
    // TODO: 設定値の取得方法をうまくする
    String domainName = farmName + "." + Config.getProperty("dns.domain");

    // ファームの作成
    Farm farm = new Farm();
    farm.setFarmName(farmName);
    farm.setUserNo(userNo);
    farm.setComment(comment);
    farm.setDomainName(domainName);
    farm.setScheduled(false);
    farm.setComponentProcessing(false);
    farmDao.create(farm);

    // ファームごとのホストグループ作成
    Boolean useZabbix = BooleanUtils.toBooleanObject(Config.getProperty("zabbix.useZabbix"));
    if (BooleanUtils.isTrue(useZabbix)) {
      zabbixHostProcess.createFarmHostgroup(farm.getFarmNo());
    }

    // VMware関連情報の作成
    List<Platform> platforms = platformDao.readAll();
    for (Platform platform : platforms) {
      if ("vmware".equals(platform.getPlatformType()) == false) {
        continue;
      }

      if (vmwareKeyPairDao.countByUserNoAndPlatformNo(userNo, platform.getPlatformNo()) > 0) {
        // 空いているVLANを取得
        VmwareNetwork publicNetwork = null;
        VmwareNetwork privateNetwork = null;
        List<VmwareNetwork> vmwareNetworks =
            vmwareNetworkDao.readByPlatformNo(platform.getPlatformNo());
        for (VmwareNetwork vmwareNetwork : vmwareNetworks) {
          if (vmwareNetwork.getFarmNo() != null) {
            continue;
          }
          if (BooleanUtils.isTrue(vmwareNetwork.getPublicNetwork())) {
            if (publicNetwork == null) {
              publicNetwork = vmwareNetwork;
            }
          } else {
            if (privateNetwork == null) {
              privateNetwork = vmwareNetwork;
            }
          }
        }

        // VLANを割り当て
        if (publicNetwork != null) {
          publicNetwork.setFarmNo(farm.getFarmNo());
          vmwareNetworkDao.update(publicNetwork);
        }
        if (privateNetwork != null) {
          privateNetwork.setFarmNo(farm.getFarmNo());
          vmwareNetworkDao.update(privateNetwork);
        }
      }
    }

    // イベントログ出力
    eventLogger.log(
        EventLogLevel.INFO,
        farm.getFarmNo(),
        farmName,
        null,
        null,
        null,
        null,
        "FarmCreate",
        null,
        null,
        null);

    return farm.getFarmNo();
  }