package liquibase.snapshot; import liquibase.database.Database; import liquibase.exception.UnexpectedLiquibaseException; import liquibase.parser.core.ParsedNode; import liquibase.parser.core.ParsedNodeException; import liquibase.resource.ResourceAccessor; import liquibase.serializer.LiquibaseSerializable; import liquibase.structure.DatabaseObject; import liquibase.structure.core.DatabaseObjectFactory; import java.util.*; public class SnapshotControl implements LiquibaseSerializable { private Set<Class<? extends DatabaseObject>> types; private SnapshotListener snapshotListener; public SnapshotControl(Database database) { setTypes(DatabaseObjectFactory.getInstance().getStandardTypes(), database); } public SnapshotControl(Database database, Class<? extends DatabaseObject>... types) { this(database, true, types); } public SnapshotControl(Database database, boolean expandTypesIfNeeded, Class<? extends DatabaseObject>... types) { if (types == null || types.length == 0) { setTypes(DatabaseObjectFactory.getInstance().getStandardTypes(), database); } else { if (expandTypesIfNeeded) { setTypes(new HashSet<Class<? extends DatabaseObject>>(Arrays.asList(types)), database); } else { this.types = new HashSet<Class<? extends DatabaseObject>>(Arrays.asList(types)); } } } public SnapshotControl(Database database, String types) { setTypes(DatabaseObjectFactory.getInstance().parseTypes(types), database); } public SnapshotListener getSnapshotListener() { return snapshotListener; } public void setSnapshotListener(SnapshotListener snapshotListener) { this.snapshotListener = snapshotListener; } @Override public String getSerializedObjectName() { return "snapshotControl"; } @Override public Set<String> getSerializableFields() { return new HashSet<String>(Arrays.asList("includedType")); } @Override public Object getSerializableFieldValue(String field) { if (field.equals("includedType")) { SortedSet<String> types = new TreeSet<String>(); for (Class type : this.getTypesToInclude()) { types.add(type.getName()); } return types; } else { throw new UnexpectedLiquibaseException("Unknown field "+field); } } @Override public SerializationType getSerializableFieldType(String field) { if (field.equals("includedType")) { return SerializationType.NESTED_OBJECT; } else { throw new UnexpectedLiquibaseException("Unknown field "+field); } } @Override public String getSerializedObjectNamespace() { return STANDARD_SNAPSHOT_NAMESPACE; } @Override public String getSerializableFieldNamespace(String field) { return getSerializedObjectNamespace(); } private void setTypes(Set<Class<? extends DatabaseObject>> types, Database database) { this.types = new HashSet<Class<? extends DatabaseObject>>(); for (Class<? extends DatabaseObject> type : types) { addType(type, database); } } public boolean addType(Class<? extends DatabaseObject> type, Database database) { boolean added = this.types.add(type); if (added) { for (Class<? extends DatabaseObject> container : SnapshotGeneratorFactory.getInstance().getContainerTypes(type, database)) { addType(container, database); } } return added; } public Set<Class<? extends DatabaseObject>> getTypesToInclude() { return types; } public boolean shouldInclude(Class<? extends DatabaseObject> type) { return types.contains(type); } @Override public void load(ParsedNode parsedNode, ResourceAccessor resourceAccessor) throws ParsedNodeException { throw new RuntimeException("TODO"); } @Override public ParsedNode serialize() { throw new RuntimeException("TODO"); } }