package eu.dnetlib.xml.database;

import org.springframework.context.ApplicationContext;
import org.springframework.context.support.AbstractApplicationContext;
import org.springframework.context.support.ClassPathXmlApplicationContext;

public abstract class AbstractDatabaseClient {

	private AbstractApplicationContext context;

	public abstract String mode();

	public abstract void dump();

	public abstract void load(String loadDir);

	public abstract void recover(String backupFile);
	
	public void prepare(ApplicationContext parent, Args args) {
		this.context = new ClassPathXmlApplicationContext(new String[] {"eu/dnetlib/xml/database/applicationContext-" + mode() + ".xml"}, parent);
	}
	
	public void close() {
		context.close();
	}
	
	public void dispatch(String method, Args args) {
		if (method == null)
			throw new IllegalArgumentException("method is required");

		if (method.equals("dump"))
			dump();
		else if (method.equals("load"))
			load(args.getLoadDir());
		else if (method.equals("recover"))
			recover(args.getBackupFile());
		else
			throw new IllegalArgumentException("unknown method " + method);
	}

	public void notImplemented(String what) {
		throw new IllegalArgumentException(what + " not implemented yet for " + mode() + " mode");
	}

	public AbstractApplicationContext getContext() {
		return context;
	}

	public void setContext(AbstractApplicationContext context) {
		this.context = context;
	}
}
