Richer plugin validations

This commit is contained in:
Shrikant Kandula 2020-04-10 09:59:50 +00:00
parent e957f0c677
commit abd9235360
7 changed files with 66 additions and 29 deletions

View File

@ -3,8 +3,11 @@ package com.appsmith.external.plugins;
import com.appsmith.external.models.ActionConfiguration;
import com.appsmith.external.models.DatasourceConfiguration;
import org.pf4j.ExtensionPoint;
import org.springframework.util.CollectionUtils;
import reactor.core.publisher.Mono;
import java.util.Set;
public interface PluginExecutor extends ExtensionPoint {
/**
@ -34,5 +37,9 @@ public interface PluginExecutor extends ExtensionPoint {
*/
void datasourceDestroy(Object connection);
Boolean isDatasourceValid(DatasourceConfiguration datasourceConfiguration);
default boolean isDatasourceValid(DatasourceConfiguration datasourceConfiguration) {
return CollectionUtils.isEmpty(validateDatasource(datasourceConfiguration));
}
Set<String> validateDatasource(DatasourceConfiguration datasourceConfiguration);
}

View File

@ -19,6 +19,8 @@ import org.pf4j.PluginWrapper;
import reactor.core.publisher.Mono;
import java.math.BigInteger;
import java.util.HashSet;
import java.util.Set;
@Slf4j
public class MongoPlugin extends BasePlugin {
@ -127,8 +129,9 @@ public class MongoPlugin extends BasePlugin {
}
@Override
public Boolean isDatasourceValid(DatasourceConfiguration datasourceConfiguration) {
return true;
public Set<String> validateDatasource(DatasourceConfiguration datasourceConfiguration) {
// TODO: Apply validations for MongoDB datasource.
return new HashSet<>();
}
}

View File

@ -12,11 +12,13 @@ import org.apache.commons.lang.ObjectUtils;
import org.pf4j.Extension;
import org.pf4j.PluginWrapper;
import org.springframework.util.CollectionUtils;
import org.springframework.util.StringUtils;
import reactor.core.publisher.Mono;
import java.sql.Connection;
import java.sql.*;
import java.util.*;
import java.util.stream.Stream;
import static com.appsmith.external.models.Connection.Mode.READ_ONLY;
@ -150,21 +152,38 @@ public class PostgresPlugin extends BasePlugin {
}
}
@SuppressWarnings("RedundantIfStatement")
@Override
public Boolean isDatasourceValid(@NonNull DatasourceConfiguration datasourceConfiguration) {
public Set<String> validateDatasource(@NonNull DatasourceConfiguration datasourceConfiguration) {
Set<String> invalids = new HashSet<>();
if (CollectionUtils.isEmpty(datasourceConfiguration.getEndpoints())) {
return false;
invalids.add("Missing endpoint.");
}
if (datasourceConfiguration.getAuthentication() == null
|| datasourceConfiguration.getAuthentication().getUsername() == null
|| datasourceConfiguration.getAuthentication().getPassword() == null) {
return false;
if (datasourceConfiguration.getConnection() != null
&& datasourceConfiguration.getConnection().getMode() == null) {
invalids.add("Missing Connection Mode.");
}
return true;
if (datasourceConfiguration.getAuthentication() == null) {
invalids.add("Authentication details missing.");
} else {
if (StringUtils.isEmpty(datasourceConfiguration.getAuthentication().getUsername())) {
invalids.add("Missing username for authentication.");
}
if (StringUtils.isEmpty(datasourceConfiguration.getAuthentication().getPassword())) {
invalids.add("Missing password for authentication.");
}
if (StringUtils.isEmpty(datasourceConfiguration.getAuthentication().getDatabaseName())) {
invalids.add("Missing database name.");
}
}
return invalids;
}
}

View File

@ -30,9 +30,7 @@ import java.net.URI;
import java.net.URISyntaxException;
import java.net.URLEncoder;
import java.nio.charset.StandardCharsets;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import java.util.*;
import java.util.regex.Matcher;
import java.util.regex.Pattern;
@ -250,10 +248,10 @@ public class RapidApiPlugin extends BasePlugin {
}
@Override
public Boolean isDatasourceValid(DatasourceConfiguration datasourceConfiguration) {
// Since the datasource is created by rapid api & not by the user and it can't be edited
// Assume that everything is good. Return true.
return true;
public Set<String> validateDatasource(DatasourceConfiguration datasourceConfiguration) {
// Since the datasource is created by rapid api & not by the user and it can't be edited.
// Assume that everything is good. Return as valid.
return new HashSet<>();
}
private void addHeadersToRequest(WebClient.Builder webClientBuilder, List<Property> headers) {

View File

@ -32,8 +32,10 @@ import java.net.URISyntaxException;
import java.net.URL;
import java.net.URLEncoder;
import java.nio.charset.StandardCharsets;
import java.util.HashSet;
import java.util.List;
import java.util.Map;
import java.util.Set;
public class RestApiPlugin extends BasePlugin {
private static int MAX_REDIRECTS = 5;
@ -216,19 +218,21 @@ public class RestApiPlugin extends BasePlugin {
}
@Override
public Boolean isDatasourceValid(DatasourceConfiguration datasourceConfiguration) {
public Set<String> validateDatasource(DatasourceConfiguration datasourceConfiguration) {
Set<String> invalids = new HashSet<>();
if (datasourceConfiguration.getUrl() == null) {
System.out.println("URL is null. Data validation failed");
return false;
invalids.add("Missing URL.");
}
// Check for URL validity
try {
// Check for URL validity
new URL(datasourceConfiguration.getUrl()).toURI();
return true;
} catch (Exception e) {
System.out.println("URL is invalid. Data validation failed");
return false;
invalids.add("Invalid URL: '" + e.getMessage() + "'");
}
return invalids;
}
private boolean addHeadersToRequestAndAscertainContentType(WebClient.Builder webClientBuilder,

View File

@ -139,11 +139,14 @@ public class DatasourceServiceImpl extends BaseService<DatasourceRepository, Dat
DatasourceConfiguration datasourceConfiguration = datasource1.getDatasourceConfiguration();
if (datasourceConfiguration != null && !pluginExecutor.isDatasourceValid(datasourceConfiguration)) {
datasource1.setIsValid(false);
invalids.add(AppsmithError.INVALID_DATASOURCE_CONFIGURATION.getMessage());
invalids.addAll(pluginExecutor.validateDatasource(datasourceConfiguration));
}
datasource1.setInvalids(invalids);
if (!invalids.isEmpty()) {
datasource1.setIsValid(false);
}
return Mono.just(datasource1);
});
}

View File

@ -22,6 +22,9 @@ import org.springframework.test.context.junit4.SpringRunner;
import reactor.core.publisher.Mono;
import reactor.test.StepVerifier;
import java.util.HashSet;
import java.util.Set;
import static org.assertj.core.api.Assertions.assertThat;
@RunWith(SpringRunner.class)
@ -60,9 +63,9 @@ public class DatasourceServiceTest {
}
@Override
public Boolean isDatasourceValid(DatasourceConfiguration datasourceConfiguration) {
public Set<String> validateDatasource(DatasourceConfiguration datasourceConfiguration) {
System.out.println("In the datasourceValidate");
return true;
return new HashSet<>();
}
}