diff --git a/src/main/java/liquibase/nosql/snapshot/NoSqlSnapshotGenerator.java b/src/main/java/liquibase/nosql/snapshot/NoSqlSnapshotGenerator.java index 2aacd0c6..c6147457 100644 --- a/src/main/java/liquibase/nosql/snapshot/NoSqlSnapshotGenerator.java +++ b/src/main/java/liquibase/nosql/snapshot/NoSqlSnapshotGenerator.java @@ -9,33 +9,74 @@ import liquibase.snapshot.SnapshotGeneratorChain; import liquibase.structure.DatabaseObject; -import java.util.ResourceBundle; +public abstract class NoSqlSnapshotGenerator implements SnapshotGenerator { -import static liquibase.plugin.Plugin.PRIORITY_SPECIALIZED; - -public class NoSqlSnapshotGenerator implements SnapshotGenerator { - private static final ResourceBundle mongoBundle = ResourceBundle.getBundle("liquibase/i18n/liquibase-mongo"); + private final Class defaultFor; + private Class[] addsTo; + protected NoSqlSnapshotGenerator (Class defaultFor, Class[] addsTo) { + this.defaultFor = defaultFor; + this.addsTo = addsTo; + } @Override public int getPriority(Class objectType, Database database) { if (database instanceof MongoLiquibaseDatabase) { - return PRIORITY_SPECIALIZED; + if ((defaultFor != null) && defaultFor.isAssignableFrom(objectType)) { + return PRIORITY_DEFAULT; + } + if (addsTo() != null) { + for (Class type : addsTo()) { + if (type.isAssignableFrom(objectType)) { + return PRIORITY_ADDITIONAL; + } + } + } } return PRIORITY_NONE; } @Override - public T snapshot(T example, DatabaseSnapshot snapshot, SnapshotGeneratorChain chain) throws DatabaseException, InvalidExampleException { - throw new DatabaseException(String.format(mongoBundle.getString("command.unsupported"), "db-doc, diff*, generate-changelog, and snapshot*")); + public DatabaseObject snapshot(DatabaseObject example, DatabaseSnapshot snapshot, SnapshotGeneratorChain chain) throws DatabaseException, InvalidExampleException { + if ((defaultFor != null) && defaultFor.isAssignableFrom(example.getClass())) { + return snapshotObject(example, snapshot); + } + + DatabaseObject chainResponse = chain.snapshot(example, snapshot); + if (chainResponse == null) { + return null; + } + + if (shouldAddTo(snapshot)) { + if (addsTo() != null) { + for (Class addType : addsTo()) { + if (addType.isAssignableFrom(example.getClass())) { + addTo(chainResponse, snapshot); + } + } + } + } + return chainResponse; } + protected boolean shouldAddTo(DatabaseSnapshot snapshot) { + return (defaultFor != null) && snapshot.getSnapshotControl().shouldInclude(defaultFor); + } + + protected abstract DatabaseObject snapshotObject(DatabaseObject example, DatabaseSnapshot snapshot) throws DatabaseException, InvalidExampleException; + + protected abstract void addTo(DatabaseObject foundObject, DatabaseSnapshot snapshot) throws DatabaseException, InvalidExampleException; + @Override public Class[] addsTo() { - return new Class[0]; + return addsTo; } @Override public Class[] replaces() { return new Class[0]; } + + protected Class defaultFor() { + return defaultFor; + } } diff --git a/src/main/resources/META-INF/services/liquibase.snapshot.SnapshotGenerator b/src/main/resources/META-INF/services/liquibase.snapshot.SnapshotGenerator deleted file mode 100644 index c6ce01d5..00000000 --- a/src/main/resources/META-INF/services/liquibase.snapshot.SnapshotGenerator +++ /dev/null @@ -1 +0,0 @@ -liquibase.nosql.snapshot.NoSqlSnapshotGenerator