/*
* Copyright (C) 2004 The Concord Consortium, Inc.,
* 10 Concord Crossing, Concord, MA 01742
*
* Web Site: http://www.concord.org
* Email: info@concord.org
*
* This library is free software; you can redistribute it and/or
* modify it under the terms of the GNU Lesser General Public
* License as published by the Free Software Foundation; either
* version 2.1 of the License, or (at your option) any later version.
*
* This library 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
* Lesser General Public License for more details.
*
* You should have received a copy of the GNU Lesser General Public
* License along with this library; if not, write to the Free Software
* Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
*
* END LICENSE */
package org.concord.swing;
import java.io.File;
import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.FileOutputStream;
import java.io.IOException;
import java.net.MalformedURLException;
import java.net.URI;
import java.net.URISyntaxException;
import java.net.URL;
import java.util.List;
import java.util.Properties;
import java.util.StringTokenizer;
import java.util.TreeMap;
import java.util.Vector;
public class AbstractFile
extends File
{
public static final String FOLDER_EXT = ".folder";
public static final String JAR_EXT = ".jar";
public static final String ZIP_EXT = ".zip";
protected AbstractFileFinder abstractFileFinder = new AbstractFileFinder();
protected URL abstractURL;
protected TreeMap directoryMap;
protected AbstractFile abstractFileParent;
public static File createFile(File parent, String name, URI uri)
{
return new AbstractFile(parent, name, uri);
}
public static File createFile(File parent, String name)
{
if (parent instanceof AbstractFile)
return new AbstractFile((AbstractFile) parent, name);
return null;
}
protected static String getRootName(URI uri)
{
String schemePart = uri.getSchemeSpecificPart();
StringTokenizer tokens = new StringTokenizer(schemePart, "/");
int n = tokens.countTokens();
String [] parts = new String[n];
for (int i = 0; i < n; i++)
{
parts[i] = tokens.nextToken();
}
return parts[parts.length - 1];
}
public static File createFile(File folderFile)
{
String uriString = null;
Properties folder = new Properties();
try
{
if (folderFile.getName().endsWith(FOLDER_EXT))
{
folder.load(new FileInputStream(folderFile));
uriString = folder.getProperty("folder.uri", "");
}
else if ((folderFile.getName().endsWith(JAR_EXT)) || (folderFile.getName().endsWith(ZIP_EXT)))
{
uriString = folderFile.toURL().toString();
uriString = "jar:" + uriString + "!/";
}
if (uriString != null)
{
uriString = uriString.replace(' ', '+');
URI uri = new URI(uriString);
File filePath = new File(getRootName(uri));
return new AbstractFile(folderFile.getParentFile(), filePath.getName(), new URI(uriString));
}
}
catch (FileNotFoundException e)
{
// TODO Auto-generated catch block
e.printStackTrace();
}
catch (IOException e)
{
// TODO Auto-generated catch block
e.printStackTrace();
}
catch (URISyntaxException e)
{
// TODO Auto-generated catch block
e.printStackTrace();
}
return null;
}
protected AbstractFile(File parent, String name, URI uri)
{
super(parent, name + FOLDER_EXT);
try
{
abstractURL = new URL(uri.toString().replace('+', ' '));
directoryMap = new TreeMap();
abstractFileFinder.setDirectoryMap(directoryMap);
abstractFileFinder.setAbstractDirectory(abstractURL);
if ((! name.endsWith(".jar!")) && (! name.endsWith(".zip!")))
{
Properties folder = new Properties();
folder.setProperty("folder.uri", uri.toString());
folder.store(new FileOutputStream(this), "");
}
}
catch (MalformedURLException e)
{
// TODO Auto-generated catch block
e.printStackTrace();
}
catch (FileNotFoundException e)
{
// TODO Auto-generated catch block
e.printStackTrace();
}
catch (IOException e)
{
// TODO Auto-generated catch block
e.printStackTrace();
}
}
protected AbstractFile(AbstractFile parent, String name)
{
super(parent, name);
abstractFileParent = (AbstractFile) parent;
directoryMap = abstractFileParent.directoryMap;
try
{
abstractURL = new URL(abstractFileParent.abstractURL, name);
if (name.endsWith("/"))
{
abstractFileFinder.setDirectoryMap(directoryMap);
abstractFileFinder.setAbstractDirectory(abstractURL);
}
}
catch (MalformedURLException e)
{
// TODO Auto-generated catch block
e.printStackTrace();
}
}
public URL getURL()
{
return abstractURL;
}
public File getCanonicalFile()
{
return this;
}
public File [] getAbstractFiles()
{
List list = new Vector();
String dirName = getName() + "/";
String urlString = abstractURL.toString();
if (urlString.endsWith(dirName))
dirName = "";
abstractFileFinder.collectEntries(dirName, list);
File [] abstractFiles = new File[list.size()];
for (int i = 0; i < abstractFiles.length; i++)
{
abstractFiles[i] = new AbstractFile(this, (String) list.get(i));
}
return abstractFiles;
}
public File getAbstractFileParent()
{
return abstractFileParent;
}
public boolean isDirectory()
{
return abstractFileFinder.getAbstractDirectory() != null;
}
public TreeMap getDirectoryMap()
{
return directoryMap;
}
public void setDirectoryMap(TreeMap map)
{
directoryMap = map;
}
public boolean exists()
{
return abstractURL != null;
}
public String getName()
{
String name = super.getName();
if (name.endsWith(FOLDER_EXT))
{
name = name.substring(0, name.length() - FOLDER_EXT.length());
}
return name;
}
}