CB-551 Connection settings save fix

This commit is contained in:
Serge Rider
2020-11-21 12:33:14 +03:00
parent 25945f95ed
commit f39f930492
6 changed files with 36 additions and 27 deletions
@@ -113,16 +113,12 @@ public class DBWebException extends DBException implements GraphQLError {
}
if (divPos != -1) {
stString = stString.substring(0, divPos);
// divPos = stString.lastIndexOf(")");
// if (divPos != -1) {
// stString = stString.substring(0, divPos + 1);
// }
}
divPos = stString.indexOf(':');
if (divPos != -1) {
String exceptionClass = stString.substring(0, divPos);
extensions.put("exceptionClass", exceptionClass);
stString = stString.substring(divPos + 1).trim();
//stString = stString.substring(divPos + 1).trim();
}
extensions.put("stackTrace", stString);
int errorCode = getErrorCode();
@@ -89,7 +89,7 @@ public class WebServiceUtils {
}
@NotNull
public static DBPDataSourceRegistry getDataSourceRegistry() throws DBWebException {
public static DBPDataSourceRegistry getGlobalDataSourceRegistry() throws DBWebException {
DBPDataSourceRegistry registry = DBWorkbench.getPlatform().getWorkspace().getDefaultDataSourceRegistry();
if (registry == null) {
throw new DBWebException("No activate data source registry");
@@ -163,9 +163,15 @@ public class WebServiceUtils {
}
dsConfig.setProperties(newProps);
}
dsConfig.setUserName(config.getUserName());
dsConfig.setUserPassword(config.getUserPassword());
dsConfig.setAuthModelId(config.getAuthModelId());
if (config.getUserName() != null) {
dsConfig.setUserName(config.getUserName());
}
if (config.getUserPassword() != null) {
dsConfig.setUserPassword(config.getUserPassword());
}
if (config.getAuthModelId() != null) {
dsConfig.setAuthModelId(config.getAuthModelId());
}
}
public static void saveAuthProperties(DBPDataSourceContainer dataSourceContainer, DBPConnectionConfiguration configuration, Map<String, Object> authProperties, boolean saveCredentials) {
@@ -244,7 +250,7 @@ public class WebServiceUtils {
dataSource = webSession.getSingletonProject().getDataSourceRegistry().getDataSource(connectionId);
if (dataSource == null) {
// If called for new connection in admin mode then this connection may absent in session registry yet
dataSource = getDataSourceRegistry().getDataSource(connectionId);
dataSource = getGlobalDataSourceRegistry().getDataSource(connectionId);
}
}
return dataSource;
@@ -74,12 +74,12 @@ public class WebConnectionConfig {
name = JSONUtils.getString(params, "name");
description = JSONUtils.getString(params, "description");
properties = JSONUtils.getObject(params, "properties");
properties = JSONUtils.getObjectOrNull(params, "properties");
userName = JSONUtils.getString(params, "userName");
userPassword = JSONUtils.getString(params, "userPassword");
authModelId = JSONUtils.getString(params, "authModelId");
credentials = JSONUtils.getObject(params, "credentials");
credentials = JSONUtils.getObjectOrNull(params, "credentials");
saveCredentials = JSONUtils.getBoolean(params, "saveCredentials");
}
@@ -531,7 +531,7 @@ public class CBApplication extends BaseApplicationImpl {
try {
String anonymousRoleId = appConfig.getAnonymousUserRole();
DBWSecurityController securityController = getSecurityController();
for (DBPDataSourceContainer ds : WebServiceUtils.getDataSourceRegistry().getDataSources()) {
for (DBPDataSourceContainer ds : WebServiceUtils.getGlobalDataSourceRegistry().getDataSources()) {
DBWConnectionGrant[] grants = securityController.getConnectionSubjectAccess(ds.getId());
if (ArrayUtils.isEmpty(grants)) {
securityController.setConnectionSubjectAccess(
@@ -84,7 +84,7 @@ public class WebServiceCore implements DBWServiceCore {
public List<WebDataSourceConfig> getTemplateDataSources() throws DBWebException {
List<WebDataSourceConfig> result = new ArrayList<>();
DBPDataSourceRegistry dsRegistry = WebServiceUtils.getDataSourceRegistry();
DBPDataSourceRegistry dsRegistry = WebServiceUtils.getGlobalDataSourceRegistry();
for (DBPDataSourceContainer ds : dsRegistry.getDataSources()) {
if (ds.isTemplate()) {
@@ -102,7 +102,7 @@ public class WebServiceCore implements DBWServiceCore {
@Override
public List<WebConnectionInfo> getTemplateConnections(WebSession webSession) throws DBWebException {
List<WebConnectionInfo> result = new ArrayList<>();
for (DBPDataSourceContainer ds : WebServiceUtils.getDataSourceRegistry().getDataSources()) {
for (DBPDataSourceContainer ds : WebServiceUtils.getGlobalDataSourceRegistry().getDataSources()) {
if (ds.isTemplate() &&
CBPlatform.getInstance().getApplicableDrivers().contains(ds.getDriver()))
{
@@ -180,7 +180,7 @@ public class WebServiceCore implements DBWServiceCore {
if (CommonUtils.isEmpty(templateId)) {
throw new DBWebException("Only preconfigured data sources are supported yet");
}
DBPDataSourceRegistry templateRegistry = WebServiceUtils.getDataSourceRegistry();
DBPDataSourceRegistry templateRegistry = WebServiceUtils.getGlobalDataSourceRegistry();
DBPDataSourceContainer dataSourceTemplate = templateRegistry.getDataSource(templateId);
if (dataSourceTemplate == null) {
throw new DBWebException("Datasource '" + templateId + "' not found");
@@ -270,7 +270,7 @@ public class WebServiceCore implements DBWServiceCore {
@Override
public WebConnectionInfo createConnectionFromTemplate(WebSession webSession, String templateId) throws DBWebException {
DBPDataSourceRegistry templateRegistry = WebServiceUtils.getDataSourceRegistry();
DBPDataSourceRegistry templateRegistry = WebServiceUtils.getGlobalDataSourceRegistry();
DBPDataSourceContainer dataSourceTemplate = templateRegistry.getDataSource(templateId);
if (dataSourceTemplate == null) {
throw new DBWebException("Template data source '" + templateId + "' not found");
@@ -324,7 +324,7 @@ public class WebServiceCore implements DBWServiceCore {
if (dataSource != null) {
testDataSource = dataSource.createCopy(dataSource.getRegistry());
WebServiceUtils.setConnectionConfiguration(testDataSource.getDriver(), testDataSource.getConnectionConfiguration(), connectionConfig);
WebServiceUtils.saveAuthProperties(testDataSource, testDataSource.getConnectionConfiguration(), connectionConfig.getCredentials(), connectionConfig.isSaveCredentials());
WebServiceUtils.saveAuthProperties(testDataSource, testDataSource.getConnectionConfiguration(), connectionConfig.getCredentials(), true);
} else {
testDataSource = WebServiceUtils.createConnectionFromConfig(connectionConfig, sessionRegistry);
}
@@ -249,7 +249,7 @@ public class WebServiceAdmin implements DBWServiceAdmin {
public List<WebConnectionInfo> getAllConnections(@NotNull WebSession webSession) throws DBWebException {
// Get all connections from global configuration
List<WebConnectionInfo> result = new ArrayList<>();
for (DBPDataSourceContainer ds : WebServiceUtils.getDataSourceRegistry().getDataSources()) {
for (DBPDataSourceContainer ds : WebServiceUtils.getGlobalDataSourceRegistry().getDataSources()) {
if (CBPlatform.getInstance().getApplicableDrivers().contains(ds.getDriver())) {
result.add(new WebConnectionInfo(webSession, ds));
}
@@ -267,7 +267,7 @@ public class WebServiceAdmin implements DBWServiceAdmin {
@Override
public WebConnectionInfo createConnectionConfiguration(@NotNull WebSession webSession, @NotNull WebConnectionConfig config) throws DBWebException {
DBPDataSourceRegistry registry = WebServiceUtils.getDataSourceRegistry();
DBPDataSourceRegistry registry = WebServiceUtils.getGlobalDataSourceRegistry();
DBPDataSourceContainer dataSource = WebServiceUtils.createConnectionFromConfig(config, registry);
registry.addDataSource(dataSource);
registry.flushConfig();
@@ -279,7 +279,7 @@ public class WebServiceAdmin implements DBWServiceAdmin {
public WebConnectionInfo copyConnectionConfiguration(@NotNull WebSession webSession, @NotNull String nodePath) throws DBWebException {
try {
DBNModel globalNavigatorModel = webSession.getNavigatorModel();
DBPDataSourceRegistry globalDataSourceRegistry = WebServiceUtils.getDataSourceRegistry();
DBPDataSourceRegistry globalDataSourceRegistry = WebServiceUtils.getGlobalDataSourceRegistry();
DBNNode srcNode = globalNavigatorModel.getNodeByPath(webSession.getProgressMonitor(), nodePath);
if (srcNode == null) {
@@ -303,23 +303,30 @@ public class WebServiceAdmin implements DBWServiceAdmin {
@Override
public WebConnectionInfo updateConnectionConfiguration(@NotNull WebSession webSession, @NotNull String id, @NotNull WebConnectionConfig config) throws DBWebException {
DBPDataSourceContainer dataSource = WebServiceUtils.getDataSourceRegistry().getDataSource(id);
DBPDataSourceContainer dataSource = WebServiceUtils.getGlobalDataSourceRegistry().getDataSource(id);
if (dataSource == null) {
throw new DBWebException("Connection '" + id + "' not found");
}
WebServiceUtils.updateConnectionFromConfig(dataSource, config);
dataSource.persistConfiguration();
// Update local datasource as well. We use it for connection tests
// It may be null if this connection was just created
DBPDataSourceContainer localDS = webSession.getSingletonProject().getDataSourceRegistry().getDataSource(id);
if (localDS != null) {
WebServiceUtils.updateConnectionFromConfig(localDS, config);
// We don't need to save it in local registry (because in fact it is stored in the global registry)
}
return new WebConnectionInfo(webSession, dataSource);
}
@Override
public boolean deleteConnectionConfiguration(@NotNull WebSession webSession, @NotNull String id) throws DBWebException {
DBPDataSourceContainer dataSource = WebServiceUtils.getDataSourceRegistry().getDataSource(id);
DBPDataSourceContainer dataSource = WebServiceUtils.getGlobalDataSourceRegistry().getDataSource(id);
if (dataSource == null) {
throw new DBWebException("Connection '" + id + "' not found");
}
WebServiceUtils.getDataSourceRegistry().removeDataSource(dataSource);
WebServiceUtils.getDataSourceRegistry().flushConfig();
WebServiceUtils.getGlobalDataSourceRegistry().removeDataSource(dataSource);
WebServiceUtils.getGlobalDataSourceRegistry().flushConfig();
try {
CBApplication.getInstance().getSecurityController().setConnectionSubjectAccess(id, null, null);
@@ -389,7 +396,7 @@ public class WebServiceAdmin implements DBWServiceAdmin {
@Override
public boolean setConnectionSubjectAccess(@NotNull WebSession webSession, @NotNull String connectionId, @NotNull List<String> subjects) throws DBWebException {
DBPDataSourceContainer dataSource = WebServiceUtils.getDataSourceRegistry().getDataSource(connectionId);
DBPDataSourceContainer dataSource = WebServiceUtils.getGlobalDataSourceRegistry().getDataSource(connectionId);
if (dataSource == null) {
throw new DBWebException("Connection '" + connectionId + "' not found");
}
@@ -417,7 +424,7 @@ public class WebServiceAdmin implements DBWServiceAdmin {
@Override
public boolean setSubjectConnectionAccess(@NotNull WebSession webSession, @NotNull String subjectId, @NotNull List<String> connections) throws DBWebException {
for (String connectionId : connections) {
if (WebServiceUtils.getDataSourceRegistry().getDataSource(connectionId) == null) {
if (WebServiceUtils.getGlobalDataSourceRegistry().getDataSource(connectionId) == null) {
throw new DBWebException("Connection '" + connectionId + "' not found");
}
}