クエリパラメータをキー名変換マップをもとにキー名を変更

Java 17

## 方法１. 変換表のMapを宣言＆設定(プログラム内でput)

変換後のキーと値のリストを List<String> にまとめる。
String.join("&") を使って "key=value" のリストを結合。
LinkedHashMap を使うことで元の順序を維持。

```java
Map<String, String> KEY_MAPPING = new HashMap<>();
KEY_MAPPING.put("oldKey1", "newKey1");
KEY_MAPPING.put("oldKey2", "newKey2");

String queryString = "oldKey1=value1&oldKey2=value2&otherKey=value3&oldKey1=value4";

if (StringUtils.isEmpty(queryString)) {
  // 文字列がnullか空文字の時は処理をしない
} else {
  // クエリ文字列をパースして変換
  Map<String, List<String>> convertedParams = new LinkedHashMap<>();

  // クエリ文字列を "&" で分割
  String[] pairs = queryString.split("&");

  for (String pair : pairs) {
      String[] keyValue = pair.split("=", 2);
      String oldKey = keyValue[0];
      String value = keyValue.length > 1 ? keyValue[1] : "";

      // 変換マップを使用してキー名を変更
      String newKey = KEY_MAPPING.getOrDefault(oldKey, oldKey);

      // 変換後のパラメータをマップに格納（リストで管理）
      convertedParams.computeIfAbsent(newKey, k -> new ArrayList<>()).add(value);
  }

  // 変換後のパラメータをクエリ文字列に戻す
  List<String> paramList = new ArrayList<>();

  for (Map.Entry<String, List<String>> entry : convertedParams.entrySet()) {
      String key = entry.getKey();
      for (String value : entry.getValue()) {
          paramList.add(key + "=" + value);
      }
  }

  String restoredQuery = String.join("&", paramList);

  System.out.println("restoredQuery: " + restoredQuery);
}
```

実行結果

```sh
restoredQuery: newKey1=value1&newKey1=value4&newKey2=value2&otherKey=value3
```

## 方法2. 変換表のMapを宣言＆設定(プロパティファイルから読み込み)

```:src/main/resources/key_mapping.properties
oldKey1=newKey1
oldKey2=newKey2
```

```java
Map<String, String> KEY_MAPPING = loadKeyMappings("key_mapping");

String queryString = "oldKey1=value1&oldKey2=value2&otherKey=value3&oldKey1=value4";

if (StringUtils.isEmpty(queryString)) {
  // 文字列がnullか空文字の時は処理をしない
} else {
  // クエリ文字列をパースして変換
  Map<String, List<String>> convertedParams = new LinkedHashMap<>();

  // クエリ文字列を "&" で分割
  String[] pairs = queryString.split("&");

  for (String pair : pairs) {
      String[] keyValue = pair.split("=", 2);
      String oldKey = keyValue[0];
      String value = keyValue.length > 1 ? keyValue[1] : "";

      // 変換マップを使用してキー名を変更
      String newKey = KEY_MAPPING.getOrDefault(oldKey, oldKey);

      // 変換後のパラメータをマップに格納（リストで管理）
      convertedParams.computeIfAbsent(newKey, k -> new ArrayList<>()).add(value);
  }

  // 変換後のパラメータをクエリ文字列に戻す
  List<String> paramList = new ArrayList<>();

  for (Map.Entry<String, List<String>> entry : convertedParams.entrySet()) {
      String key = entry.getKey();
      for (String value : entry.getValue()) {
          paramList.add(key + "=" + value);
      }
  }

  String restoredQuery = String.join("&", paramList);

  System.out.println("restoredQuery: " + restoredQuery);
}

private Map<String, String> loadKeyMappings(String baseName) {
    Map<String, String> keyMap = new HashMap<>();

    try {
        ResourceBundle bundle = ResourceBundle.getBundle(baseName);
        for (String key : bundle.keySet()) {
            String value = bundle.getString(key);
            
            if (StringUtils.isEmpty(value)) {
                throw new IllegalArgumentException("エラー: キー '" + key + "' の値が空です。プロパティファイルを修正してください。");
            }

            keyMap.put(key, value);
        }
    } catch (MissingResourceException e) {
        System.err.println("エラー: プロパティファイル '" + baseName + ".properties' が見つかりません。");
        throw e; // そのまま例外を投げて処理を中断
    }

    return keyMap;
}
```

実行結果

```sh
restoredQuery: newKey1=value1&newKey1=value4&newKey2=value2&otherKey=value3
```