นากกายต้นฉบับกำลังลองแผ่นรูปทรงไฟล์ผ่านแม่แบบช่องรับบนโต๊ะสว่าง

Java PathMatcher: คอมไพล์ glob ครั้งเดียวแล้วตรวจ path ตาม filesystem

พี่โชว์Engineering

build tool ที่รับ pattern เช่น src/**/*.java ไม่ควรแปลง glob เป็น regex เฉพาะกิจทุกครั้งครับ FileSystem.getPathMatcher สร้าง matcher จาก syntax glob: หรือ regex: ตาม filesystem provider แล้วนำไปใช้ซ้ำกับ path หลายเส้นได้

WHY: แม่แบบรูปทรงกับรั้วพื้นที่เป็นคนละชิ้น

Glob ตอบว่า path มีรูปแบบตรงหรือไม่ เหมือนแม่แบบตรวจว่าชิ้นงานทรงถูกต้อง แต่มันไม่ได้ยืนยันว่าชิ้นงานมาจากโกดังที่อนุญาต หากใช้เป็น allowlist ต้องตรวจ containment หลัง normalize/resolve และจัดการ symlink ตาม threat model แยกต่างหาก

import java.nio.file.FileSystems;
import java.nio.file.Path;
import java.nio.file.PathMatcher;
import java.util.List;

public class Main {
  static List<Path> javaFiles(List<Path> paths) {
    PathMatcher matcher = FileSystems.getDefault().getPathMatcher("glob:**/*.java");
    return paths.stream().filter(matcher::matches).toList();
  }

  public static void main(String[] args) {
    List<Path> input = List.of(
        Path.of("src/app/Main.java"),
        Path.of("src/app/config.yaml"),
        Path.of("test/MainTest.java")
    );
    assert javaFiles(input).equals(List.of(
        Path.of("src/app/Main.java"),
        Path.of("test/MainTest.java")
    ));
    assert javaFiles(List.of()).isEmpty();
  }
}

Portability ต้องทดสอบบน provider เป้าหมาย

Separator, case sensitivity และรายละเอียด glob ขึ้นกับ filesystem implementation อย่าเขียน test บน macOS แล้วสรุปว่า behavior บน Linux/Windows เหมือนกันทั้งหมด หาก policy ข้ามแพลตฟอร์ม ให้ normalize representation ที่ชัดและมี fixture ต่อระบบ

Matcher ไม่อ่านดิสก์ จึงเหมาะทดสอบ pattern แยกจาก file walk ตอนเดินไฟล์จริงให้ปิด stream, ไม่ follow symlink เป็นค่าเริ่มต้นเมื่อไม่จำเป็น และตรวจ root หลัง toRealPath() หากต้องกัน escape ออกจาก workspace

Recap

  • คอมไพล์ matcher ครั้งเดียวแล้วใช้ซ้ำ
  • แยก pattern matching ออกจาก containment/security boundary
  • ทดสอบ separator และ case บน filesystem เป้าหมาย
  • กำหนด symlink policy ก่อนเดินไฟล์จริง