package eu.dnetlib.data.information;

import java.net.URI;
import java.net.URISyntaxException;
import java.util.Map;

import org.springframework.beans.factory.annotation.Required;

/**
 * Dispatches the resolution to the appropriate data source or data sink, depending on the 'resource type'.
 *
 * @author marko
 *
 * @param <T> source or sink
 */
public abstract class AbstractDataSinkSourceResolverDispatcher<T> {

	private Map<String, T> resolvers;

	public Map<String, T> getResolvers() {
		return resolvers;
	}

	@Required
	public void setResolvers(Map<String, T> resolvers) {
		this.resolvers = resolvers;
	}

	public T getResolver(String descriptor) {
		try {
			URI uri = new URI(descriptor);
			final T resolver = getResolvers().get(uri.getAuthority());
			if(resolver == null)
				throw new IllegalStateException("don't know how to handle a " + uri.getAuthority() + " data sink/source in " + uri);
			return resolver;
		} catch (URISyntaxException e) {
			throw new IllegalStateException(e);
		}
	}

}
