package net.sourceforge.javautil.web.server.application.impl;
import java.io.File;
import java.net.URL;
import java.util.ArrayList;
import java.util.Iterator;
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.VirtualArtifactNotFoundException;
import net.sourceforge.javautil.common.io.IVirtualDirectory;
import net.sourceforge.javautil.common.io.IVirtualPath;
import net.sourceforge.javautil.common.io.impl.Directory;
import net.sourceforge.javautil.common.io.impl.DirectoryRoot;
import net.sourceforge.javautil.common.io.impl.DirectoryFileLinked;
import net.sourceforge.javautil.common.io.impl.ILinkedArtifact;
import net.sourceforge.javautil.common.io.impl.LinkedDirectory;
import net.sourceforge.javautil.common.io.impl.LinkedFile;
import net.sourceforge.javautil.common.io.impl.SimplePath;
import net.sourceforge.javautil.common.io.impl.ISystemArtifact;
import net.sourceforge.javautil.common.io.impl.SystemFile;
import net.sourceforge.javautil.web.server.application.IWebApplicationResourceResolver;
/**
* A resolver that utilizes a {@link IVirtualDirectory} to locate
* resources.
*
* @author elponderador
* @author $Author: ponderator $
* @version $Id: VirtualDirectoryResolver.java 2298 2010-06-16 00:20:18Z ponderator $
*/
public class VirtualDirectoryResolver implements IWebApplicationResourceResolver {
protected final IVirtualDirectory directory;
protected IVirtualPath path;
public VirtualDirectoryResolver(IVirtualDirectory directory) {
this.directory = directory;
this.path = directory.getPath();
}
public File getFile(String path) {
ISystemArtifact artifact = directory.getArtifact(ISystemArtifact.class, new SimplePath(path));
if (artifact != null) {
return artifact.getRealArtifact();
} else {
return null;
}
}
public URL getResource(String path) {
try {
return directory.getArtifact(new SimplePath(path)).getURL();
} catch (VirtualArtifactNotFoundException e) {
return null;
}
}
public List<String> getResourcePaths(String path) {
Set<String> set = new LinkedHashSet<String>();
try {
IVirtualArtifact artifact = directory.getArtifact(new SimplePath(path));
if (artifact instanceof IVirtualDirectory) {
Iterator<IVirtualArtifact> subs = ((IVirtualDirectory)artifact).getArtifacts();
while (subs.hasNext()) {
IVirtualArtifact sub = subs.next();
String subp = this.path.getRelativePath( sub.getPath() ).toString("/");
if (sub instanceof IVirtualDirectory) {
if (!subp.endsWith("/")) subp += "/";
}
add(set, subp);
}
}
} catch (VirtualArtifactNotFoundException e) {}
return new ArrayList<String>(set);
}
/**
* This will make sure the path starts with a /
*
* @param set the set to add the value to
* @param value The value to validate before adding
*/
protected void add (Set set, String value) {
set.add( (value.startsWith("/") ? value : "/" + value) );
}
}