diff --git a/src/main/java/org/codelibs/fess/app/service/KuromojiService.java b/src/main/java/org/codelibs/fess/app/service/KuromojiService.java index b9399876e..a0b460ee1 100644 --- a/src/main/java/org/codelibs/fess/app/service/KuromojiService.java +++ b/src/main/java/org/codelibs/fess/app/service/KuromojiService.java @@ -16,6 +16,7 @@ package org.codelibs.fess.app.service; +import java.util.Collections; import java.util.List; import javax.annotation.Resource; @@ -23,7 +24,6 @@ import javax.annotation.Resource; import org.codelibs.core.beans.util.BeanUtil; import org.codelibs.fess.Constants; import org.codelibs.fess.app.pager.KuromojiPager; -import org.codelibs.fess.dict.DictionaryExpiredException; import org.codelibs.fess.dict.DictionaryFile.PagingList; import org.codelibs.fess.dict.DictionaryManager; import org.codelibs.fess.dict.kuromoji.KuromojiFile; @@ -35,43 +35,41 @@ public class KuromojiService { protected DictionaryManager dictionaryManager; public List getKuromojiList(final String dictId, final KuromojiPager kuromojiPager) { - final KuromojiFile kuromojiFile = getKuromojiFile(dictId); + return getKuromojiFile(dictId).map(file -> { + final int pageSize = kuromojiPager.getPageSize(); + final PagingList userDictList = file.selectList((kuromojiPager.getCurrentPageNumber() - 1) * pageSize, pageSize); - final int pageSize = kuromojiPager.getPageSize(); - final PagingList userDictList = - kuromojiFile.selectList((kuromojiPager.getCurrentPageNumber() - 1) * pageSize, pageSize); - - // update pager - BeanUtil.copyBeanToBean(userDictList, kuromojiPager, option -> option.include(Constants.PAGER_CONVERSION_RULE)); - userDictList.setPageRangeSize(5); - kuromojiPager.setPageNumberList(userDictList.createPageNumberList()); - - return userDictList; + // update pager + BeanUtil.copyBeanToBean(userDictList, kuromojiPager, option -> option.include(Constants.PAGER_CONVERSION_RULE)); + userDictList.setPageRangeSize(5); + kuromojiPager.setPageNumberList(userDictList.createPageNumberList()); + return (List) userDictList; + }).orElseGet(() -> Collections.emptyList()); } - public KuromojiFile getKuromojiFile(final String dictId) { - return dictionaryManager.getDictionaryFile(dictId).filter(file -> file instanceof KuromojiFile).map(file -> (KuromojiFile) file) - .orElseThrow(() -> new DictionaryExpiredException()); + public OptionalEntity getKuromojiFile(final String dictId) { + return dictionaryManager.getDictionaryFile(dictId).filter(file -> file instanceof KuromojiFile) + .map(file -> OptionalEntity.of((KuromojiFile) file)).orElse(OptionalEntity.empty()); } public OptionalEntity getKuromoji(final String dictId, final long id) { - final KuromojiFile kuromojiFile = getKuromojiFile(dictId); - return kuromojiFile.get(id); + return getKuromojiFile(dictId).map(file -> file.get(id).get()); } public void store(final String dictId, final KuromojiItem kuromojiItem) { - final KuromojiFile kuromojiFile = getKuromojiFile(dictId); - - if (kuromojiItem.getId() == 0) { - kuromojiFile.insert(kuromojiItem); - } else { - kuromojiFile.update(kuromojiItem); - } + getKuromojiFile(dictId).ifPresent(file -> { + if (kuromojiItem.getId() == 0) { + file.insert(kuromojiItem); + } else { + file.update(kuromojiItem); + } + }); } public void delete(final String dictId, final KuromojiItem kuromojiItem) { - final KuromojiFile kuromojiFile = getKuromojiFile(dictId); - kuromojiFile.delete(kuromojiItem); + getKuromojiFile(dictId).ifPresent(file -> { + file.delete(kuromojiItem); + }); } } diff --git a/src/main/java/org/codelibs/fess/app/web/admin/dict/kuromoji/AdminDictKuromojiAction.java b/src/main/java/org/codelibs/fess/app/web/admin/dict/kuromoji/AdminDictKuromojiAction.java index 2b196c727..c25b0d9f8 100644 --- a/src/main/java/org/codelibs/fess/app/web/admin/dict/kuromoji/AdminDictKuromojiAction.java +++ b/src/main/java/org/codelibs/fess/app/web/admin/dict/kuromoji/AdminDictKuromojiAction.java @@ -16,6 +16,10 @@ package org.codelibs.fess.app.web.admin.dict.kuromoji; +import java.io.File; +import java.io.IOException; +import java.io.InputStream; + import javax.annotation.Resource; import org.codelibs.core.beans.util.BeanUtil; @@ -33,11 +37,13 @@ import org.codelibs.fess.helper.SystemHelper; import org.dbflute.optional.OptionalEntity; import org.lastaflute.web.Execute; import org.lastaflute.web.callback.ActionRuntime; +import org.lastaflute.web.response.ActionResponse; import org.lastaflute.web.response.HtmlResponse; import org.lastaflute.web.response.render.RenderData; import org.lastaflute.web.validation.VaErrorHook; /** + * @author shinsuke * @author Keiichi Watanabe */ public class AdminDictKuromojiAction extends FessAdminAction { @@ -256,14 +262,27 @@ public class AdminDictKuromojiAction extends FessAdminAction { op.setup(form -> { form.dictId = dictId; }); + }).renderWith(data -> { + kuromojiService.getKuromojiFile(dictId).ifPresent(file -> { + data.register("path", file.getPath()); + }).orElse(() -> { + throwValidationError(messages -> messages.addErrorsFailedToDownloadKuromojiFile(GLOBAL), toIndexHtml()); + }); }); } @Token(save = false, validate = true) @Execute - public HtmlResponse download(final DownloadForm form) { - // TODO Download - return asHtml(path_AdminDictKuromoji_DownloadJsp); + public ActionResponse download(final DownloadForm form) { + validate(form, messages -> {}, () -> downloadpage(form.dictId)); + return kuromojiService.getKuromojiFile(form.dictId).map(file -> { + return asStream(new File(file.getPath()).getName()).contentType("text/plain; charset=UTF-8").stream(out -> { + out.write(file.getInputStream()); + }); + }).orElseGet(() -> { + throwValidationError(messages -> messages.addErrorsFailedToDownloadKuromojiFile(GLOBAL), () -> downloadpage(form.dictId)); + return null; + }); } // ----------------------------------------------------- @@ -276,14 +295,34 @@ public class AdminDictKuromojiAction extends FessAdminAction { op.setup(form -> { form.dictId = dictId; }); + }).renderWith(data -> { + kuromojiService.getKuromojiFile(dictId).ifPresent(file -> { + data.register("path", file.getPath()); + }).orElse(() -> { + throwValidationError(messages -> messages.addErrorsFailedToDownloadKuromojiFile(GLOBAL), toIndexHtml()); + }); }); } @Token(save = false, validate = true) @Execute public HtmlResponse upload(final UploadForm form) { - // TODO - return redirectWith(getClass(), moreUrl("list/1").params("dictId", form.dictId)); + validate(form, messages -> {}, () -> uploadpage(form.dictId)); + return kuromojiService.getKuromojiFile(form.dictId).map(file -> { + try (InputStream inputStream = form.kuromojiFile.getInputStream()) { + file.update(inputStream); + } catch (IOException e) { + throwValidationError(messages -> messages.addErrorsFailedToUploadKuromojiFile(GLOBAL), () -> { + return redirectWith(getClass(), moreUrl("uploadpage/" + form.dictId)); + }); + } + saveInfo(messages -> messages.addSuccessUploadKuromojiFile(GLOBAL)); + return redirectWith(getClass(), moreUrl("uploadpage/" + form.dictId)); + }).orElseGet(() -> { + throwValidationError(messages -> messages.addErrorsFailedToUploadKuromojiFile(GLOBAL), () -> uploadpage(form.dictId)); + return null; + }); + } // ----------------------------------------------------- diff --git a/src/main/java/org/codelibs/fess/app/web/admin/dict/kuromoji/UploadForm.java b/src/main/java/org/codelibs/fess/app/web/admin/dict/kuromoji/UploadForm.java index 02b795a98..12ed5e1f4 100644 --- a/src/main/java/org/codelibs/fess/app/web/admin/dict/kuromoji/UploadForm.java +++ b/src/main/java/org/codelibs/fess/app/web/admin/dict/kuromoji/UploadForm.java @@ -22,16 +22,17 @@ import org.lastaflute.web.ruts.multipart.MultipartFormFile; import org.lastaflute.web.validation.Required; /** - * @author codelibs + * @author shinsuke * @author Keiichi Watanabe */ public class UploadForm implements Serializable { private static final long serialVersionUID = 1L; - public MultipartFormFile kuromojiFile; - @Required public String dictId; + @Required + public MultipartFormFile kuromojiFile; + } diff --git a/src/main/java/org/codelibs/fess/dict/kuromoji/KuromojiFile.java b/src/main/java/org/codelibs/fess/dict/kuromoji/KuromojiFile.java index aeba251e3..75b50eb7a 100644 --- a/src/main/java/org/codelibs/fess/dict/kuromoji/KuromojiFile.java +++ b/src/main/java/org/codelibs/fess/dict/kuromoji/KuromojiFile.java @@ -16,12 +16,14 @@ package org.codelibs.fess.dict.kuromoji; +import java.io.BufferedInputStream; import java.io.BufferedReader; import java.io.BufferedWriter; import java.io.Closeable; import java.io.File; import java.io.FileOutputStream; import java.io.IOException; +import java.io.InputStream; import java.io.InputStreamReader; import java.io.OutputStreamWriter; import java.io.Writer; @@ -60,7 +62,7 @@ public class KuromojiFile extends DictionaryFile { @Override public OptionalEntity get(final long id) { if (kuromojiItemList == null) { - reload(null); + reload(null, null); } for (final KuromojiItem kuromojiItem : kuromojiItemList) { @@ -74,7 +76,7 @@ public class KuromojiFile extends DictionaryFile { @Override public synchronized PagingList selectList(final int offset, final int size) { if (kuromojiItemList == null) { - reload(null); + reload(null, null); } if (offset >= kuromojiItemList.size() || offset < 0) { @@ -92,14 +94,14 @@ public class KuromojiFile extends DictionaryFile { @Override public synchronized void insert(final KuromojiItem item) { try (KuromojiUpdater updater = new KuromojiUpdater(item)) { - reload(updater); + reload(updater, null); } } @Override public synchronized void update(final KuromojiItem item) { try (KuromojiUpdater updater = new KuromojiUpdater(item)) { - reload(updater); + reload(updater, null); } } @@ -108,15 +110,14 @@ public class KuromojiFile extends DictionaryFile { final KuromojiItem kuromojiItem = item; kuromojiItem.setNewToken(StringUtil.EMPTY); try (KuromojiUpdater updater = new KuromojiUpdater(item)) { - reload(updater); + reload(updater, null); } } - protected void reload(final KuromojiUpdater updater) { + protected void reload(final KuromojiUpdater updater, InputStream in) { final List itemList = new ArrayList(); - BufferedReader reader = null; - try { - reader = new BufferedReader(new InputStreamReader(dictionaryManager.getContentInputStream(this), Constants.UTF_8)); + try (BufferedReader reader = + new BufferedReader(new InputStreamReader(in != null ? in : dictionaryManager.getContentInputStream(this), Constants.UTF_8))) { long id = 0; String line = null; while ((line = reader.readLine()) != null) { @@ -171,8 +172,6 @@ public class KuromojiFile extends DictionaryFile { kuromojiItemList = itemList; } catch (final IOException e) { throw new DictionaryException("Failed to parse " + path, e); - } finally { - IOUtils.closeQuietly(reader); } } @@ -180,15 +179,15 @@ public class KuromojiFile extends DictionaryFile { return new File(path).getName(); } - // TODO - // public InputStream getInputStream() throws IOException { - // return new BufferedInputStream(new FileInputStream(file)); - // } - // - // public void update(final InputStream in) throws IOException { - // CopyUtil.copy(in, file); - // reload(null); - // } + public InputStream getInputStream() throws IOException { + return new BufferedInputStream(dictionaryManager.getContentInputStream(this)); + } + + public void update(final InputStream in) throws IOException { + try (KuromojiUpdater updater = new KuromojiUpdater(null)) { + reload(updater, in); + } + } @Override public String toString() { @@ -220,7 +219,7 @@ public class KuromojiFile extends DictionaryFile { public KuromojiItem write(final KuromojiItem oldItem) { try { - if (item.getId() == oldItem.getId() && item.isUpdated()) { + if (item != null && item.getId() == oldItem.getId() && item.isUpdated()) { if (item.equals(oldItem)) { try { if (!item.isDeleted()) { @@ -259,7 +258,7 @@ public class KuromojiFile extends DictionaryFile { public KuromojiItem commit() { isCommit = true; - if (item.isUpdated()) { + if (item != null && item.isUpdated()) { try { writer.write(item.toLineString()); writer.write(Constants.LINE_SEPARATOR); diff --git a/src/main/webapp/WEB-INF/view/admin/dict/kuromoji/download.jsp b/src/main/webapp/WEB-INF/view/admin/dict/kuromoji/download.jsp index 793ec0513..3460186c1 100644 --- a/src/main/webapp/WEB-INF/view/admin/dict/kuromoji/download.jsp +++ b/src/main/webapp/WEB-INF/view/admin/dict/kuromoji/download.jsp @@ -21,7 +21,7 @@ @@ -39,27 +39,27 @@
- + - + - + - + - + - + - + @@ -78,13 +78,13 @@
<%-- Edit Form: BEGIN --%> - +
- +
${f:h(filename)}${f:h(path)}
- + diff --git a/src/main/webapp/WEB-INF/view/admin/dict/kuromoji/upload.jsp b/src/main/webapp/WEB-INF/view/admin/dict/kuromoji/upload.jsp index a8d9146dd..1739001d5 100644 --- a/src/main/webapp/WEB-INF/view/admin/dict/kuromoji/upload.jsp +++ b/src/main/webapp/WEB-INF/view/admin/dict/kuromoji/upload.jsp @@ -21,7 +21,7 @@ @@ -39,29 +39,29 @@
- + - + - + - + - + - + - +