2424import org .jkiss .code .Nullable ;
2525import org .jkiss .dbeaver .DBException ;
2626import org .jkiss .dbeaver .Log ;
27+ import org .jkiss .dbeaver .model .DBPAdaptable ;
2728import org .jkiss .dbeaver .model .DBPDataSourceContainer ;
29+ import org .jkiss .dbeaver .model .DBPObjectSettingsProvider ;
2830import org .jkiss .dbeaver .model .app .DBPDataSourceRegistry ;
2931import org .jkiss .dbeaver .model .app .DBPDataSourceRegistryCache ;
3032import org .jkiss .dbeaver .model .navigator .DBNModel ;
3133import org .jkiss .dbeaver .model .rm .RMProject ;
3234import org .jkiss .dbeaver .model .rm .RMUtils ;
35+ import org .jkiss .dbeaver .model .security .SMControllerUtils ;
3336import org .jkiss .dbeaver .model .security .SMObjectType ;
3437import org .jkiss .dbeaver .model .websocket .event .datasource .WSDataSourceEvent ;
3538import org .jkiss .dbeaver .model .websocket .event .datasource .WSDataSourceProperty ;
3639import org .jkiss .dbeaver .registry .DataSourceDescriptor ;
3740import org .jkiss .dbeaver .registry .DataSourceRegistry ;
41+ import org .jkiss .dbeaver .registry .project .BaseProjectSettings ;
3842import org .jkiss .dbeaver .runtime .jobs .DisconnectJob ;
3943import org .jkiss .utils .CommonUtils ;
4044
4145import java .nio .file .Path ;
42- import java .util .ArrayList ;
43- import java .util .HashMap ;
44- import java .util .List ;
45- import java .util .Map ;
46- import java .util .concurrent .ConcurrentHashMap ;
46+ import java .util .*;
4747
48- public class WebSessionProjectImpl extends WebProjectImpl {
48+ public class WebSessionProjectImpl extends WebProjectImpl implements DBPAdaptable {
4949 private static final Log log = Log .getLog (WebSessionProjectImpl .class );
50+
5051 protected final WebSession webSession ;
5152 private final Map <String , WebConnectionInfo > connections = new HashMap <>();
52- private final Map < String , Object > projectSettings = new ConcurrentHashMap <>() ;
53+ private final BaseProjectSettings projectSettings ;
5354 private boolean registryIsLoaded = false ;
5455
5556 public WebSessionProjectImpl (
5657 @ NotNull WebSession webSession ,
5758 @ NotNull RMProject project
5859 ) {
59- super (
60- webSession .getWorkspace (),
61- webSession .getRmController (),
62- webSession .getSessionContext (),
63- project ,
64- webSession .getUserPreferenceStore (),
65- RMUtils .getProjectPath (project )
66- );
67- this .webSession = webSession ;
60+ this (webSession , project , null );
6861 }
6962
7063 public WebSessionProjectImpl (
7164 @ NotNull WebSession webSession ,
7265 @ NotNull RMProject project ,
73- @ NotNull Path path
66+ @ Nullable Path path
7467 ) {
7568 super (
7669 webSession .getWorkspace (),
7770 webSession .getRmController (),
7871 webSession .getSessionContext (),
7972 project ,
8073 webSession .getUserPreferenceStore (),
81- path
74+ path == null ? RMUtils . getProjectPath ( project ) : path
8275 );
8376 this .webSession = webSession ;
77+ this .projectSettings = new BaseProjectSettings (this ) {
78+ @ NotNull
79+ @ Override
80+ protected Map <SMObjectType , Map <String , Map <String , String >>> loadAllProjectSettings () throws DBException {
81+ if (webSession .getUser () == null ) {
82+ return new LinkedHashMap <>();
83+ }
84+ return SMControllerUtils .getObjectSettingsMap (WebSessionProjectImpl .this , webSession .getSecurityController ());
85+ }
86+
87+ @ Override
88+ protected void saveProjectSettings (
89+ @ NotNull SMObjectType objectType ,
90+ @ NotNull String objectId ,
91+ @ NotNull Map <String , String > settings
92+ ) throws DBException {
93+ if (webSession .getUserContext ().isNonAnonymousUserAuthorizedInSM ()) {
94+ webSession .getSecurityController ().setObjectSettings (getId (), objectType , objectId , settings );
95+ }
96+ }
97+
98+ };
99+ }
100+
101+ @ NotNull
102+ public BaseProjectSettings getProjectSettings () {
103+ return projectSettings ;
84104 }
85105
86106 @ Nullable
@@ -89,6 +109,14 @@ public DBNModel getNavigatorModel() {
89109 return webSession .getNavigatorModel ();
90110 }
91111
112+ @ Override
113+ public <T > T getAdapter (@ NotNull Class <T > adapter ) {
114+ if (adapter == DBPObjectSettingsProvider .class ) {
115+ return adapter .cast (projectSettings );
116+ }
117+ return null ;
118+ }
119+
92120 @ NotNull
93121 @ Override
94122 protected DBPDataSourceRegistry createDataSourceRegistry () {
@@ -244,21 +272,6 @@ public synchronized boolean updateProjectDataSources(@NotNull WSDataSourceEvent
244272 return sendDataSourceUpdatedEvent ;
245273 }
246274
247- // TODO: load project settings on project load
248- public void refreshProjectSettings () throws DBException {
249- if (webSession .getUser () == null ) {
250- projectSettings .clear ();
251- return ;
252- }
253- Map <String , Object > loadedSettings = webSession .getSecurityController ().getObjectSettings (
254- getId (),
255- SMObjectType .project ,
256- null
257- );
258- projectSettings .clear ();
259- projectSettings .putAll (loadedSettings );
260- }
261-
262275 @ NotNull
263276 public WebConnectionInfo createConnectionInfo (@ NotNull DBPDataSourceContainer dataSourceDescriptor ) {
264277 return new WebConnectionInfo (webSession , dataSourceDescriptor );
@@ -331,19 +344,9 @@ public boolean deleteConnection(@NotNull String connectionId) throws DBWebExcept
331344 @ NotNull
332345 private WebConnectionInfo closeAndDeleteConnection (@ NotNull WebConnectionInfo connectionInfo ) throws DBWebException {
333346 DBPDataSourceContainer dataSourceContainer = connectionInfo .getDataSourceContainer ();
334- boolean disconnected = WebDataSourceUtils .disconnectDataSource (webSession , dataSourceContainer );
347+ WebDataSourceUtils .disconnectDataSource (webSession , dataSourceContainer );
335348 DBPDataSourceRegistry registry = getDataSourceRegistry ();
336349 registry .removeDataSource (dataSourceContainer );
337- try {
338- registry .checkForErrors ();
339- } catch (DBException e ) {
340- try {
341- registry .addDataSource (dataSourceContainer );
342- } catch (DBException ex ) {
343- log .error ("Error re-adding after delete attempt" , e );
344- }
345- throw new DBWebException ("Failed to delete connection" , e );
346- }
347350 removeConnection (dataSourceContainer );
348351 return connectionInfo ;
349352 }
0 commit comments