/*
* @(#)XInputDirectoryImpl.java - implementation for ftp access
*
* Copyright (c) 2004-2006 by roehrist, All Rights Reserved.
*
* This file is part of ProjectX, a free Java based demux utility.
* By the authors, ProjectX is intended for educational purposes only,
* as a non-commercial test project.
*
*
* This program is free software; you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
* the Free Software Foundation; either version 2 of the License, or
* (at your option) any later version.
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
*
*/
package net.sourceforge.dvb.projectx.xinput.ftp;
import net.sourceforge.dvb.projectx.xinput.DirType;
import net.sourceforge.dvb.projectx.xinput.XInputDirectoryIF;
import net.sourceforge.dvb.projectx.xinput.XInputFile;
import java.net.URL;
import java.util.ArrayList;
import net.sourceforge.dvb.projectx.common.Common;
import net.sourceforge.dvb.projectx.common.Keys;
public class XInputDirectoryImpl implements XInputDirectoryIF {
private DirType dirType = null;
private FtpVO ftpVO = null;
private FtpServer ftpServer = null;
/**
* Mustn't be used
*
* @throws UnsupportedOperationException
* Because it mustn't be used!
*/
private XInputDirectoryImpl() {
throw new UnsupportedOperationException("Usage is not allowed!");
}
/**
* Create a XInputDirectory of type DirType.FTP_DIR.
*
* @param aFtpVO
* Directory data to use
*/
public XInputDirectoryImpl(FtpVO aFtpVO) {
ftpVO = aFtpVO;
ftpServer = new FtpServer(ftpVO);
dirType = DirType.FTP_DIR;
}
/**
* Create a XInputDirectory of type DirType.FILE_DIR.
*
* @param aFileIdentifier
* Directory name
* @throws IllegalArgumentException
* If aFile is not a directory
*/
public XInputDirectoryImpl(String aFileIdentifier) {
if (aFileIdentifier.startsWith("ftp://")) {
int posColon = aFileIdentifier.indexOf(':', 6);
int posAt = aFileIdentifier.indexOf('@', posColon);
int posSlash = aFileIdentifier.indexOf('/', posAt);
if (posAt == -1 || posColon == -1 || posSlash == -1)
{
throw new IllegalArgumentException("aFileIdentifier is a malformed ftp URL!");
}
String user = aFileIdentifier.substring(6, posColon);
String password = aFileIdentifier.substring(posColon + 1, posAt);
String server = aFileIdentifier.substring(posAt + 1, posSlash);
String directory = aFileIdentifier.substring(posSlash);
String port = null;
int posColon2 = server.indexOf(':');
if (posColon2 != -1)
{
server = server.substring(0, posColon2);
port = server.substring(posColon2 + 1);
}
ftpVO = new FtpVO(server, user, password, directory, port, null);
ftpServer = new FtpServer(ftpVO);
dirType = DirType.FTP_DIR;
if (!test()) {
ftpVO = null;
ftpServer = null;
dirType = null;
throw new IllegalArgumentException(aFileIdentifier + " is not a correct ftp URL!");
}
} else {
throw new IllegalArgumentException(aFileIdentifier + " is not a correct ftp URL!");
}
}
/**
* Create a XInputDirectory of type DirType.FILE_DIR.
*
* @param aFileIdentifier
* Directory URL
* @throws IllegalArgumentException
* If URL is not a directory
*/
public XInputDirectoryImpl(URL url) {
if (url.getProtocol().compareTo("ftp") != -1) {
/**
* JDK122 cannot parse user + pw, but returns it in getHost()
*/
String _link = url.toString();
String _host = url.getHost();
int j = _link.indexOf(_host);
if (j > 6)
_host = _link.substring(6, j) + _host;
String server = _host;
String user = null;
String password = null;
String directory = null;
String port = null;
int i = _host.indexOf("@");
if (i != -1)
{
server = _host.substring(i + 1);
user = _host.substring(0, i);
i = user.indexOf(":");
if (i != -1)
{
password = user.substring(i + 1);
user = user.substring(0, i);
}
}
if (user == null && password == null)
{
user = "anonymous";
password = "";
}
int _port = url.getPort();
port = _port != -1 ? String.valueOf(_port) : null;
String _file = url.getFile();
i = _file.lastIndexOf("/");
directory = _file.substring(0, i);
ftpVO = new FtpVO(server, user, password, directory, port, null);
ftpServer = new FtpServer(ftpVO);
dirType = DirType.FTP_DIR;
if (!test()) {
ftpVO = null;
ftpServer = null;
dirType = null;
throw new IllegalArgumentException(url + " is not a correct ftp URL!");
}
} else {
throw new IllegalArgumentException(url + " is not a correct ftp URL!");
}
}
/**
* Get String representation of the object.
*
* @return String representation of the object
*/
public String toString() {
String s = null;
s = "ftp://" + ftpVO.getUser() + ":" + ftpVO.getPassword() + "@" + ftpVO.getServer() + ftpVO.getPort(":") + ftpVO.getDirectory();
return s;
}
/**
* Get path of directory
*
* @return Path of directory
*/
public String getDirectory() {
return ftpVO.getDirectory();
}
/**
* Get password for the ftp server
*
* @return Password for the ftp server
* @throws IllegalStateException
* If file type of object is not DirType.FTP_DIR
*/
public String getPassword() {
return ftpVO.getPassword();
}
/**
* Get name or ip address of the ftp server
*
* @return Name or ip address of the ftp server
* @throws IllegalStateException
* If file type of object is not DirType.FTP_DIR
*/
public String getServer() {
return ftpVO.getServer();
}
/**
* Get name or ip address of the ftp server
*
* @return port of the ftp server
* @throws IllegalStateException
* If file type of object is not DirType.FTP_DIR
*/
public String getPort() {
return ftpVO.getPort();
}
/**
* Get user for the ftp server
*
* @return User for the ftp server
* @throws IllegalStateException
* If file type of object is not DirType.FTP_DIR
*/
public String getUser() {
return ftpVO.getUser();
}
/**
* Get log of communication with ftp server.
*
* @return Log of communication with ftp server
* @throws IllegalStateException
* If file type of object is not DirType.FTP_DIR
*/
public String getLog() {
return ftpServer.getLog();
}
/**
* Get files in the directory.
*
* @return files in the directory
*/
public XInputFile[] getFiles() {
ArrayList list = new ArrayList();
ftpServer.open();
XInputFile[] xInputFiles = ftpServer.listFiles();
ftpServer.close();
for (int i = 0, j = xInputFiles.length; i < j; i++)
list.add(xInputFiles[i]);
if (Common.getSettings().getBooleanProperty(Keys.KEY_InputDirectoriesDepth))
getDirectories(ftpVO, list); // depth 1
xInputFiles = new XInputFile[list.size()];
for (int i = 0, j = xInputFiles.length; i < j; i++) {
xInputFiles[i] = (XInputFile) list.get(i);
}
return xInputFiles;
}
/**
*
*/
private void getDirectories(FtpVO aFtpVO, ArrayList list)
{
FtpServer server = new FtpServer(aFtpVO);
server.open();
FtpVO[] xFtpVO = server.listDirectories();
server.close();
XInputFile[] xInputFiles;
for (int i = 0; i < xFtpVO.length; i++)
{
server = new FtpServer(xFtpVO[i]);
server.open();
xInputFiles = server.listFiles();
server.close();
for (int j = 0; j < xInputFiles.length; j++)
list.add(xInputFiles[j]);
getDirectories(xFtpVO[i], list); // depth 2
}
}
/**
* Test if directory data is valid.
*
* @return Test successful or not
*/
public boolean test() {
return ftpServer.test();
}
/**
* Get result message after test().
*
* @return result message after test()
*/
public String getTestMsg() {
return ftpServer.getTestMsg();
}
/**
* @return Type of XInputDirectory
*/
public DirType getDirType() {
return dirType;
}
}