package eu.dnetlib.data.mdstore;

import java.io.IOException;
import java.io.InputStreamReader;
import java.io.StringWriter;

import org.apache.commons.io.IOUtils;
import org.springframework.core.io.Resource;

import eu.dnetlib.enabling.tools.ResourceLoaderHelper;

/**
 * On disk read-only mdstore mock.
 *
 * @author marko
 *
 */
public class MockMDStore implements MDStore {

	/**
	 * base filesystem/classpath path.
	 */
	private String basePath;

	/**
	 * resource loader able to load paths under basePath.
	 */
	private ResourceLoaderHelper resourceLoader;

	/**
	 * Construct a read-only mdstore mock.
	 *
	 * @param basePath base path
	 * @param resourceLoader resource loader
	 */
	public MockMDStore(final String basePath, final ResourceLoaderHelper resourceLoader) {
		this.basePath = basePath;
		this.resourceLoader = resourceLoader;
	}

	/**
	 * {@inheritDoc}
	 * @see eu.dnetlib.data.mdstore.MDStore#getRecord(int)
	 */
	public String getRecord(final int idx) throws MDStoreServiceException {
		final StringWriter record = new StringWriter();
		final Resource resource = resourceLoader.getResourceLoader().getResource(
				basePath + idx + ".xml");
		try {
			IOUtils.copy(new InputStreamReader(resource.getInputStream()), record);
		} catch (IOException e) {
			throw new MDStoreServiceException(e);
		}
		return record.toString();
	}

	/**
	 * {@inheritDoc}
	 * @see eu.dnetlib.data.mdstore.MDStore#getSize()
	 */
	public int getSize() throws MDStoreServiceException {
		try {
			return resourceLoader.getResourcePatternResolver().getResources(basePath + "*.xml").length;
		} catch (IOException e) {
			throw new MDStoreServiceException(e);
		}
	}


	public String getBasePath() {
		return basePath;
	}

	public void setBasePath(final String basePath) {
		this.basePath = basePath;
	}

	public ResourceLoaderHelper getResourceLoader() {
		return resourceLoader;
	}

	public void setResourceLoader(final ResourceLoaderHelper resourceLoader) {
		this.resourceLoader = resourceLoader;
	}

}
