package eu.dnetlib.enabling.ui.server.util;

import java.io.IOException;

import javax.xml.parsers.ParserConfigurationException;
import javax.xml.xpath.XPathExpressionException;

import org.apache.commons.logging.Log;
import org.apache.commons.logging.LogFactory;
import org.springframework.beans.factory.annotation.Required;
import org.springframework.core.io.Resource;
import org.xml.sax.SAXException;

import eu.dnetlib.enabling.is.registry.rmi.ISRegistryException;
import eu.dnetlib.enabling.is.store.AbstractContentInitializer;
import eu.dnetlib.enabling.tools.ResourceLoaderHelper;
import eu.dnetlib.enabling.tools.StreamOpaqueResource;



public class ResourceSubmitter extends AbstractContentInitializer {
	/**
	 * milliseconds in a second.
	 */
	private static final double MILLIS = 1000.0;

	private static final Log log = LogFactory.getLog(ResourceSubmitter.class); // NOPMD by marko on 11/24/08 5:02 PM

	/**
	 * resourceLoader compatible pattern matching all xsd files to load.
	 */
	private String schemas;

	/**
	 * resource loader helper. we cannot implement the ResourceLoaderAware interface.
	 */
	private ResourceLoaderHelper resourceLoader;

	public boolean submitDefaultSchemas() {
		final long start = System.currentTimeMillis();
		try {
			for (Resource res : resourceLoader.getResourcePatternResolver().getResources(schemas)) {
				String name = res.getURL().toString(); // NOPMD
				registerSchema(res.getURL());
				log.info("Registered schema " + name);
			}
		} catch (Exception e) {
			log.error("Failed Schema Registation",  e);
			return false;
		}

		log.info("bulk registration finished in: " + ((System.currentTimeMillis() - start) / MILLIS) + "s");

		return true;
	}
	
	public boolean registerFile(final Resource resource) {
		try {
			getBulkImporter().importResource(new StreamOpaqueResource(resource.getInputStream()));
			return true;
		} catch (ISRegistryException e) {
			log.warn("cannot import profile", e);
		} catch (XPathExpressionException e) {
			log.warn("cannot import profile", e);
		} catch (SAXException e) {
			log.warn("cannot import profile", e);
		} catch (IOException e) {
			log.warn("cannot import profile", e);
		} catch (ParserConfigurationException e) {
			log.warn("cannot import profile", e);
		}

		log.warn("cannot import profile " + resource.getFilename());
		return false;
	}

	

	@Required
	public void setSchemas(final String schemas) {
		this.schemas = schemas;
	}

	public String getSchemas() {
		return schemas;
	}

	@Required
	public ResourceLoaderHelper getResourceLoader() {
		return resourceLoader;
	}

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