diff --git a/doc/doc-api/src/main/java/cn/axzo/nanopart/doc/api/enums/DatabaseScope.java b/doc/doc-api/src/main/java/cn/axzo/nanopart/doc/api/enums/DatabaseScope.java index c7f68da7..436e791c 100644 --- a/doc/doc-api/src/main/java/cn/axzo/nanopart/doc/api/enums/DatabaseScope.java +++ b/doc/doc-api/src/main/java/cn/axzo/nanopart/doc/api/enums/DatabaseScope.java @@ -12,14 +12,15 @@ import lombok.RequiredArgsConstructor; public enum DatabaseScope { // 匿名数据库 - ANONYMOUS(DatabaseType.NONE), + ANONYMOUS(DatabaseType.NONE, true), // 企业数据库 - ENT_DATABASE(DatabaseType.CREATED_BY_SYSTEM), + ENT_DATABASE(DatabaseType.CREATED_BY_SYSTEM, false), // 项目数据库 - PROJECT_DATABASE(DatabaseType.CREATED_BY_SYSTEM), + PROJECT_DATABASE(DatabaseType.CREATED_BY_SYSTEM, false), // 个人数据库: 为单位建的 - PERSONAL_FOR_ENT(DatabaseType.CREATED_BY_USER_FOR_ENT); + PERSONAL_FOR_ENT(DatabaseType.CREATED_BY_USER_FOR_ENT, false); private final DatabaseType databaseType; + private final boolean childrenNameDuplicatable; } diff --git a/doc/doc-server/src/main/java/cn/axzo/nanopart/doc/file/index/IndexManager.java b/doc/doc-server/src/main/java/cn/axzo/nanopart/doc/file/index/IndexManager.java index e5da764f..c8eebe72 100644 --- a/doc/doc-server/src/main/java/cn/axzo/nanopart/doc/file/index/IndexManager.java +++ b/doc/doc-server/src/main/java/cn/axzo/nanopart/doc/file/index/IndexManager.java @@ -54,15 +54,13 @@ public class IndexManager { @BizTransactional public IndexNode createDatabase(NodeCreate create) { - indexSupport.lockParentAndReleaseOnCommit(create); - indexSupport.ensureChildNameNotUsed(create, IndexNodeType.DATABASE); + maybeEnsureChildNameNotUsed(create, IndexNodeType.DATABASE, true); return indexSupport.createNode(create, IndexNodeType.DATABASE); } @BizTransactional public IndexNode createDir(NodeCreate create) { - indexSupport.lockParentAndReleaseOnCommit(create); - indexSupport.ensureChildNameNotUsed(create, IndexNodeType.DIRECTORY); + maybeEnsureChildNameNotUsed(create, IndexNodeType.DIRECTORY, true); return indexSupport.createNode(create, IndexNodeType.DIRECTORY); } @@ -70,7 +68,7 @@ public class IndexManager { BizAssertions.assertTrue(format.creatable(), "无法创建: {}", format.readableName()); BizAssertions.assertFalse(TransactionSynchronizationManager.isActualTransactionActive(), "不能在事务中使用"); // check without lock - indexSupport.ensureChildNameNotUsed(create, IndexNodeType.FILE); + maybeEnsureChildNameNotUsed(create, IndexNodeType.FILE, false); String fullFileName = String.format("%s.%s", create.name(), format.createFileExtension()); String ossFileKey = ossClient.copy(docProps.createFileOssFileKey(format), fullFileName); return OssFile.create(format, format.createFileExtension(), 0, ossFileKey); @@ -92,10 +90,9 @@ public class IndexManager { Ref deleteOssFile = Ref.create(false); try { return transaction.execute(unused -> { - indexSupport.lockParentAndReleaseOnCommit(create); try { // check with lock - indexSupport.ensureChildNameNotUsed(create, IndexNodeType.FILE); + maybeEnsureChildNameNotUsed(create, IndexNodeType.FILE, true); } catch (NameUsedException e) { deleteOssFile.set(true); @@ -118,14 +115,24 @@ public class IndexManager { } } + private void maybeEnsureChildNameNotUsed(NodeCreate create, IndexNodeType nodeType, boolean withLock) { + if (create.nodeScope().scope().isChildrenNameDuplicatable()) + return; + if (withLock) + indexSupport.lockParentAndReleaseOnCommit(create); + indexSupport.ensureChildNameNotUsed(create, nodeType, create.name()); + } + @BizTransactional public void rename(String code, String newName) { IndexNode indexNode = getOrThrow(code); if (indexNode.getName().equals(newName)) return; docLogDao.log("indexNodeRename", code, "newName", newName); - indexSupport.lockParentAndReleaseOnCommit(indexNode); - indexSupport.ensureChildNameNotUsed(indexNode, indexNode.getNodeType(), newName); + if (!indexNode.scope().isChildrenNameDuplicatable()) { + indexSupport.lockParentAndReleaseOnCommit(indexNode); + indexSupport.ensureChildNameNotUsed(indexNode, indexNode.getNodeType(), newName); + } indexNodeDao.rename(code, newName); if (indexNode.isFile()) fileBroadcaster.fireRenameIndexNodeOssFile(code); @@ -207,7 +214,8 @@ public class IndexManager { indexNodeDao.connectNodes(TreeUtils.collectValues(connectRoot)); IndexNode rootNode = connectRoot.getChildren().get(0). asValueNode().getValue(); // resolve the name issue - indexSupport.incrNameIfDuplicate(rootNode); + if (!rootNode.scope().isChildrenNameDuplicatable()) + indexSupport.incrNameIfDuplicate(rootNode); // get the coped root with full props return indexNodeDao.findOrNull(rootNode.getCode()); } diff --git a/doc/doc-server/src/main/java/cn/axzo/nanopart/doc/file/index/IndexSupport.java b/doc/doc-server/src/main/java/cn/axzo/nanopart/doc/file/index/IndexSupport.java index ff57d2f8..10a259d0 100644 --- a/doc/doc-server/src/main/java/cn/axzo/nanopart/doc/file/index/IndexSupport.java +++ b/doc/doc-server/src/main/java/cn/axzo/nanopart/doc/file/index/IndexSupport.java @@ -117,10 +117,6 @@ class IndexSupport { indexNodeDao.rename(rename.getCode(), newName); } - void ensureChildNameNotUsed(NodeCreate create, IndexNodeType nodeType) { - ensureChildNameNotUsed(create, nodeType, create.name()); - } - void ensureChildNameNotUsed(IndexNodeParentScope parentScope, IndexNodeType nodeType, String childName) { IndexNode child = indexNodeDao.findValidChildByName(parentScope, nodeType, childName); if (child != null)