/*******************************************************************************
 * Copyright (c) 2008 Sybase, Inc.
 * 
 * All rights reserved. This program and the accompanying materials are made
 * available under the terms of the Eclipse Public License v1.0 which
 * accompanies this distribution, and is available at
 * http://www.eclipse.org/legal/epl-v10.html
 * 
 * Contributors: brianf & mdow - initial API and implementation
 ******************************************************************************/
package org.eclipse.datatools.connectivity.sample.ftp.internal;

import org.apache.commons.net.ftp.FTPClient;
import org.apache.commons.net.ftp.FTPFile;
import org.apache.commons.net.ftp.FTPListParseEngine;
import org.eclipse.core.runtime.IAdaptable;
import org.eclipse.core.runtime.Platform;
import org.eclipse.jface.viewers.ITreeContentProvider;
import org.eclipse.jface.viewers.Viewer;

/**
 * @author mdow and brianf
 */
public class FtpContentProvider implements ITreeContentProvider,
		IAdaptable {

	/**
	 * Constructor
	 */
	public FtpContentProvider() {
	}

	/*
	 * (non-Javadoc)
	 * 
	 * @see org.eclipse.jface.viewers.ITreeContentProvider#getChildren(java.lang.Object)
	 */
	public Object[] getChildren(Object parent) {
		try {
			if (parent instanceof FTPClientObject) {
				FTPClient ftpClient = ((FTPClientObject) parent).getFtpClient();
				if (ftpClient.isConnected()) {
					FTPListParseEngine engine = ftpClient.initiateListParsing();
					FTPFile[] files = engine.getFiles();
					return FTPFileObject.convert(parent, ((FTPClientObject) parent).getProfile(), files);
				}
			} else if (parent instanceof FTPFileObject) {
				FTPFile ftpFile = ((FTPFileObject) parent).getFTPFile();
				FTPClient ftpClient = getFTPClient(parent);
				if (ftpFile.isDirectory() && ftpClient.isConnected()) {
					FTPListParseEngine engine = ftpClient
							.initiateListParsing(getDirectory((FTPFileObject) parent));
					FTPFile[] files = engine.getFiles();
					return FTPFileObject.convert(parent, ((FTPFileObject) parent).getProfile(), files);
				}
			}
		} catch (Exception e) {
			e.printStackTrace();
			FTPClient ftpClient = getFTPClient(parent);
			try {
				if (ftpClient != null)
					ftpClient.disconnect();
			} catch (Exception ex) {
			}
		}
		return new Object[0];
	}

	private String getDirectory(FTPFileObject file) {
		StringBuffer sb = new StringBuffer();
		FTPFileObject fileobj = file;
		Object obj;
		FTPFile ftpFile;
		while (fileobj != null) {
			ftpFile = fileobj.getFTPFile();
			sb.insert(0, ftpFile.getName());
			sb.insert(0, "/");
			obj = getParent(fileobj);
			if (obj instanceof FTPFileObject) {
			    fileobj = (FTPFileObject) obj;
			} else {
			    fileobj = null;
			}
		}
		return sb.toString();
	}

	private FTPClient getFTPClient(Object element) {
		Object obj = element;
		while (obj != null && !(obj instanceof FTPClientObject)) {
			obj = ((FTPFileObject) obj).getParent();
		}
		if (obj != null)
			return ((FTPClientObject) obj).getFtpClient();
		else
			return null;
	}

	/*
	 * (non-Javadoc)
	 * 
	 * @see org.eclipse.jface.viewers.ITreeContentProvider#getParent(java.lang.Object)
	 */
	public Object getParent(Object element) {
		Object parent = null;
		if (element instanceof FTPFileObject) {
			parent = ((FTPFileObject) element).getParent();
		}
		return parent;
	}

	/*
	 * (non-Javadoc)
	 * 
	 * @see org.eclipse.jface.viewers.ITreeContentProvider#hasChildren(java.lang.Object)
	 */
	public boolean hasChildren(Object element) {
	    if (element instanceof FTPClientObject) {
	        return true;
	    } else if (element instanceof FTPFileObject) {
			FTPFile ftpFile = ((FTPFileObject) element).getFTPFile();
			if (ftpFile.isDirectory()) {
			    return true;
			} else {
			    return false;
			}
	    } else {
	        return false;
	    }
	}

	/*
	 * (non-Javadoc)
	 * 
	 * @see org.eclipse.jface.viewers.IStructuredContentProvider#getElements(java.lang.Object)
	 */
	public Object[] getElements(Object inputElement) {
		return getChildren(inputElement);
	}

	/*
	 * (non-Javadoc)
	 * 
	 * @see org.eclipse.jface.viewers.IContentProvider#dispose()
	 */
	public void dispose() {
		// Release any listeners. Other cleanup.
	}

	/*
	 * (non-Javadoc)
	 * 
	 * @see org.eclipse.jface.viewers.IContentProvider#inputChanged(org.eclipse.jface.viewers.Viewer,
	 *      java.lang.Object, java.lang.Object)
	 */
	public void inputChanged(Viewer viewer, Object oldInput, Object newInput) {
		// Register listeners on newInput, remove listeners on oldInput, other
		// initialization.
	}

	/**
	 * @param oldInput
	 * @param newInput
	 */
	public void init(Object oldInput, Object newInput) {
		// Auto-generated method stub
	}

	/*
	 * (non-Javadoc)
	 * 
	 * @see org.eclipse.core.runtime.IAdaptable#getAdapter(java.lang.Class)
	 */
	public Object getAdapter(Class adapter) {
		return Platform.getAdapterManager().getAdapter(this, adapter);
	}
}