11/*
22 * DBeaver - Universal Database Manager
3- * Copyright (C) 2010-2025 DBeaver Corp and others
3+ * Copyright (C) 2010-2026 DBeaver Corp and others
44 *
55 * Licensed under the Apache License, Version 2.0 (the "License");
66 * you may not use this file except in compliance with the License.
3333import org .jkiss .dbeaver .model .app .DBPWorkspace ;
3434import org .jkiss .dbeaver .model .auth .SMCredentials ;
3535import org .jkiss .dbeaver .model .auth .SMCredentialsProvider ;
36- import org .jkiss .dbeaver .model .fs .lock .FileLockController ;
36+ import org .jkiss .dbeaver .model .fs .lock .LockManager ;
37+ import org .jkiss .dbeaver .model .fs .lock .LockOptions ;
38+ import org .jkiss .dbeaver .model .fs .lock .LockTarget ;
3739import org .jkiss .dbeaver .model .impl .app .BaseProjectImpl ;
3840import org .jkiss .dbeaver .model .impl .auth .SessionContextImpl ;
3941import org .jkiss .dbeaver .model .navigator .DBNLocalFolder ;
@@ -90,9 +92,10 @@ public LocalResourceController(
9092 @ NotNull Path rootPath ,
9193 @ NotNull Path userProjectsPath ,
9294 @ NotNull Path sharedProjectsPath ,
93- @ NotNull Supplier <SMAdminController > smControllerSupplier
95+ @ NotNull Supplier <SMAdminController > smControllerSupplier ,
96+ @ NotNull LockManager lockController
9497 ) throws DBException {
95- super (workspace , new FileLockController ( ServletAppUtils . getServletApplication (). getApplicationInstanceId ()) );
98+ super (workspace , lockController );
9699 this .credentialsProvider = credentialsProvider ;
97100 this .rootPath = rootPath ;
98101 this .userProjectsPath = userProjectsPath ;
@@ -101,7 +104,7 @@ public LocalResourceController(
101104
102105 this .globalProjectName = DBWorkbench .getPlatform ().getApplication ().getDefaultProjectName ();
103106 this .fileHandlers = RMFileOperationHandlersRegistry .getInstance ().getFileHandlers ();
104- this .sharedProjectsMetadataInfo = new ProjectsMetadataInfo (sharedProjectsPath );
107+ this .sharedProjectsMetadataInfo = new ProjectsMetadataInfo (sharedProjectsPath , lockController );
105108 }
106109
107110 @ NotNull
@@ -303,7 +306,7 @@ public RMProject createProject(@NotNull String name, @Nullable String descriptio
303306 @ Override
304307 public RMProject updateProject (@ NotNull String projectId , @ NotNull RMProjectInfo projectInfo ) throws DBException {
305308 validateProjectName (projectId , projectInfo .getName ());
306- try (var ignoredLock = lockController .lock (projectId , "updateProject" )) {
309+ try (var ignoredLock = lockController .lock (LockTarget . of ( projectId ), LockOptions . of ( "updateProject" ) )) {
307310 RMLocalProject project = getWebProject (projectId , false );
308311 Path targetPath = getProjectPath (projectId );
309312 if (!Files .exists (targetPath )) {
@@ -330,7 +333,7 @@ private void validateProjectName(@Nullable String projectId, @Nullable String na
330333
331334 @ Override
332335 public void deleteProject (@ NotNull String projectId ) throws DBException {
333- try (var ignoredLock = lockController .lock (projectId , "deleteProject" )) {
336+ try (var ignoredLock = lockController .lock (LockTarget . of ( projectId ), LockOptions . of ( "deleteProject" ) )) {
334337 Path targetPath = getProjectPath (projectId );
335338 if (!Files .exists (targetPath )) {
336339 log .error (MessageFormat .format ("Project folder ''{0}'' is not found" , projectId ));
@@ -699,7 +702,7 @@ public String createResource(
699702 @ NotNull String resourcePath ,
700703 boolean isFolder
701704 ) throws DBException {
702- try (var ignoredLock = lockController .lock (projectId , "createResource" )) {
705+ try (var ignoredLock = lockController .lock (LockTarget . of ( projectId ), LockOptions . of ( "createResource" ) )) {
703706 validateResourcePath (resourcePath );
704707 Path targetPath = getTargetPath (projectId , resourcePath );
705708 if (Files .exists (targetPath )) {
@@ -731,7 +734,7 @@ public String moveResource(
731734 @ NotNull String oldResourcePath ,
732735 @ NotNull String newResourcePath
733736 ) throws DBException {
734- try (var ignoredLock = lockController .lock (projectId , "moveResource" )) {
737+ try (var ignoredLock = lockController .lock (LockTarget . of ( projectId ), LockOptions . of ( "moveResource" ) )) {
735738 var normalizedOldResourcePath = CommonUtils .normalizeResourcePath (oldResourcePath );
736739 var normalizedNewResourcePath = CommonUtils .normalizeResourcePath (newResourcePath );
737740 if (log .isDebugEnabled ()) {
@@ -803,7 +806,7 @@ private void movePropertiesRecursive(
803806
804807 @ Override
805808 public void deleteResource (@ NotNull String projectId , @ NotNull String resourcePath , boolean recursive ) throws DBException {
806- try (var ignoredLock = lockController .lock (projectId , "deleteResource" )) {
809+ try (var ignoredLock = lockController .lock (LockTarget . of ( projectId ), LockOptions . of ( "deleteResource" ) )) {
807810 if (log .isDebugEnabled ()) {
808811 log .debug ("Removing resource from '" + resourcePath + "' in project '" + projectId + "'" + (recursive ? " recursive" : "" ));
809812 }
@@ -891,7 +894,7 @@ public String setResourceContents(
891894 @ NotNull byte [] data ,
892895 boolean forceOverwrite
893896 ) throws DBException {
894- try (var ignoredLock = lockController .lock (projectId , "setResourceContents" )) {
897+ try (var ignoredLock = lockController .lock (LockTarget . of ( projectId ), LockOptions . of ( "setResourceContents" ) )) {
895898 validateResourcePath (resourcePath );
896899 Number fileSizeLimit = ServletAppUtils .getServletApplication ()
897900 .getAppConfiguration ()
@@ -936,7 +939,7 @@ public String setResourceProperty(
936939 @ NotNull String propertyName ,
937940 @ Nullable Object propertyValue
938941 ) throws DBException {
939- try (var ignoredLock = lockController .lock (projectId , "resourcePropertyUpdate" )) {
942+ try (var ignoredLock = lockController .lock (LockTarget . of ( projectId ), LockOptions . of ( "resourcePropertyUpdate" ) )) {
940943 validateResourcePath (resourcePath );
941944 RMLocalProject webProject = getWebProject (projectId , false );
942945 doFileWriteOperation (projectId , webProject .getMetadataFilePath (),
@@ -957,7 +960,7 @@ public String setResourceProperties(
957960 @ NotNull String resourcePath ,
958961 @ NotNull Map <String , Object > properties
959962 ) throws DBException {
960- try (var ignoredLock = lockController .lock (projectId , "resourcePropertyUpdate" )) {
963+ try (var ignoredLock = lockController .lock (LockTarget . of ( projectId ), LockOptions . of ( "resourcePropertyUpdate" ) )) {
961964 validateResourcePath (resourcePath );
962965 RMLocalProject webProject = getWebProject (projectId , false );
963966 doFileWriteOperation (projectId , webProject .getMetadataFilePath (),
@@ -1204,12 +1207,14 @@ private String getProjectRelativePath(@NotNull String projectId, @NotNull Path p
12041207 return getProjectPath (projectId ).toAbsolutePath ().relativize (path ).toString ().replace ('\\' , IPath .SEPARATOR );
12051208 }
12061209
1210+ @ NotNull
12071211 public static Builder builder (
1208- SMCredentialsProvider credentialsProvider ,
1209- DBPWorkspace workspace ,
1210- Supplier <SMAdminController > smControllerSupplier
1212+ @ NotNull SMCredentialsProvider credentialsProvider ,
1213+ @ NotNull DBPWorkspace workspace ,
1214+ @ NotNull LockManager lockController ,
1215+ @ NotNull Supplier <SMAdminController > smControllerSupplier
12111216 ) {
1212- return new Builder (workspace , credentialsProvider , smControllerSupplier );
1217+ return new Builder (workspace , credentialsProvider , lockController , smControllerSupplier );
12131218 }
12141219
12151220 @ Override
@@ -1225,36 +1230,52 @@ public static class Builder {
12251230 protected Path rootPath ;
12261231 protected Path userProjectsPath ;
12271232 protected Path sharedProjectsPath ;
1233+ protected LockManager lockController ;
12281234
12291235 protected Builder (
1230- DBPWorkspace workspace , SMCredentialsProvider credentialsProvider ,
1231- Supplier <SMAdminController > smControllerSupplier
1236+ @ NotNull DBPWorkspace workspace ,
1237+ @ NotNull SMCredentialsProvider credentialsProvider ,
1238+ @ NotNull LockManager lockController ,
1239+ @ NotNull Supplier <SMAdminController > smControllerSupplier
12321240 ) {
12331241 this .workspace = workspace ;
12341242 this .credentialsProvider = credentialsProvider ;
12351243 this .smController = smControllerSupplier ;
12361244 this .rootPath = RMUtils .getRootPath ();
12371245 this .userProjectsPath = RMUtils .getUserProjectsPath ();
12381246 this .sharedProjectsPath = RMUtils .getSharedProjectsPath ();
1247+ this .lockController = lockController ;
12391248 }
12401249
1241- public Builder setRootPath (Path rootPath ) {
1250+ @ NotNull
1251+ public Builder setRootPath (@ NotNull Path rootPath ) {
12421252 this .rootPath = rootPath ;
12431253 return this ;
12441254 }
12451255
1246- public Builder setUserProjectsPath (Path userProjectsPath ) {
1256+ @ NotNull
1257+ public Builder setUserProjectsPath (@ NotNull Path userProjectsPath ) {
12471258 this .userProjectsPath = userProjectsPath ;
12481259 return this ;
12491260 }
12501261
1251- public Builder setSharedProjectsPath (Path sharedProjectsPath ) {
1262+ @ NotNull
1263+ public Builder setSharedProjectsPath (@ NotNull Path sharedProjectsPath ) {
12521264 this .sharedProjectsPath = sharedProjectsPath ;
12531265 return this ;
12541266 }
12551267
1268+ @ NotNull
12561269 public LocalResourceController build () throws DBException {
1257- return new LocalResourceController (workspace , credentialsProvider , rootPath , userProjectsPath , sharedProjectsPath , smController );
1270+ return new LocalResourceController (
1271+ workspace ,
1272+ credentialsProvider ,
1273+ rootPath ,
1274+ userProjectsPath ,
1275+ sharedProjectsPath ,
1276+ smController ,
1277+ lockController
1278+ );
12581279 }
12591280 }
12601281
0 commit comments