class ChangeLogParserFactory {

    private static ChangeLogParserFactory instance;

    private final List<ChangeLogParser> parsers = new ArrayList<>();

    public static synchronized void reset() {
        instance = new ChangeLogParserFactory();
    }

    public static synchronized ChangeLogParserFactory getInstance() {
        if (instance == null) {
            instance = new ChangeLogParserFactory();
        }
        return instance;
    }

    /**
     * Set the instance used by this singleton. Used primarily for testing.
     */
    public static synchronized void setInstance(ChangeLogParserFactory instance) {
        ChangeLogParserFactory.instance = instance;
    }

    private ChangeLogParserFactory() {
        try {
            List<ChangeLogParser> parser = Scope.getCurrentScope().getServiceLocator().findInstances(ChangeLogParser.class);
            register(parser);
        } catch (Exception e) {
            throw new UnexpectedLiquibaseException(e);
        }
    }

    public List<ChangeLogParser> getParsers() {
        return new ArrayList<>(parsers);
    }

    public ChangeLogParser getParser(String fileNameOrExtension, ResourceAccessor resourceAccessor) throws LiquibaseException {<FILL_FUNCTION_BODY>}

    public void register(ChangeLogParser changeLogParsers) {
        register(Collections.singletonList(changeLogParsers));
    }

    private void register(List<ChangeLogParser> changeLogParsers) {
        parsers.addAll(changeLogParsers);
        parsers.sort(ChangeLogParser.COMPARATOR);
    }

    public void unregister(ChangeLogParser changeLogParser) {
        parsers.remove(changeLogParser);
    }

    public void unregisterAllParsers() {
        parsers.clear();
    }
}

        for (ChangeLogParser parser : parsers) {
            if (parser.supports(fileNameOrExtension, resourceAccessor)) {
                Scope.getCurrentScope().getLog(ChangeLogParserFactory.class).fine(String.format("Matched file '%s' to parser '%s'",
                        fileNameOrExtension, parser.getClass().getSimpleName()));
                return parser;
            }
        }

        throw new UnknownChangelogFormatException("Cannot find parser that supports " + fileNameOrExtension);
    
<no_super_class>