# 自定义解析器扩展功能更新日志 ## 版本:10.1.17+ **更新日期:** 2024-10-17 --- ## 🎉 新增功能:自定义解析器扩展 ### 概述 用户在依赖本项目 Maven 坐标后,可以自己实现解析器接口,并通过注册机制将自定义解析器集成到系统中。 ### 核心变更 #### 1. 新增类 ##### CustomParserConfig.java - **位置:** `cn.qaiu.parser.custom.CustomParserConfig` - **功能:** 自定义解析器配置类 - **主要字段:** - `type`: 解析器类型标识(唯一,必填) - `displayName`: 显示名称(必填) - `toolClass`: 解析工具类(必填,必须实现IPanTool接口) - `standardUrlTemplate`: 标准URL模板(可选) - `panDomain`: 网盘域名(可选) - **使用方式:** 通过 Builder 模式构建 - **验证机制:** - 自动验证 toolClass 是否实现 IPanTool 接口 - 自动验证 toolClass 是否有 ShareLinkInfo 单参构造器 - 验证必填字段是否为空 ##### CustomParserRegistry.java - **位置:** `cn.qaiu.parser.custom.CustomParserRegistry` - **功能:** 自定义解析器注册中心 - **主要方法:** - `register(CustomParserConfig)`: 注册解析器 - `unregister(String type)`: 注销解析器 - `get(String type)`: 获取解析器配置 - `contains(String type)`: 检查是否已注册 - `clear()`: 清空所有注册 - `size()`: 获取注册数量 - `getAll()`: 获取所有配置 - **特性:** - 线程安全(使用 ConcurrentHashMap) - 自动检查类型冲突(与内置解析器) - 防止重复注册 #### 2. 修改的类 ##### ParserCreate.java - **新增字段:** - `customParserConfig`: 自定义解析器配置 - `isCustomParser`: 是否为自定义解析器标识 - **新增构造器:** - `ParserCreate(CustomParserConfig, ShareLinkInfo)`: 自定义解析器专用构造器 - **修改的方法:** - `fromType(String type)`: 优先查找自定义解析器,再查找内置解析器 - `createTool()`: 支持创建自定义解析器工具实例 - `normalizeShareLink()`: 自定义解析器抛出不支持异常 - `shareKey(String)`: 支持自定义解析器的 shareKey 设置 - `getStandardUrlTemplate()`: 支持返回自定义解析器的模板 - `genPathSuffix()`: 支持生成自定义解析器的路径 - **新增方法:** - `isCustomParser()`: 判断是否为自定义解析器 - `getCustomParserConfig()`: 获取自定义解析器配置 - `getPanDomainTemplate()`: 获取内置解析器模板 #### 3. 测试类 ##### CustomParserTest.java - **位置:** `cn.qaiu.parser.custom.CustomParserTest` - **测试覆盖:** - ✅ 注册自定义解析器 - ✅ 重复注册检测 - ✅ 与内置类型冲突检测 - ✅ 注销解析器 - ✅ 创建工具实例 - ✅ fromShareUrl 不支持自定义解析器 - ✅ normalizeShareLink 不支持 - ✅ 生成路径后缀 - ✅ 配置验证 - ✅ 工具类验证 #### 4. 文档 ##### CUSTOM_PARSER_GUIDE.md - **位置:** `parser/doc/CUSTOM_PARSER_GUIDE.md` - **内容:** 完整的自定义解析器扩展指南 - 使用步骤 - API 参考 - 完整示例 - 常见问题 ##### CUSTOM_PARSER_QUICKSTART.md - **位置:** `parser/doc/CUSTOM_PARSER_QUICKSTART.md` - **内容:** 5分钟快速开始指南 - 快速集成步骤 - 可运行示例 - Spring Boot 集成 - 常见问题速查 ##### README.md(更新) - **位置:** `parser/README.md` - **更新内容:** - 新增自定义解析器扩展章节 - 添加快速示例 - 更新核心 API 列表 - 添加文档链接 --- ## 🔒 设计约束 ### 1. 创建限制 **自定义解析器只能通过 `fromType` 方法创建** ```java // ✅ 支持 ParserCreate.fromType("mypan") .shareKey("abc123") .createTool(); // ❌ 不支持 ParserCreate.fromShareUrl("https://mypan.com/s/abc123"); ``` **原因:** 自定义解析器没有正则表达式来匹配分享链接 ### 2. 方法限制 自定义解析器不支持 `normalizeShareLink()` 方法 ```java ParserCreate parser = ParserCreate.fromType("mypan"); parser.normalizeShareLink(); // ❌ 抛出 UnsupportedOperationException ``` ### 3. 类型唯一性 - 自定义解析器类型不能与内置类型冲突 - 不能重复注册相同类型 ### 4. 构造器要求 解析器工具类必须提供 `ShareLinkInfo` 单参构造器: ```java public class MyTool implements IPanTool { public MyTool(ShareLinkInfo info) { // 必须 // ... } } ``` --- ## 💡 使用场景 ### 1. 企业内部网盘 为企业内部网盘系统添加解析支持 ### 2. 私有部署网盘 支持私有部署的网盘服务(如 Cloudreve、可道云的自定义实例) ### 3. 新兴网盘服务 快速支持新出现的网盘服务,无需等待官方更新 ### 4. 临时解析方案 在等待官方支持期间的临时解决方案 --- ## 📦 影响范围 ### 兼容性 - ✅ **向后兼容**:不影响现有功能 - ✅ **可选功能**:不使用则无影响 - ✅ **独立模块**:与内置解析器解耦 ### 依赖关系 - 无新增外部依赖 - 使用已有的 `ShareLinkInfo`、`IPanTool` 等接口 ### 性能影响 - 注册查找:O(1) 时间复杂度(HashMap) - 内存占用:每个注册器约 1KB - 线程安全:使用 ConcurrentHashMap,无锁竞争 --- ## 🚀 升级指南 ### 现有用户 无需任何改动,所有现有功能保持不变。 ### 新用户 参考文档快速集成: 1. [快速开始](doc/CUSTOM_PARSER_QUICKSTART.md) 2. [完整指南](doc/CUSTOM_PARSER_GUIDE.md) --- ## 📝 示例代码 ### 最小示例(3步) ```java // 1. 实现接口 class MyTool implements IPanTool { public MyTool(ShareLinkInfo info) {} public Future parse() { /* ... */ } } // 2. 注册 CustomParserRegistry.register( CustomParserConfig.builder() .type("mypan") .displayName("我的网盘") .toolClass(MyTool.class) .build() ); // 3. 使用 IPanTool tool = ParserCreate.fromType("mypan") .shareKey("abc") .createTool(); String url = tool.parseSync(); ``` --- ## 🎯 下一步计划 ### 潜在增强 - [ ] 支持解析器优先级 - [ ] 支持解析器热更新 - [ ] 添加解析器性能监控 - [ ] 提供解析器开发脚手架 ### 社区贡献 欢迎提交优秀的自定义解析器实现,我们将评估后合并到内置解析器中。 --- ## 🤝 贡献者 - [@qaiu](https://github.com/qaiu) - 设计与实现 ## 📄 许可 MIT License --- **完整文档:** - [自定义解析器扩展指南](doc/CUSTOM_PARSER_GUIDE.md) - [快速开始指南](doc/CUSTOM_PARSER_QUICKSTART.md) - [测试用例](src/test/java/cn/qaiu/parser/CustomParserTest.java)