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.ActionConfiguration;
import com.appsmith.external.models.DatasourceConfiguration; import com.appsmith.external.models.DatasourceConfiguration;
import org.pf4j.ExtensionPoint; import org.pf4j.ExtensionPoint;
import org.springframework.util.CollectionUtils;
import reactor.core.publisher.Mono; import reactor.core.publisher.Mono;
import java.util.Set;
public interface PluginExecutor extends ExtensionPoint { public interface PluginExecutor extends ExtensionPoint {
/** /**
@ -34,5 +37,9 @@ public interface PluginExecutor extends ExtensionPoint {
*/ */
void datasourceDestroy(Object connection); 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 reactor.core.publisher.Mono;
import java.math.BigInteger; import java.math.BigInteger;
import java.util.HashSet;
import java.util.Set;
@Slf4j @Slf4j
public class MongoPlugin extends BasePlugin { public class MongoPlugin extends BasePlugin {
@ -127,8 +129,9 @@ public class MongoPlugin extends BasePlugin {
} }
@Override @Override
public Boolean isDatasourceValid(DatasourceConfiguration datasourceConfiguration) { public Set<String> validateDatasource(DatasourceConfiguration datasourceConfiguration) {
return true; // 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.Extension;
import org.pf4j.PluginWrapper; import org.pf4j.PluginWrapper;
import org.springframework.util.CollectionUtils; import org.springframework.util.CollectionUtils;
import org.springframework.util.StringUtils;
import reactor.core.publisher.Mono; import reactor.core.publisher.Mono;
import java.sql.Connection; import java.sql.Connection;
import java.sql.*; import java.sql.*;
import java.util.*; import java.util.*;
import java.util.stream.Stream;
import static com.appsmith.external.models.Connection.Mode.READ_ONLY; import static com.appsmith.external.models.Connection.Mode.READ_ONLY;
@ -150,21 +152,38 @@ public class PostgresPlugin extends BasePlugin {
} }
} }
@SuppressWarnings("RedundantIfStatement")
@Override @Override
public Boolean isDatasourceValid(@NonNull DatasourceConfiguration datasourceConfiguration) { public Set<String> validateDatasource(@NonNull DatasourceConfiguration datasourceConfiguration) {
Set<String> invalids = new HashSet<>();
if (CollectionUtils.isEmpty(datasourceConfiguration.getEndpoints())) { if (CollectionUtils.isEmpty(datasourceConfiguration.getEndpoints())) {
return false; invalids.add("Missing endpoint.");
} }
if (datasourceConfiguration.getAuthentication() == null if (datasourceConfiguration.getConnection() != null
|| datasourceConfiguration.getAuthentication().getUsername() == null && datasourceConfiguration.getConnection().getMode() == null) {
|| datasourceConfiguration.getAuthentication().getPassword() == null) { invalids.add("Missing Connection Mode.");
return false;
} }
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.URISyntaxException;
import java.net.URLEncoder; import java.net.URLEncoder;
import java.nio.charset.StandardCharsets; import java.nio.charset.StandardCharsets;
import java.util.HashMap; import java.util.*;
import java.util.List;
import java.util.Map;
import java.util.regex.Matcher; import java.util.regex.Matcher;
import java.util.regex.Pattern; import java.util.regex.Pattern;
@ -250,10 +248,10 @@ public class RapidApiPlugin extends BasePlugin {
} }
@Override @Override
public Boolean isDatasourceValid(DatasourceConfiguration datasourceConfiguration) { public Set<String> validateDatasource(DatasourceConfiguration datasourceConfiguration) {
// Since the datasource is created by rapid api & not by the user and it can't be edited // 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. // Assume that everything is good. Return as valid.
return true; return new HashSet<>();
} }
private void addHeadersToRequest(WebClient.Builder webClientBuilder, List<Property> headers) { 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.URL;
import java.net.URLEncoder; import java.net.URLEncoder;
import java.nio.charset.StandardCharsets; import java.nio.charset.StandardCharsets;
import java.util.HashSet;
import java.util.List; import java.util.List;
import java.util.Map; import java.util.Map;
import java.util.Set;
public class RestApiPlugin extends BasePlugin { public class RestApiPlugin extends BasePlugin {
private static int MAX_REDIRECTS = 5; private static int MAX_REDIRECTS = 5;
@ -216,19 +218,21 @@ public class RestApiPlugin extends BasePlugin {
} }
@Override @Override
public Boolean isDatasourceValid(DatasourceConfiguration datasourceConfiguration) { public Set<String> validateDatasource(DatasourceConfiguration datasourceConfiguration) {
Set<String> invalids = new HashSet<>();
if (datasourceConfiguration.getUrl() == null) { if (datasourceConfiguration.getUrl() == null) {
System.out.println("URL is null. Data validation failed"); invalids.add("Missing URL.");
return false;
} }
// Check for URL validity
try { try {
// Check for URL validity
new URL(datasourceConfiguration.getUrl()).toURI(); new URL(datasourceConfiguration.getUrl()).toURI();
return true;
} catch (Exception e) { } catch (Exception e) {
System.out.println("URL is invalid. Data validation failed"); invalids.add("Invalid URL: '" + e.getMessage() + "'");
return false;
} }
return invalids;
} }
private boolean addHeadersToRequestAndAscertainContentType(WebClient.Builder webClientBuilder, private boolean addHeadersToRequestAndAscertainContentType(WebClient.Builder webClientBuilder,

View File

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

View File

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