package net.sourceforge.javautil.common.io.impl;
import java.io.IOException;
import java.net.URL;
import java.util.ArrayList;
import java.util.Iterator;
import java.util.LinkedHashMap;
import java.util.LinkedHashSet;
import java.util.List;
import java.util.Set;
import net.sourceforge.javautil.common.io.IVirtualArtifact;
import net.sourceforge.javautil.common.io.IVirtualDirectory;
import net.sourceforge.javautil.common.io.VirtualDirectoryAbstract;
import net.sourceforge.javautil.common.io.VirtualDirectoryWrapped;
import net.sourceforge.javautil.common.io.IVirtualFile;
import net.sourceforge.javautil.common.io.IVirtualPath;
/**
* A linked directory allows any {@link IVirtualDirectory} to act as a sub directory
* of another {@link IVirtualDirectory}.
*
* @author elponderador
* @author $Author: ponderator $
* @version $Id: LinkedDirectory.java 2297 2010-06-16 00:13:14Z ponderator $
*/
public class LinkedDirectory
extends
VirtualDirectoryWrapped
implements
IVirtualDirectory, ILinkedArtifact<IVirtualDirectory> {
protected final IVirtualDirectory owner;
protected final String name;
public LinkedDirectory(IVirtualDirectory owner, IVirtualDirectory delegate) { this(owner, delegate, delegate.getName()); }
public LinkedDirectory(IVirtualDirectory owner, IVirtualDirectory delegate, String name) {
super(delegate);
this.owner = owner;
this.name = name;
}
public IVirtualDirectory getDelegate() { return delegate; }
public IVirtualArtifact getRealOwner () { return owner instanceof LinkedDirectory ? ((LinkedDirectory)owner).getRealOwner() : owner; }
public LinkedDirectory getLinkedRoot () { return owner instanceof LinkedDirectory ? ((LinkedDirectory)owner).getLinkedRoot() : this; }
public IVirtualPath getPath() {
return "".equals(getName()) ? owner.getPath() : owner.getPath().append(getName());
}
public IVirtualArtifact getArtifact(IVirtualPath path) { return wrap( delegate.getArtifact(path) ); }
public IVirtualDirectory createDirectory(String name) { return (IVirtualDirectory) wrap( delegate.createDirectory(name) ); }
public IVirtualFile createFile(String name) { return (IVirtualFile) wrap( delegate.createFile(name) ); }
public IVirtualArtifact getArtifact(String name) { return wrap( delegate.getArtifact(name) ); }
public Iterator<IVirtualArtifact> getArtifacts() {
Set<IVirtualArtifact> artifacts = new LinkedHashSet<IVirtualArtifact>();
Iterator<IVirtualArtifact> das = delegate.getArtifacts();
while (das.hasNext()) {
IVirtualArtifact artifact = das.next();
artifacts.add( wrap( artifact ) );
}
return artifacts.iterator();
}
public String getName() { return name; }
public IVirtualDirectory getOwner() { return owner; }
public String toString () { return super.toString() + " -> " + delegate.toString(); }
/**
* @param artifact The artifact to wrap
* @return The artifact if it is already an instance of {@link ILinkedArtifact}, otherwise it will wrap {@link IVirtualDirectory}'s
* with {@link LinkedDirectory} and {@link IVirtualFile}'s with {@link LinkedFile}.
*/
protected IVirtualArtifact wrap (IVirtualArtifact artifact) {
if (artifact == null) return null;
if (artifact instanceof ILinkedArtifact && ((ILinkedArtifact)artifact).getOwner() == this) return (IVirtualArtifact) artifact;
return (IVirtualArtifact) ( artifact instanceof IVirtualDirectory ? new LinkedDirectory(this, (IVirtualDirectory) artifact) :
new LinkedFile(this, (IVirtualFile) artifact) );
}
}