diff --git a/pom.xml b/pom.xml
index 6738c0139..5f46669d6 100644
--- a/pom.xml
+++ b/pom.xml
@@ -40,7 +40,7 @@
1.1.2
- 0.9.4
+ 0.9.5-RC1
0.7.1
0.4.5
0.5.2
diff --git a/src/main/java/org/codelibs/fess/app/web/admin/backup/AdminBackupAction.java b/src/main/java/org/codelibs/fess/app/web/admin/backup/AdminBackupAction.java
index 84e7a7f57..67dc06593 100644
--- a/src/main/java/org/codelibs/fess/app/web/admin/backup/AdminBackupAction.java
+++ b/src/main/java/org/codelibs/fess/app/web/admin/backup/AdminBackupAction.java
@@ -34,7 +34,6 @@ import java.util.function.Consumer;
import java.util.stream.Collectors;
import javax.annotation.Resource;
-import javax.servlet.http.HttpServletResponse;
import org.codelibs.core.exception.IORuntimeException;
import org.codelibs.core.io.CopyUtil;
@@ -54,6 +53,7 @@ import org.lastaflute.core.magic.async.AsyncManager;
import org.lastaflute.web.Execute;
import org.lastaflute.web.response.ActionResponse;
import org.lastaflute.web.response.HtmlResponse;
+import org.lastaflute.web.response.StreamResponse;
import org.lastaflute.web.ruts.process.ActionRuntime;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
@@ -76,9 +76,6 @@ public class AdminBackupAction extends FessAdminAction {
@Resource
private AsyncManager asyncManager;
- @Resource
- private HttpServletResponse response;
-
@Override
protected void setupHtmlData(final ActionRuntime runtime) {
super.setupHtmlData(runtime);
@@ -140,20 +137,15 @@ public class AdminBackupAction extends FessAdminAction {
} else if (id.endsWith(CSV_EXTENTION)) {
String name = id.substring(0, id.length() - CSV_EXTENTION.length());
if ("search_log".equals(name)) {
- writeSearchLogCsvResponse(id);
- return HtmlResponse.asEmptyBody();
- } else if ("search_field_log".equals(id)) {
- writeSearchFieldLogCsvResponse(id);
- return HtmlResponse.asEmptyBody();
- } else if ("user_info".equals(id)) {
- writeUserInfoCsvResponse(id);
- return HtmlResponse.asEmptyBody();
- } else if ("click_log".equals(id)) {
- writeClickLogCsvResponse(id);
- return HtmlResponse.asEmptyBody();
- } else if ("favorite_log".equals(id)) {
- writeFavoriteLogCsvResponse(id);
- return HtmlResponse.asEmptyBody();
+ return writeSearchLogCsvResponse(id);
+ } else if ("search_field_log".equals(name)) {
+ return writeSearchFieldLogCsvResponse(id);
+ } else if ("user_info".equals(name)) {
+ return writeUserInfoCsvResponse(id);
+ } else if ("click_log".equals(name)) {
+ return writeClickLogCsvResponse(id);
+ } else if ("favorite_log".equals(name)) {
+ return writeFavoriteLogCsvResponse(id);
}
} else {
final String index;
@@ -181,22 +173,28 @@ public class AdminBackupAction extends FessAdminAction {
return redirect(getClass()); // no-op
}
- private void writeCsvResponse(final String id, final Consumer writeCall) {
- writeCsvResponseHeader(id);
- final CsvConfig cfg = new CsvConfig(',', '"', '"');
- cfg.setEscapeDisabled(false);
- cfg.setQuoteDisabled(false);
- try (final CsvWriter writer =
- new CsvWriter(new BufferedWriter(new OutputStreamWriter(response.getOutputStream(), fessConfig.getCsvFileEncoding())), cfg)) {
- writeCall.accept(writer);
- writer.flush();
- } catch (final Exception e) {
- logger.warn("Failed to write " + id + " to response.", e);
- }
+ private StreamResponse writeCsvResponse(final String id, final Consumer writeCall) {
+ return asStream(id)
+ .contentTypeOctetStream()
+ .header("Pragma", "no-cache")
+ .header("Cache-Control", "no-cache")
+ .header("Expires", "Thu, 01 Dec 1994 16:00:00 GMT")
+ .stream(out -> {
+ final CsvConfig cfg = new CsvConfig(',', '"', '"');
+ cfg.setEscapeDisabled(false);
+ cfg.setQuoteDisabled(false);
+ try (final CsvWriter writer =
+ new CsvWriter(new BufferedWriter(new OutputStreamWriter(out.writer(), fessConfig.getCsvFileEncoding())), cfg)) {
+ writeCall.accept(writer);
+ writer.flush();
+ } catch (final Exception e) {
+ logger.warn("Failed to write " + id + " to response.", e);
+ }
+ });
}
- private void writeSearchLogCsvResponse(final String id) {
- writeCsvResponse(id, writer -> {
+ private StreamResponse writeSearchLogCsvResponse(final String id) {
+ return writeCsvResponse(id, writer -> {
final SearchLogBhv bhv = ComponentUtil.getComponent(SearchLogBhv.class);
bhv.selectCursor(cb -> {
cb.query().matchAll();
@@ -229,8 +227,8 @@ public class AdminBackupAction extends FessAdminAction {
});
}
- private void writeUserInfoCsvResponse(String id) {
- writeCsvResponse(id, writer -> {
+ private StreamResponse writeUserInfoCsvResponse(String id) {
+ return writeCsvResponse(id, writer -> {
final UserInfoBhv bhv = ComponentUtil.getComponent(UserInfoBhv.class);
bhv.selectCursor(cb -> {
cb.query().matchAll();
@@ -248,8 +246,8 @@ public class AdminBackupAction extends FessAdminAction {
});
}
- private void writeFavoriteLogCsvResponse(String id) {
- writeCsvResponse(id, writer -> {
+ private StreamResponse writeFavoriteLogCsvResponse(String id) {
+ return writeCsvResponse(id, writer -> {
final FavoriteLogBhv bhv = ComponentUtil.getComponent(FavoriteLogBhv.class);
bhv.selectCursor(cb -> {
cb.query().matchAll();
@@ -270,8 +268,8 @@ public class AdminBackupAction extends FessAdminAction {
});
}
- private void writeClickLogCsvResponse(String id) {
- writeCsvResponse(id, writer -> {
+ private StreamResponse writeClickLogCsvResponse(String id) {
+ return writeCsvResponse(id, writer -> {
final ClickLogBhv bhv = ComponentUtil.getComponent(ClickLogBhv.class);
bhv.selectCursor(cb -> {
cb.query().matchAll();
@@ -294,8 +292,8 @@ public class AdminBackupAction extends FessAdminAction {
});
}
- private void writeSearchFieldLogCsvResponse(String id) {
- writeCsvResponse(id, writer -> {
+ private StreamResponse writeSearchFieldLogCsvResponse(String id) {
+ return writeCsvResponse(id, writer -> {
final SearchFieldLogBhv bhv = ComponentUtil.getComponent(SearchFieldLogBhv.class);
bhv.selectCursor(cb -> {
cb.query().matchAll();
@@ -326,14 +324,6 @@ public class AdminBackupAction extends FessAdminAction {
}
}
- private void writeCsvResponseHeader(final String id) {
- response.setContentType("application/octet-stream");
- response.addHeader("Content-Disposition", "attachment; filename=\"" + id + "\"");
- response.addHeader("Pragma", "no-cache");
- response.addHeader("Cache-Control", "no-cache");
- response.addHeader("Expires", "Thu, 01 Dec 1994 16:00:00 GMT");
- }
-
private List