diff --git a/liquibase-core/src/main/java/liquibase/diff/output/StandardObjectChangeFilter.java b/liquibase-core/src/main/java/liquibase/diff/output/StandardObjectChangeFilter.java index b27649f6f88..2c8f76477b1 100644 --- a/liquibase-core/src/main/java/liquibase/diff/output/StandardObjectChangeFilter.java +++ b/liquibase-core/src/main/java/liquibase/diff/output/StandardObjectChangeFilter.java @@ -1,14 +1,17 @@ package liquibase.diff.output; +import liquibase.Scope; import liquibase.database.Database; import liquibase.diff.ObjectDifferences; import liquibase.exception.UnexpectedLiquibaseException; +import liquibase.servicelocator.ServiceLocator; import liquibase.structure.DatabaseObject; import liquibase.structure.core.*; import liquibase.util.StringUtil; import java.util.ArrayList; import java.util.List; +import java.util.Optional; import java.util.regex.Pattern; /** @@ -24,13 +27,18 @@ */ public class StandardObjectChangeFilter implements ObjectChangeFilter { - private FilterType filterType; + private final FilterType filterType; - private List filters = new ArrayList<>(); + private final List filters = new ArrayList<>(); + private final static List databaseObjects = new ArrayList<>(); private boolean catalogOrSchemaFilter; public StandardObjectChangeFilter(FilterType type, String filter) { this.filterType = type; + if (databaseObjects.isEmpty()) { + ServiceLocator serviceLocator = Scope.getCurrentScope().getServiceLocator(); + databaseObjects.addAll(serviceLocator.findInstances(DatabaseObject.class)); + } parseFilter(filter); } @@ -47,15 +55,14 @@ protected void parseFilter(String filter) { if (split.length == 1) { filters.add(new Filter(null, Pattern.compile(split[0]))); } else { - String className = StringUtil.upperCaseFirst(split[0]); - className = "liquibase.structure.core."+className; - try { - Class clazz = (Class) Class.forName(className); - filters.add(new Filter(clazz, Pattern.compile(split[1]))); - catalogOrSchemaFilter |= "Catalog".equals(className) || "Schema".equals(className); - } catch (ClassNotFoundException e) { - throw new UnexpectedLiquibaseException(e); + String className = split[0]; + Optional databaseObject = databaseObjects.stream().filter(instance -> instance.getClass().getSimpleName().equalsIgnoreCase(className)).findAny(); + if (databaseObject.isPresent()) { + filters.add(new Filter((Class) databaseObject.get().getClass(), Pattern.compile(split[1]))); + } else { + throw new UnexpectedLiquibaseException(className + " not found"); } + catalogOrSchemaFilter |= "Catalog".equals(className) || "Schema".equals(className); } } } diff --git a/liquibase-integration-tests/src/test/resources/liquibase/extension/testing/command/generateChangelog.test.groovy b/liquibase-integration-tests/src/test/resources/liquibase/extension/testing/command/generateChangelog.test.groovy index d546bab97d6..4dd16cafe48 100644 --- a/liquibase-integration-tests/src/test/resources/liquibase/extension/testing/command/generateChangelog.test.groovy +++ b/liquibase-integration-tests/src/test/resources/liquibase/extension/testing/command/generateChangelog.test.groovy @@ -89,6 +89,51 @@ Optional Args: ] } + run "Filtering with includeObjects", { + arguments = [ + url : { it.url }, + username: { it.username }, + password: { it.password }, + changelogFile: "target/test-classes/changelog-test.xml", + includeObjects: "table:FIRSTTABLE" + ] + setup { + cleanResources(SetupCleanResources.CleanupMode.CLEAN_ON_SETUP, "changelog-test.xml") + database = [ + new CreateTableChange( + tableName: "FirstTable", + columns: [ + ColumnConfig.fromName("FirstColumn") + .setType("VARCHAR(255)") + ] + ), + new CreateTableChange( + tableName: "SecondTable", + columns: [ + ColumnConfig.fromName("SecondColumn") + .setType("VARCHAR(255)") + ] + ), + new TagDatabaseChange( + tag: "version_2.0" + ), + new CreateTableChange( + tableName: "liquibaseRunInfo", + columns: [ + ColumnConfig.fromName("timesRan") + .setType("INT") + ] + ), + ] + } + expectedFileContent = [ + "target/test-classes/changelog-test.xml" : [CommandTests.assertContains("