/*
* Copyright (C) 2004 Anthony Smith
*
* 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.
*
* ----------------------------------------------------------------------------
* TITLE $Id$
* ---------------------------------------------------------------------------
*
* --------------------------------------------------------------------------*/
package opendbcopy.util;
import java.io.File;
import java.io.FileNotFoundException;
import java.net.MalformedURLException;
import java.net.URL;
import java.util.ArrayList;
import java.util.Iterator;
import java.util.StringTokenizer;
import opendbcopy.config.APM;
import opendbcopy.config.XMLTags;
import opendbcopy.plugin.model.exception.MissingAttributeException;
import opendbcopy.plugin.model.exception.MissingElementException;
import org.jdom.Element;
/**
* class description
*
* @author Anthony Smith
* @version $Revision$
*/
public final class InputOutputHelper {
/**
* DOCUMENT ME!
*
* @param file may be a single file or directory. If it is a directory, all files and only files within this directory are returned inside the
* filelist element
* @param identifier DOCUMENT ME!
*
* @return DOCUMENT ME!
*
* @throws IllegalArgumentException DOCUMENT ME!
*/
public static Element createFileListElement(File file,
String identifier) {
if (file == null) {
throw new IllegalArgumentException("Missing file or directory");
}
if (file.isDirectory()) {
return createFileListElement(file.listFiles(), identifier);
} else {
Element filelist = new Element(XMLTags.FILELIST);
if (identifier == null) {
filelist.setAttribute(XMLTags.ID, XMLTags.UNKNOWN);
} else {
filelist.setAttribute(XMLTags.ID, identifier);
}
filelist.setAttribute(XMLTags.DIR, file.getParent());
filelist.setAttribute(XMLTags.FILES, file.getName());
return filelist;
}
}
/**
* DOCUMENT ME!
*
* @param file DOCUMENT ME!
*
* @return DOCUMENT ME!
*
* @throws IllegalArgumentException DOCUMENT ME!
*/
public static Element createFileElement(File file) {
if (file == null) {
throw new IllegalArgumentException("Missing file");
}
Element fileElement = new Element(XMLTags.FILE);
fileElement.setAttribute(XMLTags.VALUE, file.getAbsolutePath());
return fileElement;
}
/**
* DOCUMENT ME!
*
* @param file DOCUMENT ME!
*
* @return DOCUMENT ME!
*
* @throws IllegalArgumentException DOCUMENT ME!
*/
public static Element createDirElement(File file) {
if (file == null) {
throw new IllegalArgumentException("Missing directory");
}
Element fileElement = new Element(XMLTags.DIR);
fileElement.setAttribute(XMLTags.VALUE, file.getAbsolutePath());
return fileElement;
}
/**
* DOCUMENT ME!
*
* @param files DOCUMENT ME!
* @param identifier DOCUMENT ME!
*
* @return DOCUMENT ME!
*
* @throws IllegalArgumentException DOCUMENT ME!
*/
public static Element createFileListElement(File[] files,
String identifier) {
if ((files == null) || (files.length == 0)) {
throw new IllegalArgumentException("Missing files / directories");
}
Element filelist = new Element(XMLTags.FILELIST);
if (identifier == null) {
filelist.setAttribute(XMLTags.ID, XMLTags.UNKNOWN);
} else {
filelist.setAttribute(XMLTags.ID, identifier);
}
filelist.setAttribute(XMLTags.DIR, files[0].getParent());
filelist.setAttribute(XMLTags.FILES, getFileNameList(files));
return filelist;
}
/**
* DOCUMENT ME!
*
* @param urls DOCUMENT ME!
*
* @return DOCUMENT ME!
*
* @throws IllegalArgumentException DOCUMENT ME!
*/
public static Element createURLListElement(URL[] urls) {
if (urls == null) {
throw new IllegalArgumentException("Missing urls");
}
Element urllist = new Element(XMLTags.URLLIST);
for (int i = 0; i < urls.length; i++) {
URL url = urls[i];
Element urlElement = new Element(XMLTags.URL);
urlElement.setAttribute(XMLTags.VALUE, url.toExternalForm());
urllist.addContent(urlElement);
}
return urllist;
}
/**
* Retrieves files in filelist and checks if those exist! ArrayList returned contains files
*
* @param filelist DOCUMENT ME!
*
* @return DOCUMENT ME!
*
* @throws MissingAttributeException DOCUMENT ME!
* @throws MissingElementException DOCUMENT ME!
* @throws FileNotFoundException DOCUMENT ME!
* @throws IllegalArgumentException DOCUMENT ME!
*/
public static ArrayList getFileList(Element filelist) throws MissingAttributeException, MissingElementException, FileNotFoundException {
String dir = null;
if (filelist == null) {
throw new IllegalArgumentException("Missing filelist");
}
if (filelist.getName().compareToIgnoreCase(XMLTags.FILELIST) != 0) {
throw new MissingElementException(filelist, XMLTags.FILELIST);
}
if (filelist.getAttributeValue(XMLTags.DIR) == null) {
throw new MissingAttributeException(filelist, XMLTags.DIR);
} else {
dir = filelist.getAttributeValue(XMLTags.DIR);
}
if (filelist.getAttributeValue(XMLTags.FILES) == null) {
throw new MissingAttributeException(filelist, XMLTags.FILES);
}
// ok, required attributes are available
ArrayList files = new ArrayList();
StringTokenizer st = new StringTokenizer(filelist.getAttributeValue(XMLTags.FILES), ",");
while (st.hasMoreElements()) {
files.add(getFile(dir, (String) st.nextElement()));
}
return files;
}
/**
* DOCUMENT ME!
*
* @param urlList DOCUMENT ME!
*
* @return DOCUMENT ME!
*
* @throws MalformedURLException DOCUMENT ME!
* @throws IllegalArgumentException DOCUMENT ME!
*/
public static URL[] getURLList(Element urlList) throws MalformedURLException {
if (urlList == null) {
throw new IllegalArgumentException("Missing urlList");
}
if (urlList.getChildren(XMLTags.URL).size() == 0) {
return null;
}
ArrayList urls = new ArrayList();
Iterator itUrls = urlList.getChildren(XMLTags.URL).iterator();
while (itUrls.hasNext()) {
Element urlElement = (Element) itUrls.next();
urls.add(new URL(urlElement.getAttributeValue(XMLTags.VALUE)));
}
URL[] urlArray = new URL[urls.size()];
return (URL[]) urls.toArray(urlArray);
}
/**
* Given a file or dir element retrieves the File which can be a file or directory. If file does not exist a FileNotFoundException is thrown
*
* @param file DOCUMENT ME!
*
* @return DOCUMENT ME!
*
* @throws MissingAttributeException DOCUMENT ME!
* @throws MissingElementException DOCUMENT ME!
* @throws FileNotFoundException DOCUMENT ME!
*/
public static File getFile(Element file) throws MissingAttributeException, MissingElementException, FileNotFoundException {
if (file == null) {
throw new MissingElementException(new Element(XMLTags.FILE), XMLTags.FILE);
}
if (file.getAttributeValue(XMLTags.VALUE) == null) {
throw new MissingAttributeException(file, XMLTags.VALUE);
}
File realFile = new File(file.getAttributeValue(XMLTags.VALUE));
if (realFile.exists()) {
return realFile;
} else {
throw new FileNotFoundException("File " + realFile.getAbsolutePath() + " does not exist");
}
}
/**
* Returns String array containing absolute path and file names
*
* @param files DOCUMENT ME!
*
* @return DOCUMENT ME!
*
* @throws IllegalArgumentException DOCUMENT ME!
*/
public static String[] getFilePathNames(File[] files) {
if ((files == null) || (files.length == 0)) {
throw new IllegalArgumentException("Missing files");
}
ArrayList fileNames = new ArrayList();
for (int i = 0; i < files.length; i++) {
fileNames.add(files[i].getAbsolutePath());
}
return (String[]) fileNames.toArray();
}
/**
* DOCUMENT ME!
*
* @param file DOCUMENT ME!
*
* @return DOCUMENT ME!
*
* @throws IllegalArgumentException DOCUMENT ME!
*/
public static String getFilePathName(File file) {
if (file == null) {
throw new IllegalArgumentException("Missing file");
}
return file.getAbsolutePath();
}
/**
* returns list of files as string, comma separated. Directories are excluded
*
* @param files DOCUMENT ME!
*
* @return DOCUMENT ME!
*/
private static String getFileNameList(File[] files) {
String list = "";
String listSep = ",";
for (int i = 0; i < files.length; i++) {
if (files[i].isFile()) {
list += (files[i].getName() + listSep);
}
}
// return last listSep
return list.substring(0, list.length() - 1);
}
/**
* DOCUMENT ME!
*
* @param dir DOCUMENT ME!
* @param filename DOCUMENT ME!
*
* @return DOCUMENT ME!
*
* @throws FileNotFoundException DOCUMENT ME!
*/
private static File getFile(String dir,
String filename) throws FileNotFoundException {
File file = new File(dir + APM.FILE_SEP + filename);
if (file.exists()) {
return file;
} else {
throw new FileNotFoundException(file.getAbsolutePath());
}
}
}