/**
 *
 */
package de.uni_luebeck.inb.knowarc.usecases.invocation.ssh;

import java.io.InputStream;

import net.sf.taverna.t2.activities.externaltool.RetrieveLoginFromTaverna;
import net.sf.taverna.t2.reference.AbstractExternalReference;
import net.sf.taverna.t2.reference.DereferenceException;
import net.sf.taverna.t2.reference.ExternalReferenceSPI;
import net.sf.taverna.t2.reference.ReferenceContext;
import net.sf.taverna.t2.security.credentialmanager.CredentialManager;
import net.sf.taverna.t2.reference.ReferencedDataNature;

import org.apache.log4j.Logger;

import com.jcraft.jsch.ChannelSftp;
import com.jcraft.jsch.JSchException;
import com.jcraft.jsch.SftpException;

/**
 * @author alanrw
 *
 */
public class SshReference extends AbstractExternalReference implements
	ExternalReferenceSPI {

	private static Logger logger = Logger.getLogger(SshReference.class);


	private String host = "127.0.0.1";
	private int port = 22;
	private String directory = "/tmp/";
	private String subDirectory;
	private String fileName;

	private CredentialManager credentialManager;

	private int dataNatureInteger = ReferencedDataNature.UNKNOWN.ordinal();
	private String charset = "UTF-8";
	
	public SshReference() {
		super();
	}

	public SshReference(SshUrl url) {
		super();
		this.host = url.getSshNode().getHost();
		this.port = url.getSshNode().getPort();
		this.directory = url.getSshNode().getDirectory();
		this.subDirectory = url.getSubDirectory();
		this.fileName = url.getFileName();
		this.setDataNature(url.getDataNature());
		this.setCharset(url.getCharset());
	}

	/* (non-Javadoc)
	 * @see net.sf.taverna.t2.reference.ExternalReferenceSPI#getApproximateSizeInBytes()
	 */
	@Override
	public Long getApproximateSizeInBytes() {
		return 10000L;
	}

	/* (non-Javadoc)
	 * @see net.sf.taverna.t2.reference.ExternalReferenceSPI#openStream(net.sf.taverna.t2.reference.ReferenceContext)
	 */
	@Override
	public InputStream openStream(ReferenceContext context)
			throws DereferenceException {
		try {
			SshNode node = SshNodeFactory.getInstance().getSshNode(this.getHost(), this.getPort(), this.getDirectory());
			String fullPath = getDirectory() +  getSubDirectory() + "/" + getFileName();
			ChannelSftp channel = SshPool.getSftpGetChannel(node, new RetrieveLoginFromTaverna(new SshUrl(node).toString(), credentialManager));
			logger.info("Opening stream on " + fullPath);
			return (channel.get(fullPath));
		} catch (JSchException e) {
			//TODO
			logger.error(e);
		} catch (SftpException e) {
			// TODO Auto-generated catch block
			logger.error(e);
		}
		return null;
	}

	/**
	 * @return the host
	 */
	public String getHost() {
		return host;
	}

	/**
	 * @param host the host to set
	 */
	public void setHost(String host) {
		this.host = host;
	}

	/**
	 * @return the port
	 */
	public int getPort() {
		return port;
	}

	/**
	 * @param port the port to set
	 */
	public void setPort(int port) {
		this.port = port;
	}

	/**
	 * @return the directory
	 */
	public String getDirectory() {
		return directory;
	}

	/**
	 * @param directory the directory to set
	 */
	public void setDirectory(String directory) {
		this.directory = directory;
	}

	/**
	 * @return the subDirectory
	 */
	public String getSubDirectory() {
		return subDirectory;
	}

	/**
	 * @param subDirectory the subDirectory to set
	 */
	public void setSubDirectory(String subDirectory) {
		this.subDirectory = subDirectory;
	}

	/**
	 * @return the fileName
	 */
	public String getFileName() {
		return fileName;
	}

	/**
	 * @param fileName the fileName to set
	 */
	public void setFileName(String fileName) {
		this.fileName = fileName;
	}

	public String getFullPath() {
		return getDirectory() + "/" + getSubDirectory() + "/" + getFileName();
	}
	
	public ReferencedDataNature getDataNature() {
		return ReferencedDataNature.values()[dataNatureInteger];
	}

	public void setDataNature(ReferencedDataNature dataNature) {
		this.dataNatureInteger = dataNature.ordinal();
	}

	public String getCharset() {
		return charset;
	}

	public void setCredentialManager(CredentialManager credentialManager) {
		this.credentialManager = credentialManager;
	}

	public void setCharset(String charset) {
		this.charset = charset;
	}

	/**
	 * @return the dataNatureInteger
	 */
	public int getDataNatureInteger() {
		return dataNatureInteger;
	}

	/**
	 * @param dataNatureInteger the dataNatureInteger to set
	 */
	public void setDataNatureInteger(int dataNatureInteger) {
		this.dataNatureInteger = dataNatureInteger;
	}
	
	public SshReference clone() {
		SshReference result = new SshReference();
		result.setHost(this.getHost());
		result.setPort(this.getPort());
		result.setDirectory(this.getDirectory());
		result.setSubDirectory(this.getSubDirectory());
		result.setFileName(this.getFileName());
		result.setDataNature(this.getDataNature());
		result.setCharset(this.getCharset());
		return result;
	}

}
