GOODBOY008 opened a new issue, #686:
URL: https://github.com/apache/fesod/issues/686

   ## Abstract
   
   This proposal suggests restructuring Apache Fesod from a monolithic module 
into a multi-module Maven project, separating functionality by Excel format 
(CSV, XLS, XLSX). This change will improve modularity, reduce dependency bloat, 
and provide users with more flexibility in choosing which formats to support.
   
   ## Motivation
   
   ### Current Challenges
   
   The current monolithic structure of Apache Fesod has several limitations 
that impact both users and contributors:
   
   1. **Unnecessary Dependencies**: Users who only need CSV support must still 
include POI libraries (for XLS/XLSX), adding ~10MB of dependencies.
   
   2. **Tight Coupling**: Format-specific code (CSV, XLS, XLSX) is intermingled 
within the same module, making it difficult to:
      - Understand which code handles which format
      - Modify one format without risk of affecting others
      - Add new formats without touching existing code
   
   3. **Complex Codebase Navigation**: The current structure uses conditional 
logic (switch statements) to handle different formats, scattered across 
multiple classes.
   
   4. **Testing Complexity**: Unit tests for all formats are mixed together, 
making it harder to:
      - Run format-specific tests
      - Identify which tests cover which functionality
      - Maintain test isolation
   
   5. **Example Code Confusion**: The fesod-examples module contains a mix of 
actual examples (in `demo` package) and temporary test code (in `temp` 
package), with unclear purpose.
   
   ### Benefits of Multi-Module Architecture
   
   **For End Users**:
   - Smaller dependency footprint (include only needed formats)
   
   **For Contributors**:
   - Easier to understand and modify format-specific code
   - Reduced risk of cross-format bugs
   - Clearer test organization
   
   **For the Project**:
   - Better separation of concerns
   - Potential for independent format evolution
   - Clearer module boundaries and responsibilities
   - Improved code maintainability
   
   ## Current Architecture
   
   ### Existing Module Structure
   
   Apache Fesod currently consists of two Maven modules:
   
   | Module         | Artifact ID                           | Description       
                         | Current Issues                           |
   
|----------------|---------------------------------------|--------------------------------------------|------------------------------------------|
   | fesod          | org.apache.fesod:fesod:1.3.0          | Main library with 
all Excel format support | Monolithic, all formats bundled together |
   | fesod-examples | org.apache.fesod:fesod-examples:1.3.0 | Examples and test 
code                     | Mixed examples and temporary code        |
   
   ## Proposed Architecture
   
   ### Proposed Module Structure
   
   The refactored project will have the following module hierarchy:
   
   ```
   fesod-parent (root POM)
   ├── fesod-core (shared infrastructure)
   ├── fesod-csv (CSV format support)
   ├── fesod-xls (XLS/BIFF8 format support)
   ├── fesod-xlsx (XLSX/OOXML format support)
   ├── fesod-all (backward compatibility aggregator)
   └── fesod-examples (usage examples)
   ```
   
   ## Dependency Graph
   
   ```mermaid
   graph TD
       A[fesod-core] --> B[Common Dependencies]
       C[fesod-csv] --> A
       C --> D[commons-csv]
       E[fesod-xls] --> A
       E --> F[poi]
       G[fesod-xlsx] --> A
       G --> H[poi-ooxml]
       H --> F
       I[fesod-examples] --> C
       I --> E
       I --> G
       I --> J[Spring Boot]
       B --> K[ehcache]
       B --> L[commons-io]
       B --> M[slf4j-api]
   ```
   
   ## Module Interaction Patterns
   
   ### Read Operation Flow (Sample)
   
   ```mermaid
   sequenceDiagram
       participant User
       participant Factory
       participant Core
       participant FormatModule as Format Module (CSV/XLS/XLSX)
       
       User->>Factory: FastExcel.read(file)
       Factory->>Core: Detect format (ExcelTypeEnum)
       Factory->>FormatModule: ServiceLoader discover provider
       FormatModule->>Factory: Return format provider
       Factory->>FormatModule: Create ExcelReader
       FormatModule->>Core: Use core metadata & converters
       FormatModule->>User: Return configured reader
       User->>FormatModule: Execute read operation
       FormatModule->>Core: Fire events & process data
       Core->>User: Deliver parsed data via listeners
   ```
   
   ## Compatibility and Migration
   
   ### Backward Compatibility Strategy
   
   To ensure a smooth transition for existing users, we will provide multiple 
compatibility mechanisms:
   
   ### For Existing Users
   
   Users who upgrade will have two migration paths:
   
   **Option 1: No Changes Required (Recommended for initial adoption)**
   
   Continue using the aggregator module with the same Maven coordinates:
   
   ```xml
   <dependency>
       <groupId>org.apache.fesod</groupId>
       <artifactId>fesod</artifactId>
       <version>2.0.0</version>
   </dependency>
   ```
   
   The `fesod` artifact will become an aggregator that includes all format 
modules, maintaining complete backward compatibility.
   
   **Option 2: Selective Module Usage (For optimization)**
   
   Choose only the formats needed:
   
   ```xml
   <!-- Core + CSV only -->
   <dependency>
       <groupId>org.apache.fesod</groupId>
       <artifactId>fesod-core</artifactId>
       <version>2.0.0</version>
   </dependency>
   <dependency>
       <groupId>org.apache.fesod</groupId>
       <artifactId>fesod-csv</artifactId>
       <version>2.0.0</version>
   </dependency>
   ```
   
   ---
   
   *This proposal is open for community discussion and will be updated based on 
feedback.*
   


-- 
This is an automated message from the Apache Git Service.
To respond to the message, please log on to GitHub and use the
URL above to go to the specific comment.

To unsubscribe, e-mail: [email protected]

For queries about this service, please contact Infrastructure at:
[email protected]


---------------------------------------------------------------------
To unsubscribe, e-mail: [email protected]
For additional commands, e-mail: [email protected]

Reply via email to