# Migration Guide: StreamResource to DownloadHandler
## Overview
Starting with version 3.1.0, Grid Exporter Add-on introduces new `DownloadHandler`-based methods to replace the deprecated `StreamResource` methods. This migration is necessary for forward compatibility: as of Vaadin 25, `StreamResource` is deprecated and marked for removal, and it will be removed in a future Vaadin release.
## What's Changing?
The Grid Exporter Add-on now provides two sets of methods:
- **Old API (Deprecated)**: Methods returning `StreamResource` or `GridExporterStreamResource`
- **New API (Recommended)**: Methods returning `DownloadHandler`
## Backward Compatibility
✅ **Your existing code will continue to work!** The old methods are deprecated but still functional. You can migrate at your own pace.
## Migration Steps
### 1. Update Vaadin Version
The new `DownloadHandler` API requires **Vaadin 24.8.0 or later**.
**pom.xml:**
```xml
24.8.0
```
### 2. Update Method Calls
Replace the deprecated `get*StreamResource()` methods with the new `get*DownloadHandler()` methods.
#### Excel Export
**Before:**
```java
Anchor excelLink = new Anchor("", FontAwesome.Regular.FILE_EXCEL.create());
excelLink.setHref(exporter.getExcelStreamResource());
excelLink.getElement().setAttribute("download", true);
```
**After:**
```java
Anchor excelLink = new Anchor("", FontAwesome.Regular.FILE_EXCEL.create());
excelLink.setHref(exporter.getExcelDownloadHandler());
excelLink.getElement().setAttribute("download", true);
```
#### DOCX Export
**Before:**
```java
exporter.getDocxStreamResource()
exporter.getDocxStreamResource(customTemplate)
```
**After:**
```java
exporter.getDocxDownloadHandler()
exporter.getDocxDownloadHandler(customTemplate)
```
#### PDF Export
**Before:**
```java
exporter.getPdfStreamResource()
exporter.getPdfStreamResource(customTemplate)
```
**After:**
```java
exporter.getPdfDownloadHandler()
exporter.getPdfDownloadHandler(customTemplate)
```
#### CSV Export
**Before:**
```java
exporter.getCsvStreamResource()
```
**After:**
```java
exporter.getCsvDownloadHandler()
```
### 3. Update Custom Export Links (if applicable)
If you're creating custom export links instead of using auto-attached buttons:
**Before:**
```java
GridExporter exporter = GridExporter.createFor(grid);
exporter.setAutoAttachExportButtons(false);
Anchor customLink = new Anchor("", "Download Excel");
customLink.setHref(exporter.getExcelStreamResource().forComponent(customLink));
```
**After:**
```java
GridExporter exporter = GridExporter.createFor(grid);
exporter.setAutoAttachExportButtons(false);
Anchor customLink = new Anchor("", "Download Excel");
customLink.setHref(exporter.getExcelDownloadHandler().forComponent(customLink));
```
> **Note:** `forComponent(...)` is optional. It binds the download to a component so that the component is automatically disabled while the export runs (when `setDisableOnClick(true)` is enabled). If you don't need that behavior, you can omit it: `customLink.setHref(exporter.getExcelDownloadHandler());`
## API Comparison
| Old Method (Deprecated) | New Method | Notes |
|------------------------|------------|-------|
| `getExcelStreamResource()` | `getExcelDownloadHandler()` | Excel export |
| `getExcelStreamResource(String)` | `getExcelDownloadHandler(String)` | Excel with template |
| `getDocxStreamResource()` | `getDocxDownloadHandler()` | DOCX export |
| `getDocxStreamResource(String)` | `getDocxDownloadHandler(String)` | DOCX with template |
| `getPdfStreamResource()` | `getPdfDownloadHandler()` | PDF export |
| `getPdfStreamResource(String)` | `getPdfDownloadHandler(String)` | PDF with template |
| `getCsvStreamResource()` | `getCsvDownloadHandler()` | CSV export |
## Features Preserved
All existing features continue to work with the new API:
- ✅ Concurrent download control
- ✅ Download timeouts
- ✅ Button disable/enable during download
- ✅ Custom templates
- ✅ All export formats (Excel, DOCX, PDF, CSV)
- ✅ Custom columns and headers
- ✅ Hierarchical data support
## Timeline
- **Version 3.1.0**: New `DownloadHandler` methods introduced, old methods deprecated
- **A future release**: Old `StreamResource` methods will be removed
## Need Help?
If you encounter any issues during migration, please:
1. Check that you're using Vaadin 24.8.0 or later
2. Review the deprecation warnings in your IDE
3. Open an issue on [GitHub](https://github.com/FlowingCode/GridExporterAddon/issues)
## Example: Complete Migration
**Before (Version 3.0.x):**
```java
Grid grid = new Grid<>(Person.class);
grid.setItems(people);
GridExporter exporter = GridExporter.createFor(grid);
// Auto-attached buttons use StreamResource internally
```
**After (Version 3.1.0+):**
```java
Grid grid = new Grid<>(Person.class);
grid.setItems(people);
GridExporter exporter = GridExporter.createFor(grid);
// Auto-attached buttons now use DownloadHandler internally
// No code changes needed if using auto-attached buttons!
```
**Custom Implementation:**
```java
Grid grid = new Grid<>(Person.class);
grid.setItems(people);
GridExporter exporter = GridExporter.createFor(grid);
exporter.setAutoAttachExportButtons(false);
// Create custom export buttons
Anchor excelBtn = new Anchor("", "Excel");
excelBtn.setHref(exporter.getExcelDownloadHandler());
excelBtn.getElement().setAttribute("download", true);
Anchor pdfBtn = new Anchor("", "PDF");
pdfBtn.setHref(exporter.getPdfDownloadHandler());
pdfBtn.getElement().setAttribute("download", true);
add(excelBtn, pdfBtn);
```