From 6584b1908f8e52970d92323bd92fdaec6008e0c1 Mon Sep 17 00:00:00 2001
From: KOHGYLW
Date: Fri, 10 Jun 2022 08:47:56 +0800
Subject: [PATCH] =?UTF-8?q?=E4=BC=98=E5=8C=96=E4=BA=86=E5=88=A0=E9=99=A4?=
=?UTF-8?q?=E9=80=BB=E8=BE=91?=
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit
---
mybatisResource/mapperXML/NodeMapper.xml | 5 --
.../kiftd/server/mapper/NodeMapper.java | 2 -
.../server/service/impl/FileServiceImpl.java | 28 ++++-----
.../kiftd/server/util/FileBlockUtil.java | 49 +++++++++-------
.../kiftd/server/util/FileNodeUtil.java | 7 ---
.../kohgylw/kiftd/server/util/FolderUtil.java | 54 ++++++------------
.../server/webdav/KiftdWebDAVServlet.java | 35 ++++++++----
.../maven/kohgylw/kiftd/pom.properties | 2 +-
.../mc/ConsoleRunner$ProgressListener.class | Bin 1515 -> 1563 bytes
.../kohgylw/kiftd/mc/ConsoleRunner.class | Bin 26679 -> 27307 bytes
target/classes/kohgylw/kiftd/mc/MC.class | Bin 1161 -> 1168 bytes
.../classes/kohgylw/kiftd/mc/UIRunner$1.class | Bin 3604 -> 3614 bytes
.../classes/kohgylw/kiftd/mc/UIRunner$2.class | Bin 875 -> 885 bytes
.../classes/kohgylw/kiftd/mc/UIRunner.class | Bin 2665 -> 2710 bytes
.../kohgylw/kiftd/printer/Printer.class | Bin 1667 -> 1671 bytes
.../kiftd/server/configation/DataAccess.class | Bin 3302 -> 3199 bytes
.../controller/ExternalLinksController.class | Bin 1797 -> 1797 bytes
.../server/controller/HomeController.class | Bin 9502 -> 9502 bytes
.../controller/ResourceController.class | Bin 2847 -> 2847 bytes
.../server/controller/WelcomeController.class | Bin 631 -> 631 bytes
.../kohgylw/kiftd/server/ctl/KiftdCtl$1.class | Bin 2133 -> 2143 bytes
.../kohgylw/kiftd/server/ctl/KiftdCtl.class | Bin 5052 -> 5036 bytes
.../server/enumeration/AccountAuth.class | Bin 1466 -> 1431 bytes
.../kiftd/server/enumeration/LogLevel.class | Bin 1234 -> 1199 bytes
.../server/enumeration/PowerPointType.class | Bin 1206 -> 1171 bytes
.../kiftd/server/enumeration/VCLevel.class | Bin 1224 -> 1189 bytes
.../FilesTotalOutOfLimitException.class | Bin 441 -> 441 bytes
.../FoldersTotalOutOfLimitException.class | Bin 447 -> 447 bytes
.../kiftd/server/filter/IPFilter.class | Bin 2488 -> 2488 bytes
.../kiftd/server/filter/MastLoginFilter.class | Bin 4042 -> 3983 bytes
.../server/filter/ProtectedURLFilter.class | Bin 2562 -> 2612 bytes
.../kiftd/server/mapper/FolderMapper.class | Bin 1366 -> 1366 bytes
.../kiftd/server/mapper/NodeMapper.class | Bin 1295 -> 1251 bytes
.../server/mapper/PropertiesMapper.class | Bin 430 -> 430 bytes
.../kohgylw/kiftd/server/model/Folder.class | Bin 1718 -> 1718 bytes
.../kohgylw/kiftd/server/model/Node.class | Bin 1864 -> 1864 bytes
.../kiftd/server/model/Propertie.class | Bin 833 -> 833 bytes
.../kohgylw/kiftd/server/pojo/AudioInfo.class | Bin 1359 -> 1359 bytes
.../kiftd/server/pojo/AudioInfoList.class | Bin 1055 -> 1055 bytes
.../server/pojo/ChangePasswordInfoPojo.class | Bin 1021 -> 1021 bytes
.../pojo/CheckImportFolderRespons.class | Bin 837 -> 837 bytes
.../server/pojo/CheckUploadFilesRespons.class | Bin 1588 -> 1588 bytes
.../pojo/CreateNewFolderByNameRespons.class | Bin 849 -> 849 bytes
.../kiftd/server/pojo/ExtendStores.class | Bin 794 -> 794 bytes
.../kiftd/server/pojo/FolderView.class | Bin 4504 -> 4504 bytes
.../kiftd/server/pojo/LoginInfoPojo.class | Bin 1015 -> 1015 bytes
.../kiftd/server/pojo/PictureInfo.class | Bin 792 -> 792 bytes
.../kiftd/server/pojo/PictureViewList.class | Bin 1106 -> 1106 bytes
.../kiftd/server/pojo/PublicKeyInfo.class | Bin 821 -> 821 bytes
.../server/pojo/RemainingFolderView.class | Bin 1292 -> 1292 bytes
.../kiftd/server/pojo/ServerSetting.class | Bin 2885 -> 2885 bytes
.../kiftd/server/pojo/SignUpInfoPojo.class | Bin 991 -> 991 bytes
.../kiftd/server/pojo/SreachView.class | Bin 619 -> 619 bytes
.../server/pojo/UploadKeyCertificate.class | Bin 806 -> 810 bytes
.../kohgylw/kiftd/server/pojo/VideoInfo.class | Bin 1175 -> 1175 bytes
.../server/pojo/VideoTranscodeThread$1.class | Bin 1471 -> 1553 bytes
.../server/pojo/VideoTranscodeThread.class | Bin 3986 -> 4075 bytes
.../kiftd/server/service/AccountService.class | Bin 782 -> 782 bytes
.../service/ExternalDownloadService.class | Bin 422 -> 422 bytes
.../server/service/FileChainService.class | Bin 414 -> 414 bytes
.../kiftd/server/service/FileService.class | Bin 1241 -> 1241 bytes
.../kiftd/server/service/FolderService.class | Bin 409 -> 409 bytes
.../server/service/FolderViewService.class | Bin 503 -> 503 bytes
.../server/service/PlayAudioService.class | Bin 277 -> 277 bytes
.../server/service/PlayVideoService.class | Bin 271 -> 271 bytes
.../server/service/ResourceService.class | Bin 788 -> 788 bytes
.../server/service/ServerInfoService.class | Bin 211 -> 211 bytes
.../server/service/ShowPictureService.class | Bin 421 -> 421 bytes
.../service/impl/AccountServiceImpl$1.class | Bin 0 -> 809 bytes
.../service/impl/AccountServiceImpl.class | Bin 10161 -> 9955 bytes
.../service/impl/FileServiceImpl$10.class | Bin 825 -> 825 bytes
.../service/impl/FileServiceImpl$11.class | Bin 830 -> 830 bytes
.../service/impl/FileServiceImpl$12.class | Bin 830 -> 830 bytes
.../service/impl/FileServiceImpl$2.class | Bin 830 -> 830 bytes
.../service/impl/FileServiceImpl$3.class | Bin 830 -> 830 bytes
.../service/impl/FileServiceImpl$4.class | Bin 832 -> 832 bytes
.../service/impl/FileServiceImpl$5.class | Bin 832 -> 832 bytes
.../service/impl/FileServiceImpl$6.class | Bin 823 -> 823 bytes
.../service/impl/FileServiceImpl$7.class | Bin 823 -> 823 bytes
.../service/impl/FileServiceImpl$8.class | Bin 840 -> 840 bytes
.../service/impl/FileServiceImpl$9.class | Bin 823 -> 823 bytes
.../server/service/impl/FileServiceImpl.class | Bin 35423 -> 35534 bytes
.../service/impl/ServerInfoServiceImpl.class | Bin 1071 -> 1071 bytes
.../kohgylw/kiftd/server/util/AESCipher.class | Bin 2460 -> 2460 bytes
.../util/CharsetDetectionObserverImpl.class | Bin 713 -> 713 bytes
.../kiftd/server/util/ConfigureReader$1.class | Bin 0 -> 1819 bytes
.../kiftd/server/util/ConfigureReader.class | Bin 37314 -> 36684 bytes
.../kiftd/server/util/ContentTypeMap.class | Bin 66218 -> 74058 bytes
.../server/util/Docx2PDFFontFactory.class | Bin 1586 -> 1474 bytes
.../server/util/Docx2PDFFontProvider.class | Bin 970 -> 962 bytes
.../kiftd/server/util/Docx2PDFUtil.class | Bin 3745 -> 3628 bytes
.../kiftd/server/util/EncodeUtil.class | Bin 820 -> 823 bytes
.../kiftd/server/util/FileBlockUtil$2.class | Bin 1248 -> 1248 bytes
.../kiftd/server/util/FileBlockUtil.class | Bin 20088 -> 20148 bytes
.../kiftd/server/util/FileNodeUtil.class | Bin 8902 -> 8730 bytes
.../kiftd/server/util/FolderUtil.class | Bin 11431 -> 11310 bytes
.../kiftd/server/util/IpAddrGetter.class | Bin 1794 -> 1737 bytes
.../server/util/KiftdFFMPEGLocator.class | Bin 5620 -> 5662 bytes
.../kiftd/server/util/KiftdProperties$1.class | Bin 0 -> 245 bytes
.../util/KiftdProperties$LineContext.class | Bin 1669 -> 1925 bytes
.../kiftd/server/util/KiftdProperties.class | Bin 5167 -> 5092 bytes
.../kiftd/server/util/NoticeUtil.class | Bin 4212 -> 4217 bytes
.../server/util/PowerPoint2PDFUtil.class | Bin 8155 -> 7851 bytes
.../kiftd/server/util/RSADecryptUtil.class | Bin 2472 -> 2495 bytes
.../kiftd/server/util/RSAKeyUtil.class | Bin 2249 -> 2259 bytes
.../server/util/RangeFileStreamWriter.class | Bin 6963 -> 7059 bytes
.../kiftd/server/util/ServerTimeUtil.class | Bin 3404 -> 3394 bytes
.../kiftd/server/util/TextFormateUtil.class | Bin 1469 -> 1463 bytes
.../kiftd/server/util/Txt2PDFUtil.class | Bin 3200 -> 3133 bytes
.../kiftd/server/util/TxtCharsetGetter.class | Bin 2394 -> 2408 bytes
.../VariableSpeedBufferedOutputStream.class | Bin 2016 -> 2005 bytes
.../kiftd/server/util/VerificationCode.class | Bin 1543 -> 1543 bytes
.../server/util/VerificationCodeFactory.class | Bin 4037 -> 4074 bytes
.../server/webdav/KiftdWebDAVServlet$1.class | Bin 0 -> 258 bytes
.../webdav/KiftdWebDAVServlet$LockInfo.class | Bin 3461 -> 3461 bytes
.../webdav/KiftdWebDAVServlet$Range.class | Bin 691 -> 691 bytes
.../KiftdWebDAVServlet$WebdavResolver.class | Bin 1026 -> 1026 bytes
.../server/webdav/KiftdWebDAVServlet.class | Bin 56417 -> 56795 bytes
.../kiftd/server/webdav/WebdavStatus.class | Bin 1398 -> 1398 bytes
.../webdav/date/ConcurrentDateFormat.class | Bin 1897 -> 1900 bytes
.../webdav/date/FastHttpDateFormat.class | Bin 4447 -> 4451 bytes
.../kiftd/server/webdav/dom/DOMWriter.class | Bin 3123 -> 3110 bytes
.../kiftd/server/webdav/dom/Escape.class | Bin 2273 -> 2274 bytes
.../exception/UnAuthorizedException.class | Bin 431 -> 431 bytes
.../webdav/pojo/KiftdWebDAVResource.class | Bin 6555 -> 6654 bytes
.../server/webdav/range/ContentRange.class | Bin 1881 -> 1887 bytes
.../range/HttpParser$DomainParseState.class | Bin 3485 -> 3455 bytes
.../server/webdav/range/HttpParser.class | Bin 12940 -> 12838 bytes
.../server/webdav/range/SkipResult.class | Bin 1245 -> 1210 bytes
.../server/webdav/url/HttpPathUtil.class | Bin 1286 -> 1293 bytes
.../kiftd/server/webdav/url/URLEncoder.class | Bin 3494 -> 3492 bytes
.../kiftd/ui/callback/GetServerStatus.class | Bin 810 -> 810 bytes
.../kiftd/ui/callback/GetServerTime.class | Bin 168 -> 168 bytes
.../kiftd/ui/callback/OnCloseServer.class | Bin 155 -> 155 bytes
.../kiftd/ui/callback/OnStartServer.class | Bin 155 -> 155 bytes
.../kiftd/ui/callback/UpdateSetting.class | Bin 231 -> 231 bytes
.../kiftd/ui/module/FSProgressDialog$1.class | Bin 1391 -> 1403 bytes
.../kiftd/ui/module/FSProgressDialog.class | Bin 4496 -> 4545 bytes
.../kohgylw/kiftd/ui/module/FSViewer$1.class | Bin 3574 -> 3494 bytes
.../kohgylw/kiftd/ui/module/FSViewer$2.class | Bin 1201 -> 1213 bytes
.../kohgylw/kiftd/ui/module/FSViewer$3.class | Bin 2595 -> 2659 bytes
.../kiftd/ui/module/FSViewer$4$1.class | Bin 878 -> 846 bytes
.../kohgylw/kiftd/ui/module/FSViewer$4.class | Bin 3671 -> 3623 bytes
.../kohgylw/kiftd/ui/module/FSViewer.class | Bin 15746 -> 15998 bytes
.../ui/module/FileSystemPathViewer$1.class | Bin 1367 -> 1375 bytes
.../ui/module/FileSystemPathViewer.class | Bin 11714 -> 11811 bytes
.../kiftd/ui/module/KiftdDynamicWindow.class | Bin 4269 -> 4184 bytes
.../kiftd/ui/module/ServerUIModule$1.class | Bin 1269 -> 1279 bytes
.../kiftd/ui/module/ServerUIModule$10.class | Bin 0 -> 831 bytes
.../kiftd/ui/module/ServerUIModule$2.class | Bin 807 -> 819 bytes
.../kiftd/ui/module/ServerUIModule$3.class | Bin 803 -> 813 bytes
.../kiftd/ui/module/ServerUIModule$4.class | Bin 2239 -> 2268 bytes
.../kiftd/ui/module/ServerUIModule$5.class | Bin 3613 -> 3642 bytes
.../kiftd/ui/module/ServerUIModule$6.class | Bin 2709 -> 2738 bytes
.../kiftd/ui/module/ServerUIModule$7.class | Bin 1039 -> 1055 bytes
.../kiftd/ui/module/ServerUIModule$8.class | Bin 2473 -> 2500 bytes
.../kiftd/ui/module/ServerUIModule$9.class | Bin 1675 -> 1733 bytes
.../kiftd/ui/module/ServerUIModule.class | Bin 15021 -> 14677 bytes
.../kiftd/ui/module/SettingWindow$1.class | Bin 878 -> 888 bytes
.../kiftd/ui/module/SettingWindow$2.class | Bin 5028 -> 5072 bytes
.../kiftd/ui/module/SettingWindow$3.class | Bin 1025 -> 1085 bytes
.../kiftd/ui/module/SettingWindow$4.class | Bin 0 -> 1212 bytes
.../kiftd/ui/module/SettingWindow.class | Bin 10699 -> 10030 bytes
.../kiftd/ui/pojo/FileSystemPath.class | Bin 1188 -> 1188 bytes
.../kiftd/ui/util/FilesTable$1$1.class | Bin 3062 -> 3005 bytes
.../kohgylw/kiftd/ui/util/FilesTable$1.class | Bin 1263 -> 1260 bytes
.../kohgylw/kiftd/ui/util/FilesTable$2.class | Bin 1126 -> 1132 bytes
.../kohgylw/kiftd/ui/util/FilesTable$3.class | Bin 996 -> 1002 bytes
.../kohgylw/kiftd/ui/util/FilesTable.class | Bin 3836 -> 3835 bytes
.../kohgylw/kiftd/ui/util/PathsTable$1.class | Bin 1069 -> 1081 bytes
.../kiftd/ui/util/PathsTable$2$1.class | Bin 2975 -> 2886 bytes
.../kohgylw/kiftd/ui/util/PathsTable$2.class | Bin 1206 -> 1207 bytes
.../kohgylw/kiftd/ui/util/PathsTable.class | Bin 3813 -> 3845 bytes
.../FileSystemManager$1.class | Bin 1865 -> 1908 bytes
.../FileSystemManager.class | Bin 27997 -> 28383 bytes
.../file_system_manager/pojo/Folder.class | Bin 469 -> 469 bytes
.../file_system_manager/pojo/FolderView.class | Bin 1706 -> 1706 bytes
177 files changed, 89 insertions(+), 93 deletions(-)
create mode 100644 target/classes/kohgylw/kiftd/server/service/impl/AccountServiceImpl$1.class
create mode 100644 target/classes/kohgylw/kiftd/server/util/ConfigureReader$1.class
create mode 100644 target/classes/kohgylw/kiftd/server/util/KiftdProperties$1.class
create mode 100644 target/classes/kohgylw/kiftd/server/webdav/KiftdWebDAVServlet$1.class
create mode 100644 target/classes/kohgylw/kiftd/ui/module/ServerUIModule$10.class
create mode 100644 target/classes/kohgylw/kiftd/ui/module/SettingWindow$4.class
diff --git a/mybatisResource/mapperXML/NodeMapper.xml b/mybatisResource/mapperXML/NodeMapper.xml
index 0ac9c62..ed6f54f 100644
--- a/mybatisResource/mapperXML/NodeMapper.xml
+++ b/mybatisResource/mapperXML/NodeMapper.xml
@@ -48,11 +48,6 @@
#{fileId,jdbcType=VARCHAR}
-
- DELETE FROM
- FILE WHERE file_parent_folder = #{pfid,jdbcType=VARCHAR}
-
-
DELETE FROM FILE WHERE
file_id = #{fileId,jdbcType=VARCHAR}
diff --git a/src/main/java/kohgylw/kiftd/server/mapper/NodeMapper.java b/src/main/java/kohgylw/kiftd/server/mapper/NodeMapper.java
index e5bf8e5..c457736 100644
--- a/src/main/java/kohgylw/kiftd/server/mapper/NodeMapper.java
+++ b/src/main/java/kohgylw/kiftd/server/mapper/NodeMapper.java
@@ -50,8 +50,6 @@ public interface NodeMapper {
int update(final Node f);
- int deleteByParentFolderId(final String pfid);
-
int deleteById(final String fileId);
Node queryById(final String fileId);
diff --git a/src/main/java/kohgylw/kiftd/server/service/impl/FileServiceImpl.java b/src/main/java/kohgylw/kiftd/server/service/impl/FileServiceImpl.java
index e211d5a..5dab9a5 100644
--- a/src/main/java/kohgylw/kiftd/server/service/impl/FileServiceImpl.java
+++ b/src/main/java/kohgylw/kiftd/server/service/impl/FileServiceImpl.java
@@ -300,13 +300,10 @@ public class FileServiceImpl extends RangeFileStreamWriter implements FileServic
|| !ConfigureReader.instance().accessFolder(f, account)) {
return NO_AUTHORIZED;
}
- // 从节点删除
- if (this.fm.deleteById(fileId) >= 0) {
- // 从文件块删除
- if (this.fbu.deleteFromFileBlocks(node)) {
- this.lu.writeDeleteFileEvent(request, node);
- return "deleteFileSuccess";
- }
+ // 删除文件节点
+ if (this.fbu.deleteNode(node)) {
+ this.lu.writeDeleteFileEvent(request, node);
+ return "deleteFileSuccess";
}
return "cannotDeleteFile";
}
@@ -420,11 +417,7 @@ public class FileServiceImpl extends RangeFileStreamWriter implements FileServic
return NO_AUTHORIZED;
}
// 删除文件节点
- if (this.fm.deleteById(fileId) <= 0) {
- return "cannotDeleteFile";
- }
- // 删除文件块
- if (!this.fbu.deleteFromFileBlocks(file)) {
+ if (!this.fbu.deleteNode(file)) {
return "cannotDeleteFile";
}
// 日志记录
@@ -672,7 +665,16 @@ public class FileServiceImpl extends RangeFileStreamWriter implements FileServic
this.lu.writeMoveFileEvent(account, ip, originPath, fbu.getNodePath(node), isCopy);
}
// 最后,尝试删除冲突节点的文件块。注意:该操作必须在复制节点插入后再执行!
- fbu.deleteFromFileBlocks(n);
+ Map map = new HashMap<>();
+ map.put("path", n.getFilePath());
+ map.put("fileId", n.getFileId());
+ List nodes = fm.queryByPathExcludeById(map);
+ if (nodes == null || nodes.isEmpty()) {
+ File file = fbu.getFileFromBlocks(n);
+ if (file != null) {
+ file.delete();// 此处无需再判断是否成功
+ }
+ }
} else {
// 如果原节点删除失败,则操作失败
return "cannotMoveFiles";
diff --git a/src/main/java/kohgylw/kiftd/server/util/FileBlockUtil.java b/src/main/java/kohgylw/kiftd/server/util/FileBlockUtil.java
index 6a49af8..126d94f 100644
--- a/src/main/java/kohgylw/kiftd/server/util/FileBlockUtil.java
+++ b/src/main/java/kohgylw/kiftd/server/util/FileBlockUtil.java
@@ -140,7 +140,7 @@ public class FileBlockUtil {
// 因其他原因生成失败也返回null
return null;
}
-
+
/**
*
* 将新上传的文件存入文件系统
@@ -285,33 +285,42 @@ public class FileBlockUtil {
/**
*
- * 删除文件系统中的一个文件块
+ * 删除文件系统中的一个文件节点,同时清理文件块
*
- * 根据传入的文件节点对象,删除其在文件系统中保存的对应文件块。仅当传入文件节点所对应的文件块不再有其他节点引用时
- * 才会真的进行删除操作,否则直接返回true。
+ * 删除传入的文件节点,之后判断是否需要删除其在文件系统中保存的对应文件块,若该文件节点所对应的文件块不再有其他节点引用,
+ * 则进行删除操作,否则直接返回true。
*
*
* @author 青阳龙野(kohgylw)
* @param f kohgylw.kiftd.server.model.Node 要删除的文件节点对象
- * @return boolean 删除结果,true为成功
+ * @return boolean 删除结果,true为成功,否则返回false。若传入节点为null,也会返回false
*/
- public boolean deleteFromFileBlocks(Node f) {
- // 检查是否还有其他节点引用相同的文件块
- Map map = new HashMap<>();
- map.put("path", f.getFilePath());
- map.put("fileId", f.getFileId());
- List nodes = fm.queryByPathExcludeById(map);
- if (nodes == null || nodes.isEmpty()) {
- // 如果已经无任何节点再引用此文件块,则删除它
- File file = getFileFromBlocks(f);// 获取对应的文件块对象
- if (file != null) {
- return file.delete();// 执行删除操作
+ public boolean deleteNode(Node f) {
+ if (f != null) {
+ if (fm.deleteById(f.getFileId()) > 0) {
+ // 检查是否还有其他节点引用相同的文件块
+ Map map = new HashMap<>();
+ map.put("path", f.getFilePath());
+ map.put("fileId", f.getFileId());
+ List nodes = fm.queryByPathExcludeById(map);
+ if (nodes == null || nodes.isEmpty()) {
+ // 如果已经无任何节点再引用此文件块,则删除它
+ File file = getFileFromBlocks(f);// 获取对应的文件块对象
+ if (file != null) {
+ if (file.delete()) {
+ return true;// 文件块被删除,认为删除成功
+ } else {
+ // 文件块无法删除,尝试回滚节点数据
+ if (file.exists() && fm.insert(f) > 0) {
+ return false;// 回滚成功,认为删除失败
+ }
+ }
+ }
+ }
+ return true;// 如果文件块仍被其他节点引用,或是已无此文件块,或是文件块无法删除且节点回滚失败,则认为删除成功
}
- return false;
- } else {
- // 如果还有,那么直接返回true即可,认为此节点的文件块已经删除了(其他的引用是属于其他节点的)
- return true;
}
+ return false;// 若节点删除失败,或是节点为null,则返回false
}
/**
diff --git a/src/main/java/kohgylw/kiftd/server/util/FileNodeUtil.java b/src/main/java/kohgylw/kiftd/server/util/FileNodeUtil.java
index b11e840..d255734 100644
--- a/src/main/java/kohgylw/kiftd/server/util/FileNodeUtil.java
+++ b/src/main/java/kohgylw/kiftd/server/util/FileNodeUtil.java
@@ -73,13 +73,6 @@ public class FileNodeUtil {
state2.execute(
"CREATE TABLE IF NOT EXISTS FILE(file_id VARCHAR(128) PRIMARY KEY,file_name VARCHAR(128) NOT NULL,file_size VARCHAR(128) NOT NULL,file_parent_folder varchar(128) NOT NULL,file_creation_date varchar(128) NOT NULL,file_creator varchar(128) NOT NULL,file_path varchar(128) NOT NULL)");
state2.close();
- // 为了匹配之前的版本而设计的兼容性字段设置,后续可能会删除
- if (!ConfigureReader.instance().useMySQL()) {
- final Statement state3 = conn.createStatement();
- state3.execute(
- "ALTER TABLE FOLDER ADD COLUMN IF NOT EXISTS folder_constraint INT NOT NULL DEFAULT 0");
- state3.close();
- }
// 为数据库生成索引,此处分为MySQL和H2两种操作
if (ConfigureReader.instance().useMySQL()) {
final Statement state4 = conn.createStatement();
diff --git a/src/main/java/kohgylw/kiftd/server/util/FolderUtil.java b/src/main/java/kohgylw/kiftd/server/util/FolderUtil.java
index 2abf159..bbd5824 100644
--- a/src/main/java/kohgylw/kiftd/server/util/FolderUtil.java
+++ b/src/main/java/kohgylw/kiftd/server/util/FolderUtil.java
@@ -29,8 +29,7 @@ public class FolderUtil {
*
*
* @author 青阳龙野(kohgylw)
- * @param fid
- * java.lang.String 要获取的目标文件夹ID
+ * @param fid java.lang.String 要获取的目标文件夹ID
* @return java.util.List
* 指定文件夹的所有父级文件夹列表,以kohgylw.kiftd.server.model.Folder形式封装。
*/
@@ -62,8 +61,7 @@ public class FolderUtil {
*
*
* @author 青阳龙野(kohgylw)
- * @param folderId
- * java.lang.String 要删除的文件夹树的ID,不能为null。
+ * @param folderId java.lang.String 要删除的文件夹树的ID,不能为null。
*/
public void deleteAllChildFolder(final String folderId) {
final Thread deleteChildFolderThread = new Thread(() -> this.iterationDeleteFolder(folderId));
@@ -72,17 +70,12 @@ public class FolderUtil {
private void iterationDeleteFolder(final String folderId) {
final List cf = (List) this.fm.queryByParentId(folderId);
- if (cf.size() > 0) {
- for (final Folder f : cf) {
- this.iterationDeleteFolder(f.getFolderId());
- }
+ for (final Folder f : cf) {
+ this.iterationDeleteFolder(f.getFolderId());
}
final List files = (List) this.fim.queryByParentFolderId(folderId);
- if (files.size() > 0) {
- this.fim.deleteByParentFolderId(folderId);
- for (final Node f2 : files) {
- this.fbu.deleteFromFileBlocks(f2);
- }
+ for (final Node f2 : files) {
+ this.fbu.deleteNode(f2);
}
this.fm.deleteById(folderId);
}
@@ -167,8 +160,7 @@ public class FolderUtil {
*
*
* @author 青阳龙野(kohgylw)
- * @param f
- * kohgylw.kiftd.server.model.Folder 要检查的文件夹对象
+ * @param f kohgylw.kiftd.server.model.Folder 要检查的文件夹对象
* @return boolean 是否有效,若返回false则进行了数据回滚
*/
public boolean isValidFolder(Folder f) {
@@ -195,14 +187,11 @@ public class FolderUtil {
*
*
* @author 青阳龙野(kohgylw)
- * @param prototype
- * kohgylw.kiftd.server.model.Folder 要复制的目标文件夹,即复制的样板
- * @param parentFolder
- * kohgylw.kiftd.server.model.Folder 复制文件夹的父文件夹,指定在哪个路径下创建目标文件夹的副本
- * @param newName
- * java.lang.String 副本文件夹的新名称,以覆盖原本的名称,如果传入null则仍使用原名
- * @param excludeFolderId
- * java.lang.String 这个参数是方便后续迭代时避免循环拷贝的,首次调用必须传入null!
+ * @param prototype kohgylw.kiftd.server.model.Folder 要复制的目标文件夹,即复制的样板
+ * @param parentFolder kohgylw.kiftd.server.model.Folder
+ * 复制文件夹的父文件夹,指定在哪个路径下创建目标文件夹的副本
+ * @param newName java.lang.String 副本文件夹的新名称,以覆盖原本的名称,如果传入null则仍使用原名
+ * @param excludeFolderId java.lang.String 这个参数是方便后续迭代时避免循环拷贝的,首次调用必须传入null!
* @return kohgylw.kiftd.server.model.Folder 完整复制成功则返回复制好的文件夹对象,
* 否则返回null(包括传入目标文件夹或父文件夹参数错误的情况)
*/
@@ -265,12 +254,10 @@ public class FolderUtil {
*
*
* @author 青阳龙野(kohgylw)
- * @param prototype
- * kohgylw.kiftd.server.model.Folder 要复制的目标文件夹,即复制的样板
- * @param parentFolder
- * kohgylw.kiftd.server.model.Folder 复制文件夹的父文件夹,指定在哪个路径下创建目标文件夹的副本
- * @param newName
- * java.lang.String 副本文件夹的新名称,以覆盖原本的名称,如果传入null则仍使用原名
+ * @param prototype kohgylw.kiftd.server.model.Folder 要复制的目标文件夹,即复制的样板
+ * @param parentFolder kohgylw.kiftd.server.model.Folder
+ * 复制文件夹的父文件夹,指定在哪个路径下创建目标文件夹的副本
+ * @param newName java.lang.String 副本文件夹的新名称,以覆盖原本的名称,如果传入null则仍使用原名
* @return kohgylw.kiftd.server.model.Folder 完整复制成功则返回复制好的文件夹对象,
* 否则返回null(包括传入目标文件夹或父文件夹参数错误的情况)
*/
@@ -286,8 +273,7 @@ public class FolderUtil {
*
*
* @author 青阳龙野(kohgylw)
- * @param f
- * kohgylw.kiftd.server.model.Folder 要获取路径的文件夹
+ * @param f kohgylw.kiftd.server.model.Folder 要获取路径的文件夹
* @return java.lang.String 指定节点的逻辑路径,包含其自身完整的文件夹路径名,各级之间以“/”分割。
*/
public String getFolderPath(Folder f) {
@@ -309,10 +295,8 @@ public class FolderUtil {
*
*
* @author 青阳龙野(kohgylw)
- * @param folderId
- * 要修改的文件夹ID
- * @param c
- * 约束等级
+ * @param folderId 要修改的文件夹ID
+ * @param c 约束等级
*/
public void changeChildFolderConstraint(String folderId, int c) {
List cfs = fm.queryByParentId(folderId);
diff --git a/src/main/java/kohgylw/kiftd/server/webdav/KiftdWebDAVServlet.java b/src/main/java/kohgylw/kiftd/server/webdav/KiftdWebDAVServlet.java
index 2898df1..3a3012a 100644
--- a/src/main/java/kohgylw/kiftd/server/webdav/KiftdWebDAVServlet.java
+++ b/src/main/java/kohgylw/kiftd/server/webdav/KiftdWebDAVServlet.java
@@ -1454,14 +1454,11 @@ public class KiftdWebDAVServlet extends HttpServlet {
return;
}
// 删除文件节点
- if (this.nm.deleteById(node.getFileId()) >= 0) {
- // 删除文件块
- if (this.fbu.deleteFromFileBlocks(node)) {
- // 删除成功,记录日志并返回状态码204
- this.lu.writeDeleteFileEvent(req, node);
- resp.setStatus(WebdavStatus.SC_NO_CONTENT);
- return;
- }
+ if (this.fbu.deleteNode(node)) {
+ // 删除成功,记录日志并返回状态码204
+ this.lu.writeDeleteFileEvent(req, node);
+ resp.setStatus(WebdavStatus.SC_NO_CONTENT);
+ return;
}
}
// 删除失败,返回状态码500
@@ -1678,7 +1675,16 @@ public class KiftdWebDAVServlet extends HttpServlet {
// 返回状态码204
resp.setStatus(WebdavStatus.SC_NO_CONTENT);
// 删除冲突节点的文件块
- fbu.deleteFromFileBlocks(conflictNode);
+ Map map = new HashMap<>();
+ map.put("path", conflictNode.getFilePath());
+ map.put("fileId", conflictNode.getFileId());
+ List nodes = nm.queryByPathExcludeById(map);
+ if (nodes == null || nodes.isEmpty()) {
+ File file = fbu.getFileFromBlocks(conflictNode);
+ if (file != null) {
+ file.delete();// 此处无需再判断是否成功
+ }
+ }
// 成功
return;
}
@@ -1700,7 +1706,16 @@ public class KiftdWebDAVServlet extends HttpServlet {
// 返回状态码204
resp.setStatus(WebdavStatus.SC_NO_CONTENT);
// 删除冲突节点的文件块
- fbu.deleteFromFileBlocks(conflictNode);
+ Map map = new HashMap<>();
+ map.put("path", conflictNode.getFilePath());
+ map.put("fileId", conflictNode.getFileId());
+ List nodes = nm.queryByPathExcludeById(map);
+ if (nodes == null || nodes.isEmpty()) {
+ File file = fbu.getFileFromBlocks(conflictNode);
+ if (file != null) {
+ file.delete();// 此处无需再判断是否成功
+ }
+ }
// 成功
return;
}
diff --git a/target/classes/META-INF/maven/kohgylw/kiftd/pom.properties b/target/classes/META-INF/maven/kohgylw/kiftd/pom.properties
index 6fe2a6c..e5c0dab 100644
--- a/target/classes/META-INF/maven/kohgylw/kiftd/pom.properties
+++ b/target/classes/META-INF/maven/kohgylw/kiftd/pom.properties
@@ -1,5 +1,5 @@
#Generated by Maven Integration for Eclipse
-#Wed Jun 08 09:49:22 CST 2022
+#Fri Jun 10 07:40:22 CST 2022
m2e.projectLocation=/Users/kohgylw/program/java-workspace/kiftd
m2e.projectName=kiftd
groupId=kohgylw
diff --git a/target/classes/kohgylw/kiftd/mc/ConsoleRunner$ProgressListener.class b/target/classes/kohgylw/kiftd/mc/ConsoleRunner$ProgressListener.class
index 4fa6abb4284b0f531b9d83ea7a1c34218b849bbe..72352fa36cbda3825febad4caa00433fdacde93f 100644
GIT binary patch
literal 1563
zcmah}&vz456#iZ&%_PHM(jT;?g#y}Y8l;n=C{V;ofD%lhl3Jx3&NO+XLnkviGZQU4
zw=P_{QunfPLk|=W0`6S!fAk!7{s-dslAIGtI5atV_rCk?&+p#c=l?x^2H<1dOkof+
z>aYw9A>T(SKiUfevpA{aqZE}+rSJ(pHE{3A-r8_(M^&p{u?oHy`mVgu^gJ2NQTLqVInjB6
z_p*B_Pp=5X3w~7!q)Uz`uQlsyGFZ0PTuKH?e#LfI?7&g?jxeqg5y&hBel3t;SaQNh
zGOmDGRPhV09fpz`vwOszeBA>x&n(Jl-LEd$fnAr84CqD+njX)r%5;A@vMU>lcB7RG
zkrgoPN`+ZW=JO{7PVH51Z_L$cf*ac;u(8cqx-0w5pdv3jt@?KXJ9EeW&NeZO5fh_0
zXkrXgIxd;Gj0J%S^=i4cSF?&9GY^`LNLDXxR%9b`d{4&}6GdFr@ui6p7Ij=RaUDwn
zBVEIC6gXb(Lep`p3eWV;)1P;K{OQHtzwJE!{og0Qn)nJgOq8*#xUV@EQzlmMjgD^x
zthY}^PvOM68~FO#9a)Lk@UBP=Q+opDN|lhX8x85Pv=eVq=&|Yahyk^RYLzGo9Lg4_-=dg|
z{C1WCL)l(Mx|-OH%Ikk@9OZ@?0&75wU(O+r$*56O%Z9%(j8lGy+(JtONav0}L@f6R
zS}y(&;y#~ZILy-^g_cH2>&FD|!|IMSj^JHV#VNO3AmsZ5Mt{igGKndk%KsC_QwCRt
z5dRa2dx)2E4j)+)wi
zmdveF%=_d`#EUvUz$OnZlSCHNol539mFT(gRU-5UmD>mq7Q2`Z;PeiSThZgJT#tG@QMAD>_q&{|TUAS_G
zds)LMIzIP~e}fr!{sZ;gwhq>+G;{Aw&pqcm-+ATp_qQJb4B@7N76xtJohv@FA87N|
z-JqbAOl{0{eAgD&D~=<){%OxGdcya0%MSzz6oeS!_l*07W*bgXo0`2R%s@eyA+aWv
z#>T8I7??@xHbXd=v;6+U41N0lJ!VLE)N-ugG{c_cddjIhLukw`h$t93R74Srfn%eJ
z4M;HXWGXLjHmOh$Ar0Mf#AKy3E4-N+zl83ZhMhM&Oa8A5Ly|1Rk#)Q`C5O1jCqyvk
z7N!l)D2YIL1jD_G(@H6)AO9LdFZvYhY)InFoF|Neie1>v(CXVllqsy_6-mAy0}A#w
zsOKJ0ElMi(AxY?NC1BXBSCenK+O%gmK`tP`QYMNt4k*~qaH28kmB6yKyOu5P_*JYs
zCBrd_!qYC2tOh?(lc+d|LkvoZdVn;j$~8~b;*%T8DQ03gjH3#UFm(Qfg^EE85kgrK
zvmN4^Y=%hX6&z#eUTdKm_W6os7laqV2`b*|hi9u#o__uGeD&>%Z|@gk7{*Ci=ph;B
zsESjdp5bNTQOjlJ?O7G)aGn~rk_Jm2w~o;}1Ch{5F40vBHq+iN
z4R{Bld?VWF>>`;;&}4#cY@u^2tyYHU<2Z@8Awj!DUP6ceh2xS%M+@THe2&OPyr$10n
hOgP=skdLs8opK@bAj50Hwd#HyIXYu>%P@mH@DoWXa+Lr8
diff --git a/target/classes/kohgylw/kiftd/mc/ConsoleRunner.class b/target/classes/kohgylw/kiftd/mc/ConsoleRunner.class
index 3a71e343d54c84ca180c8a25d71b4af93f0d98d1..39069e35bcad3db5ed6a5b0a2b2ea0e81bf8cf39 100644
GIT binary patch
literal 27307
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
delta 618
zcmY*XO-~b16g_V~m=CA5v{FH9Z9(hISe#lFQHU`$y22>dKulLd9h<@0k}@%}V&%e}
zWELj=0oJ&H1{31Sg+I!8ri~$N?tS;2d(S=Z%zQPz7^y#hk52&H#j*w|ek|n|G$;a@
zP5-0sb^Tt)d$F+@v?GCu<**k(kgAVuRS}Ujikd;c8_J+lDsu}t1_s{*U
z*ZxK~h!x@Pq6|7lhXIKvI>o55@|Xp)>K;Kq7{MlE0s}KR$7qckm{Y6_q;Z}k$?!KQ
zJONerH+1*pJ4!=j*7s3d`GNdT6y9WuhbSH4+U_B4?6YNv`Skn2VMwX
zD2f*f-e;**S|wEy1gb2{AN@b#A7Pcp*R#9H?l7@1Rq6NUz5crU_4~Tt{{HukUjW>X
zuS>87M@1YfMJh3oB8Gyr$e!Ovsnmpsc9i;7n?G~%3w2CUOihk6ySYIqHsRh-xGI^NLmAhu}O
zD&hh*YuJt*8Xm$<4R6ZY!)Rtb`7HMDwb^m>Nnw?S-DqL*HN1tlc>@~W5%{~fNTP-I
zsau$%pr%kUoRAvc!}}U8;j)Gg@S%o}@G+12$GPvOuUwq|;nMV(Z>P`S(C`U9)$kcU
z*RWsC(1T_TaXH8rBEA&SDX7bs8WYS(
z)bfYIPMOIz^@{xpN*WV>F5+BprKJ3YXkA=h9>1OY-L^dE&CGN(@k8}YD_&fe={LDO
zAIjYW>`1J&>~4Oa7L6i3$&?oCW@D3AMji~m+Wprg*EVJ|QBc9I-=0~)SixT)wNS7Y
zk@9jWNq{5klfP0b_}_>oM6jN-7LG+67d5QA3ZMzd}}Ct+f4L@-iw3qU7>Jxw@~jTKL*a;8VYA$
z4272l;rl}2yXH9if?)9bL*eYjq29Hi_r6d#`!%muE`FNhJdS-gQFiDW7Pk8rxac~{
z6?8OS$6^JSv7M6&1;1iR=S@^nZRxgXb+l;;Ra3abpWHcx>gs64T~k=Lt~z=hcSq3o
z%|E}blW?LwL2FUM`I9Kd5%T>g!#c*N<~W}Y9c}!b+k*rSBI$?QK+FcL!Xs$qY%R&V
z2YY?~_hrdbj4nJ%oPx(_Rd|_M*~eKsR~91j7b;bBsObEYFIN}WBIxEW9|TG{dLe6;
z2QxPunmIltq40Zx@ROl%K0=}JdxP-tQ22p4;46agXF}lz=YX#a!q0}n`DBI$zbeSt
wbD?lPwxRIVLHLDG_~Ua_Oid7eF$7+OLp}oz;|Y#Y^6&_I9#G1N)^OzCzp7&tM*si-
literal 3604
zcma)8>vI!T6#v~cbldboLrc+$s6fRgZ3zWbpcO2!U?nYuKx>iLHn~l=O?S)grVo4}
z_(D;9p@?t&pw8%w%t#TKas1*J|Bw2`|3N%=v!U5#>yVl3>C~v8CyXm
zL(B^+Xo-xP&kw7a@x&fsr-eBs%(SiA1&g859@VU-jkH$Eiz-{JgF%^6^Gz8$=yC
zXF2W?G?&;bqfFX)vajsabj{wu(ADg-FZb)43UU=2U7uVNF)Yl3>Tq5#)TIo{en2%f`R)#eW!4OIu3~Ri*7?2XjLs&&SYT2r3i!4Jux$HNMNnzTW
zuu6p?w>=RwVZDNf?q(
zKuLdGt`k~4CgAwq8hNjJvU#WtxtM%UU|t&3v^b`}ZIJ!1d|2-!lb=8JfJd!CMf)kW6zBM>&q+I3+?w
z?9sDg#!-N@oL4!9k)bK;_Efkz9UG7^!7+lI%WQ{E(Ng+aal5IwL(n+JFfI=%9RSB{
zd2^9;C9Bv#6(*?qf1mqt{>sJqpD)dy`C2P6H*FExgY&}u4
zf;>^F?v8@Q7q6gFg084;^@VcRq^2WFs+Sq>RVQ6nQe}Infs{l+68lw-Gg1?lxpVGe
zlv8hTye7|LgFEFtHqzoPjyI(?NCl9NNpBrhdxzs)&p4@FQFf%2S4H0E_(0m0f?H6M
z2F>cq=Z)#)D0O1duUgi$VP@sJ7dbwZb*t5^eUn0$fss*BI4^O0Eazm@z3NQ)fuIg1
z(VuaAE_KUeVL38G7NlTlqhMx)^h$eJ`Zm}g&nqq2t!MIvMe11WVhX-tX!IVkvW7>>
z-Xp&(l6eYWSk$D58T4O*P&6vrE)cDgO_#n;>gZnsju4j8(>A(S(7iU^auv(styd9^
zUqjs$8VaF-u9f5lXvRvqa_6}g_uyW7Yovd52+HXws%aI5`>=|x((5L=OITI>S48J<
z|4;N>?yjxOU6t#O+Ar3+_;wes{DyUNi2320%izjwICZ!{c&i`2EfBupcJ$uW6Mp#4
zKsdF$z}2_>;>*1|5Khf65Wdw9-x~
diff --git a/target/classes/kohgylw/kiftd/mc/UIRunner$2.class b/target/classes/kohgylw/kiftd/mc/UIRunner$2.class
index 77a2f98f9b9fb1045f40fd0200d879e0a94485e3..7013783c771a08e6dd716fcb678844b4838cd897 100644
GIT binary patch
delta 396
zcmYk0xlY4S5Jm6U@e=b450a3CKoZuhQYh#^G^C-T0?`^`Aw`x!aYPGzg5`#WKcE4L
zMHEQ1d<8uvcL*z0(E3VyPP4&zH{ny
zJjXxk>>Tvn!(rHMQ!$i9#;EniUUWh2=$6*c2xjki_oU|xT~zrj9Rvd;WenzP6%Gqy
ztb(ge*5s$zx&t*Ipxh)gHs{z0Tw%@tDTS?+bHoE*<~?
delta 394
zcmYLEJx{_=6g~H~w52|zegGB)!A}Y#IJoI13yF!7>{S{gX{xcr75_rh#l^%Q;Nsv%
z9Eh`HYVVF>mm&n2*C=I6{jd!BSIny?lb(G_ZXlEo=P>FkDuaeNK
z5;c?v#^B=ka^Q|U0)+(UFs_M0+@-F%O|YYPdrXkMAn>jZd^ZfekZnAJD+98uWH@gv
zxUw+0&!m44DPuNUPms+Q%s!@?IleV^0=JmwTc+5=0v7pI;K~s68;j{8O4BfZpFxsu
zyke>KjOqhpf&Z+#G^_ZhnP#yXb*ypFG_}qq1?#DG1Do7cY$1;ZBa>yxQha^^EP5|x
diff --git a/target/classes/kohgylw/kiftd/mc/UIRunner.class b/target/classes/kohgylw/kiftd/mc/UIRunner.class
index ebcbed533340a0c96f487a3d42389f066110a17e..c22c7dcbe152fa31cd2963493e58c575bfc6f0cb 100644
GIT binary patch
literal 2710
zcmb_eSyS6q6#g!oin#=r&?Or!i6Lew%F;C?X#?3v45Ts8lBSDnD@H+;UO>Dv$4S?peNb?m0*L^Y6#M19%-jrmznuQ(V1~
z!kc)@z}qRb;bbpQ&uGfoUI@IWSLb@sg7bQH!NA27BrfUAWdqYG^x%r#T-8Ia6MdL5
zFq`5`-E+96b-u5M>jv@ya@zCkV9K?^&<+J!YL38x+={BuM^wUvO_c3
zCJQyktoWsxYnypHSha(N>6vItbFD??3LI$?2qQL=XXaInaZ0)5O4oy-Y(Lh;+ys%6%cf9!z-S~@9ita{zZMkji;j+B_mjwvYXlO9&~IQt
zVi6x0_)uaA)H%?2U)z|b-AUh9p$e>O3?S_3z(;A^B=D0@ZN>t$O%6CHZ`4UxpE)k$#;s6c`?AuYZflxwWOrnOH
z8tYBE6J3aFd1Z61aN8~_fxTO#%{<`UH>#}$j>o8**W#J^tFxI?_J+>pp+@eV@=~Cy
zY^!N6w3JumEsZ>tU^_`pq_B!RQSsc+MR}K58Y(LwgxPS;j+(^%{JCX-L0r6Zbf&2
zEs|ZUoQycDD^z~fz?TwV;aiDg7?*fW52F|pIJ{N3j<@Qs*k&&3zid?2Evu;ffO*)(
zZuw+q;CsG@a=yP(s|x&;jk|Ny4C)Hv9(URDO0FGdV$O*KTVApL%SlRu;QYO+{of8_
zle^2--zG`CQ>@{nBim*&9cf12g@JfFVK_a>k*eyr)v7We((Fbzt^w(apC8J(1&mHZviyoz6K9N
zv6%4`uh5_{ghq`CqakUeh8ubZN6onNaJsQs@4ON>(@w%l*&1>f@_&PVWf+tWYsl2$
zMJ|U1zm5>{G%Ocqz2zkw`6wVrB9(B+R1ee~*RcXCH57?yZ;g+m7^}n^?=DrtYKE`~
zDB+-v66EHQ&NUq62tQI{x+JaRs6a%-lr}vN3{@P}s1Z+=vUMEwSTDXPQObJIz_AgV
zM2oM{oL;(#$eK9@F$J&!6Bn!BSWRgQ6fzPvibp8_$dZ&bwjC7Cbj95dq
zjxmgDND8J!@;Oql7;?r<$GBj`9V>HHv}udIK^3DRoRWpu94By+0vQS{#jbFic4L>_
zm?3dDInKi%+>MYF!w;lVW~L))*tThlpudi~ewU$4Oln19QB$XE2DRI=#xA81Cc2mI
z0D~@%k31i>mF^df%V?&!8BX2|`4V}sb`Ak0i(nRo-3us*&7riXeja5&7Hi3=luqqD
zHb}d90Zp;m`Z;XRV%Gv%W5f=&XR)Vl7W-e)avpSvPyQ`a-Q<`5*Z@7Q5RMiSbBF{K
z&>iZS>INe}$wZ-U{D*SpZ%XAK6l&HIrNUi~jyajd
zpp^ROE>%A%Bz)M-jUYi*9#fkBi*Rts^(Jr?*Ie&9CNYIugjz+2+qi>!^!A%*F2B|v
F<~u6S!}tII
diff --git a/target/classes/kohgylw/kiftd/printer/Printer.class b/target/classes/kohgylw/kiftd/printer/Printer.class
index ca989b3280f54f17f10ab96d1bbd37099587336f..4878efe7391dd5b75fa938f75854d392b684b1e4 100644
GIT binary patch
delta 949
zcmZ9K%TE(g6vlsd`j~c@B2XwVd8)`uit_LQD&ku~5fH(OIDrYlKq0i6;HC=~ChnS9
z5qEA_Q<6d;F>&L<#D)KmdTxP4%_QG>-0zoOxZkR
z+GNJ&IbAjhx)ds*DEYsq$qSoVrfps_ryIW#;;h1mSlR9h)sp?#;*G0;=)YGtQfYU^
z`>N{0ilDQ$<|Y@sK7Y688QtCwqdBgK78)(B#>Zr`w9Mx^D++T>N6SftUGPTTRLWU&
zy?tLtMmjk2^KaIjv^%*v;m)rn7i5KtZhCkl?WPp|*0#j3BG8%`ZkwV>9;;g3)JIq^
zNjyuhreI}Hg%hRsh@x4dxL74N(7ub>7RTU}V6c!3a+(a-hYZdX>V;|HtkCrBPtwN_
z+kb#Dvx{#Bf6XTCdjxg}*6d(zQ8$t!e1Ij#MP+uLNJpOHJSXy$Y)jo@s-$X2>gcx3
z;z2|-7t2>dIi(pPlnbRy#)#5KOf(^ANL)=TZ3S`tM?<#DnTe4w>8Petf`F2f65*Vq
z>qzux0tL~NIsD%k%VBO3$q^J`rCSXBCAUoEW)6tX>`|VlVwadC$|?nPQuxQIDoGvB
zq<61piAftoVo=_}mH}e&pH9f$kL4r(TIRZnE_B=P#gHhW$L2d*B~00KuHJ--rx>OpBa_)I
z7?wGkPnwy0Zdt)3=yC?n804&J#kMSya9!b^bd2B4ay90NNH`tqndgEma6z8iU&Uyh
zj28sIDB~rA;8W}`Y_x<9vOpxiMe>78qe$U?I6FDy+%WDi)%oZYp`Fq0zI+J(J_Q2m
zY4tcs4;m=urBr}Mr=1r8G*K0Q{24BafWc$1)FGM=O3?HjbRQvjfRKKG_C4rRWpo}R
zoN6S5zTOHV6%1BzeV@Ae5kxD-h%Cnp5m8WIh4OyNG!c4`P}>M`0Gh)^JHe}t)JEA`
zxJ{kz&`bK?B{E}7!(BSL$#iPM5JP{J?k)|%>CTj){Y1Qs_8s`j2ob4!dl;|roFJaZ
zm`okvaRt+dNLDc4n4*OzskW9%Q>r!#7o28TfbNLYLaR=~wGwqsGK2&t<8
diff --git a/target/classes/kohgylw/kiftd/server/configation/DataAccess.class b/target/classes/kohgylw/kiftd/server/configation/DataAccess.class
index 4f89226cce803d25dca23a7a0000c94d17227c2b..1e8750ff41d70d01b6f2b8b048116231badad521 100644
GIT binary patch
literal 3199
zcmbVOX;&0i5WSCWnxR3Mu(-xu**j`XG`IvXWN|>kC`!!M%rry8OgDBn0vfaLdvZ=b
z=07BQ&X^-7`2qP+Np5uy!(^OzFkkxBd#_&Aty}f#^`Cz|_yfSx_%V)NOvdnP95tAX
zV+twxT$bq-k)}nuD$+HPW<+{Tr0X%f9!IkrYQ`Il=)s#Jy(QAyBAGGF#?g*R4QUxO
z8b)QbVwj6#XXGs_(tIOqENEDiNlrsP1}6qr!%`dvaYKWr!PgMPupGlpg{Hi@v}Ac>
zcFyt@j$Ti?Ue@rJJlo06d1l^PalJ(&?Ru7ByT+8|yUSkM8dA{nYqMrx`=hQimsL2j
z)pHGJY{w4HDb#lNOe@rlx*1DhThex{iRJvP8JNTAwB`H68qaW+3Xv;p@9s%1m^aN;
z!@rRW^`af>)nsV=Y}H5>GP7wz%tQnj7d)FT$4$q~TAny78QC$l>;!h+nzntL$cG)r
z4MI#I@apV3fwdYKW=Yi;u}p`6ItVev7#Pu*nGRfUO*Rxpx~qrK6JjrBrkF(|Rm}#C
zcUHH-%=rGCLhs|)Y8|(Nc{ej@O34J4$5`teiVAHHg`jY%D#f!5%{S(vILpZxUJl$9
z+p{tR-4&HtDQ;bisjr<
z^t*9I#@t*+U?oD9jhyLZjZ`4liay)QF5QM=JgOkMh`bM*^*boVsxb6;oNX{8muEJGi6cU6I}s>3xwt5a~maKEfS^?kdTsT8cV8#wR)k
zFsS2Ge5Ruh{W?C!7YfI!*m!h86?PSS!(iAO2BY3E7@gAbrGWfO@O25V<#`!dwk2gc
zzLpri!M8Ddr{jBEWI8I6tK$dUR%nc@UK>v;9I8fcW#3d7e3Y8xKDFitR(_+36j~(s*^svbIa}jmEM&DZE
zE5f%ngnIdtRfD*+2TE~i7#!=Nq`UEZj5C9ylGWb(P`^^B!Et^Y!o}@4
zL0OL!_`i0NGlggHEVbnDEsixDkFTR<=00kZeZQfufcgR&A}LmY7DAsVEfLw{;W-`@Iu6B_r34C8G~X<
zY3RUtJWof%)T-z6jMflOf=feG7`YDRV-y#-t?&ZIxGsE6a}>Th*U?UF9m&2#X8~P(
ziR}gKDB~o7I%*xKqZ4SM`*t!ffFdqBOI)fZxs=?$5exmTuVW|u?FzHA
zyMR4+@g%>Ay(O`LeHV*Ly|S~vd?(rPI}Xg$uH)cLQHPZ7NgU#b=kDWhYNoDo^GMld
zedXrS&CPpAlz+5cis(4A$G9COmcJ1J^Odgx%~C_!#@EW!p{lRDYTFKV};4$O?%uO
zjq-M=gBv=qbG|p~7M#fSJ^QQ^IcIV?9fk?iD>PnnZa8+)@d|d|$Tgjd6qc8qi3uI_
zxJ4Z*?7f=xgMuAS1g=*Y4V;p`=?CLf8ED(}?ExM7I51UT5ASej@+Uxez=8l
zpa--=84GEwQAoO87&%@}E9`4&%`RFzBQ~2XG-I7YqM)OGCmK^&OC9r_l)%P+
zrPl;tVKcT+!40Qa)_tQ)Q_CEAQ-VxQl@_*I*oN&2OOIF6)ihVu=+CqcEyGUiPGA=+
z5_`rfNi8kx!Cr-Bp`LI8C-MV@^c>Sw@f0kyT4+N%?FbIMyd-Mj#f3grYm-T0pTept
z7^d+ddTk3&O7@bGZ>%M8fDReBUFppxa7ba-V$hbrQwp8`byFf9oD3sfn)V=xBMK`o
z5L&%4zB_M~iYXk%)+7kt#vWgQHOork1gqO0_-uv9)!{5>85B-gXu#4W&Pcl$*o!`4
zbz4Xv$qZy&PhTjPMs#q|87UHP>8zh~ibGD|%I_+%XS0)Oey0{3jH`I
zy?4>VB|%RUdrz_=m6RSda&qmmg)7n@=}8+Ff+Q@B(L+D0tDrRZ)
On>uBya;VjW$s>_IopBlc
z8EogGSi*N(9a6GLcuL9E;CBN*m+==T3ZT~TR~@NSQ?P~~U}XhsA7K4`JaHF0DriY}
z@WUJ{=sYi%+6+Ive=aAx^bZ^yUNVKl!*Zv+dgp20q1=5O9UQKo&pbAV*)X4Ze3p3+
zC#Sj7wolJ+@1g7WILx#BY-3o!QEb97Cg3P`BZE^ojuD(-6P?5_JpW3{L!8DlyxGjq
zcjE{2U@w22V#_|ulj0wDph*zy_&3wmb|25pnp#RSus&8}#peb*kMpD{WYJ5-7kHLi
zef(yoaho*B^noe#58uZ?mPul|2P+sdr{M}-GN)H77%?YZ!C3oml&XUSxG}Ee6Rg=*
zJ~p@Uskfbvt{r^!?3@XR7OI{knUHZ5>4QQE9`PVPrKzir6#ptzhzVRLP5c`tT@bTn
z3IY9#dOO-HD0kdNR|S*&I$6P+9kZ@96G%WSU1`G#v|}wgnD>3L8{3ScsvA^E0py@6*r+lxSV1O+X{BFZIhD7b+(seFJiuVAU5AczXK
zf=^)SlZa!9zNN46^pf*>X675sZ2m
z^Dtgoe=%9{WM1Whm^L?oAyY34rdsWqOEqcERi}AV?PfJ_-K$ZJ8jTRb9wszmXwv9H
zT%!t650e^Gh?lBnVgfZg`O|!EFTY>NEpP1jo5zBj_YQLAdb+1PWA*}tr-6XE-@-LwF9Of5Kt()4m-*Kr3M|NU>%qQP*+UPj-oN?56!{gu`Dw~z{)^v7ll?TyVDAM!zT)kGA^v5X$xory
BMX>+?
delta 741
zcmbV~%S&596vn@qo7-!WF^$p0+WJg=9+toE((}-HA4-k>y!i~Ey
ze}`f~5L+nS75d+}=(hBmX>6d@@t<_06!p*Pj0ti^0J|g*a6E$7fO1U!A<3l8sap0#6iNJcwfq
z6CTF(Nu=T`3?Z#A#EL$XO`UhfW9E5I;VGu|t*rWP{e95f5g738#Xs6;ZiTgAJ3Kau
zWrZkM;$zXn0{wQUJf`pr(*o&6xVIMWe%Sw558oUv8=1G^p{_gUEljc2;b4*}Q5gD`?%qH4+_LlH_RwfDsJvG^tEL3WK!5%t@rdq*|nA7#e;D
zv5QA6fK`2M`vKyGD?BdVU{vCgPZB-ttkupi#QQEAyZ%P;(cU%byR70I8!
f&o7Z*{y)CNb9N#5>zb8k*#1k}SN0ygTYcphoQF-5
diff --git a/target/classes/kohgylw/kiftd/server/controller/HomeController.class b/target/classes/kohgylw/kiftd/server/controller/HomeController.class
index 09c52ad1e3c8165dc9e6e2897441ebca1cc0e542..0399101fbdd831e2d3445e03677991d69ed9d47d 100644
GIT binary patch
literal 9502
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
D89qB=
literal 9502
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
diff --git a/target/classes/kohgylw/kiftd/server/controller/ResourceController.class b/target/classes/kohgylw/kiftd/server/controller/ResourceController.class
index 901eba389866fcdc0089c20be30ae0e27edcfbc9..afa7865dd7e37bb3392f7e2219782842ddf1ac84 100644
GIT binary patch
literal 2847
zcmcIlZC4vr5T2U^Qj*0YrC`Ns!Iy@YW@}3+8f-081P#auF&>YfHrY$E5O(A42Ey_9
zpY$Bh@!$u4fIrIPGj}(eU^ay>d|)m!J9p-px${i^`S-8CiD-qs&5%axW0a*Yvh;#p
zviOq4D;66pHd(x8@fC}$G<}_>Z9xgw6O=C=JB|8z^GrXs4t-Piq}J&9QygX*Pkpi+D3K
zA$7Jc{q6@rW=`SMn}%K24}90M>xB?Gm*14W-thgFz74^J!%&hxx25M_?dG-630dF*
zM-Q#0+%dTzZp)=~g3@jfQqaR|<`#6zl|g(#K?xo8Q1O66B!VV(rQdMOeZw_Qq%Zl^
z*NTo?*S!{(e#quC$3521WL2+Pwt4yeRN=cutHo^+G;(S*+jynBdS6fVUxHeH6*PZ&
zKBBCb24(fy`S%UK(H({GA%AdOvtr4!5JOk(!;k^Aa>oyxrWk0b{m*BAzue~&YJEN$
zZWc>CNwVV$n&wE6-sd+1d&M%PQ+5s8t6{DWz=<{*UAX$4g27sdo00pRFfMT3I5Ikd
zuHQxszZ%R9$2>Si%mbt=_9u==R{qg6pqV%KRcT1GMZ2@LJ+hwrLKvW8h(j*Y|X
zDP}EW#o$$<$=o>qzPz4e4Q&+X1kN#>s1WiFG##hFIkNaCiQn;0
zf~FwZnc#L8QVSetnr5I0?g*vSjfjgAz;2k1i;gqF#^;f)Txo0JAF4V&EJG
z!Zm!GRlUJ-V;F$LW3gfRglp!zSTC_(U+0DuRod!{7W*Bs}_%K7xHB3B$*1^prni
z#DfjRm>R@52aNMKgYn@|jF_jP7)J&%=74eGW-u-c#fWhqig9!hqYjLZZwBMiP>joO
zz?dGyxC)HVZwBL|p%}3&Fw{)Aml$)VMOJamxzTUY3&1Gk7RS;Y~dm@y(0
zE11@kaO*MRF?|Xfwh=vro%5|gV=iYn-vy0{fpi-xUBL28m~JrgN*Ec-F05n^XA+UM
zfc+PgNe+;I8>?tX#eWd^M&)Q>IlNz(@(ESgSmF(Ie-5WLBuvm}Y8i0ppF{7JU-%CP
Chfd-E
literal 2847
zcmb_dU31%15Z!A#bz>`SNYj+I6q*#M^HHmmG%YyLHfhrYoRD#h8HOj>y0Miwl9A-Z
z8HWD^Gt4mIfgiw+VmNyx%QhAyp2>qH?bT}c?Abl*zyAK?Pa;~TuhWze^yJWK)K8ly
z`k}S&o4P06W9jNO$M#*P*~DW>dQRJ|$@S2gb3XHx0Y4e^Wh>HD6G|^#tXM
zu>m=*Rg+P)y}&LAx?O79zI7xkmSJmMwSMM^)*T4TKgnRdi}bvtqaw+u>o#Z&=8+91r||
znE;4vUHV;$1erO7IN)W^cP+bK2y0*ln$p)BzTeU}abXH@P?A5krRSgT=C#0yEO4pM
zi;i2@y%xvcca0-?;<$(UiLB~X%Qgq;Qqi}KR*SI+8ap3u;HZ5q|rjxdv~|o=N(!D-k)fcXKxMBiY3;q>_DC~96hoJ
zzIdw9isG~1W9{_Y^2T#Pw{TdoOzD(e!}e+r*&YPiMzMwSxe8``KCVyq7*AZ_ym4T3
z1YLZ{pg*OJHOD+HFuSW7JtIJ826h}Di)Z`wQ$f?YSRhjjByv;PImj!Gz94Lu$>?oF
zW$B`YpF4nkqE_7xV1$YCro%usG+Lu|%*vix#2b(*y3$=b>>I4=Jc~ilVyrklXjnS_
zX-n$8FQCX9I!6Cr3!Y}7&m{gNu+v$jxTj(9{VMLPUMyH#v#@mB1@2=DzmxVW9ujm7
zS9T_PhpywQ1r9U`n}b5Tlu{wD!J5YJ<_{!1nxR{GKbgeAyL{-;ZP=vJe2*_uc%E4J
zjqWTiJvyWJQq)VAL0Y0aNOf1GTnL=Ql=uvx?jt5Y&C;Cmo}dTxA?o~yPm?OwEFK@=
zCs>`a7$1&=F*l5H78vI)2P1YuEXKu=FfI*a%mL&4(s
z1a6TwvPuy`>0nI2;Q7bugWGVv7g4@tc(I@|obQZYilKCCDqW!dOr(D7vapgt^}kkC
z?BE@*9xc%M8NEpk$$S%@TPpVbz&9#I3rpdh!{Sb;qQ(=dC>C~t-m2?nRN5Bo9-UwP
E1B!M`mjD0&
diff --git a/target/classes/kohgylw/kiftd/server/controller/WelcomeController.class b/target/classes/kohgylw/kiftd/server/controller/WelcomeController.class
index 414b6dee6b0bbc9eed9330168c36aca8b2713b16..3bbd13b7917914a811c61acd95ff3886b85c41f7 100644
GIT binary patch
delta 240
zcmey)@|{KR)W2Q(7#J8#7$mtESQtb(7{u5a#Mv1n7#Y}XGV?M^>=+rCH8jH*8Cab2
zQ&K0EKb>647{bcKz{l9|-;{q~3_KGkt007q+8}tAG
delta 244
zcmey)@|{KC)W2Q(7#J8#7$n&lm>3xhCngx0u`{qRG6-ZPmL=-vB<7{-`zK|kCYLZW
zu-RnhWtP}6GB9gshA}d*IOnINaxpM7aPly)GO$h5d&