package liquibase.serializer; import liquibase.exception.UnexpectedLiquibaseException; import liquibase.servicelocator.PrioritizedService; import liquibase.servicelocator.ServiceLocator; import java.util.*; public class SnapshotSerializerFactory { private static SnapshotSerializerFactory instance; private Map<String, List<SnapshotSerializer>> serializers = new HashMap<String, List<SnapshotSerializer>>(); public static synchronized void reset() { instance = new SnapshotSerializerFactory(); } public static synchronized SnapshotSerializerFactory getInstance() { if (instance == null) { instance = new SnapshotSerializerFactory(); } return instance; } private SnapshotSerializerFactory() { Class<? extends SnapshotSerializer>[] classes; try { classes = ServiceLocator.getInstance().findClasses(SnapshotSerializer.class); for (Class<? extends SnapshotSerializer> clazz : classes) { register((SnapshotSerializer) clazz.getConstructor().newInstance()); } } catch (Exception e) { throw new UnexpectedLiquibaseException(e); } } public Map<String, List<SnapshotSerializer>> getSerializers() { return serializers; } public List<SnapshotSerializer> getSerializers(String fileNameOrExtension) { fileNameOrExtension = fileNameOrExtension.replaceAll(".*\\.", ""); //just need the extension List<SnapshotSerializer> snapshotSerializers = serializers.get(fileNameOrExtension); if (snapshotSerializers == null) { return Collections.emptyList(); } return snapshotSerializers; } public SnapshotSerializer getSerializer(String fileNameOrExtension) { List<SnapshotSerializer> snapshotSerializers = getSerializers(fileNameOrExtension); if (snapshotSerializers.isEmpty()) { throw new RuntimeException("No serializers associated with the filename or extension '" + fileNameOrExtension + "'"); } return snapshotSerializers.get(0); } public void register(SnapshotSerializer snapshotSerializer) { for (String extension : snapshotSerializer.getValidFileExtensions()) { List<SnapshotSerializer> snapshotSerializers = serializers.get(extension); if (snapshotSerializers == null) { snapshotSerializers = new ArrayList<SnapshotSerializer>(); serializers.put(extension, snapshotSerializers); } snapshotSerializers.add(snapshotSerializer); Collections.sort(snapshotSerializers, PrioritizedService.COMPARATOR); } } public void unregister(SnapshotSerializer snapshotSerializer) { for (Iterator<Map.Entry<String, List<SnapshotSerializer>>> entryIterator = serializers.entrySet().iterator(); entryIterator.hasNext();) { Map.Entry<String, List<SnapshotSerializer>> entry = entryIterator.next(); List<SnapshotSerializer> snapshotSerializers = entry.getValue(); for (Iterator<SnapshotSerializer> iterator = snapshotSerializers.iterator(); iterator.hasNext();) { SnapshotSerializer value = iterator.next(); if (value.equals(snapshotSerializer)) { iterator.remove(); } } if (snapshotSerializers.isEmpty()) { entryIterator.remove(); } } } }